0

我写了两个 QAbstractListModel 子类:

class Model1: public QAbstractListModel {

Q_OBJECT

public:
    int rowCount(const QModelIndex& parent=QModelIndex()) const;
    QVariant data(const QModelIndex& index, int role) const;
    void clear();
private:
    QVector<Obj1*> m_items;

};

class Model2: public QAbstractListModel {

Q_OBJECT

public:
    int rowCount(const QModelIndex& parent=QModelIndex()) const;
    QVariant data(const QModelIndex& index, int role) const;
    void clear();
private:
    QVector<Obj2*> m_items;
};

此外,这两个类有一个插槽 AddObj(),它依赖于使用的指针(Obj1*Obj2*)。

问题是,构造函数和析构函数是一样的,and 也是一样的rowCountclear它们做的事情完全相同)。唯一的区别在data于是什么m_items

在这里减少重复的最佳策略是什么?我尝试了一个基类:

class ModelBase: public QAbstractListModel {

Q_OBJECT

ModelBase(QObject* parent=0);
~ModelBase();

public:
    virtual int rowCount(const QModelIndex& parent=QModelIndex()) const;
    virtual QVariant data(const QModelIndex& index, int role) const = 0;
    virtual void clear();
private:
    QVector<QString*> m_items; // dummy vector

};

然后让其他类从中派生:

class ModelDerived1: public ModelBase {

Q_OBJECT
public:
    ModelDerived1(QObject* parent=0);
    ~ModelDerived1();

    QVariant data(const QModelIndex& index, int role) const = 0;
private:
    QVector<Obj1*> m_items;

};

问题是在这种情况下,data当这个模型附加到视图时,派生类的函数永远不会被调用。

然而,派生类data()没有被调用(我放入了调试语句,它们从未被执行)。

我在这里做错了什么?

4

1 回答 1

-1

编辑:解决方案不是我在这里发布的。事实上,它完全关闭了。问题在于rowCount函数和私有m_items QVector

rowCount,如果不存在,则调用超类方法,该方法m_items使用派生类中的私有元素,但它使用超类中的一个,它是虚拟的,返回的大小始终为 0,因此data永远不会被调用。

于 2013-07-28T10:17:38.383 回答