我写了两个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*
)。
问题是,构造函数和析构函数是相同的,rowCount
和clear
(它们完成完全相同的事情)也是如此。唯一的区别在于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()
未被调用(我放入调试语句,它们永远不会被执行)。
我在这里做错了什么?
答案 0 :(得分:-1)
编辑:解决方案不是我在这里发布的。事实上,它完全没了。问题出在rowCount
函数和私有m_items
QVector
中。
rowCount
,如果不存在,则调用超类方法,不使用派生类中的私有m_items
元素,但它使用超类中的元素,它是虚拟的,总是返回0的大小,因此永远不会调用data
。