[SOLVED] Memory access error with QSqlTableModel subclass



  • Solution: The problem was apparently a dependency issue caused by incorrect build. Re-building everything solved the issue. It seems that making full rebuild once in a while might be a good habit.

    Hi,
    I have a QSqlTableModel subclass that has two QList and one QString as private members. This is custom part of the model:

    @class OCMSqlTableModel : public QSqlTableModel
    {
    Q_OBJECT
    public:
    explicit OCMSqlTableModel(QObject *parent = 0) : QSqlTableModel(QObject) { }

    void setMIMEType(const QString &table);
    void setDropSourceMap(const QList<int> &map)
    void disableEditingForColumn(int column);
    

    private:
    QString m_sMIMEType;
    QList<int> m_DropSourceTargetMap;
    QList<int> m_DisabledColumns;

    public:
    virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
    //rest of reimplemented stuff
    };

    void OCMSqlTableModel::disableEditingForColumn(int column);
    {
    m_DropSourceTargetMap.append(column);
    }

    Qt::ItemFlags OCMSqlTableModel::flags(const QModelIndex &index) const
    {
    Qt::ItemFlags flags = QSqlTableModel::flags(index) | Qt::ItemIsDropEnabled;

    if(index.isValid())
    {
        if(m_DisabledColumns.contains(index.column()))
            flags ^= Qt::ItemIsEditable;
    
        return flags | Qt::ItemIsDragEnabled;
    }
    
    return flags;
    

    }@

    The problem is that like this it crashes in the flags() in the nested if checking whether the column is disabled (contained in the QList<int> private member).

    In debugging I found something super-odd. When this function is called, only the first QList is actually initialized while the second is inaccessible. When I swap them, everything works fine but the other QList is now inaccessible.

    What the heck is going on? Can someone please explain it? Or is it a bug?

    Thx.


  • Lifetime Qt Champion

    Hi,

    Probably not related but

    @
    explicit OCMSqlTableModel(QObject *parent = 0) : QSqlTableModel(QObject) { }
    @

    Should rather be

    @
    explicit OCMSqlTableModel(QObject *parent = 0) : QSqlTableModel(parent) { }
    @

    Or was it a typo ?

    Anyway, what combo of Qt/OS/compiler are you using ?



  • Yeah, it was a typo. :-)

    I am using Qt 5.3.2 with Ming 4.8.2 on Windows 8 64-bit.



  • Looks like a dependency/linking problem, make sure to recompile the entire project.



  • Ha, indeed you were right mmoll! How odd. Recompiling the whole thing fixed the issue and all members are properly initialized now.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.