Qt - 减少两个QAbstractListModel子类之间的重复

时间:2013-07-28 08:26:44

标签: c++ qt model-view-controller multiple-inheritance

我写了两个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*)。

问题是,构造函数和析构函数是相同的,rowCountclear(它们完成完全相同的事情)也是如此。唯一的区别在于datam_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()未被调用(我放入调试语句,它们永远不会被执行)。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:-1)

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

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