【发布时间】:2013-07-28 08:26:44
【问题描述】:
我写了两个 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在您的派生模型类中意味着data是纯虚拟的并且没有实现。如果没有实现,你怎么知道这个函数永远不会被调用? -
不幸的是,不将方法设为纯虚拟不会改变任何事情。
-
它怎么能不改变什么?创建纯虚方法的实现会导致编译错误。如果您在编译原始代码时没有看到错误,则说明它有问题。
-
子类中的
data()仅在我直接从QAbstractListModel子类化时才被调用,而不是由任何其他子类调用(我尝试了一个虚拟的data()函数,它只会在超类而不是纯虚方法)。
标签: c++ qt model-view-controller multiple-inheritance