【问题标题】:Qt - reduce duplication between two QAbstractListModel subclassesQt - 减少两个 QAbstractListModel 子类之间的重复
【发布时间】: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*)。

问题是,构造函数和析构函数是一样的,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() 没有被调用(我放入了调试语句,它们从未被执行)。

我在这里做错了什么?

【问题讨论】:

  • = 0 在您的派生模型类中意味着 data 是纯虚拟的并且没有实现。如果没有实现,你怎么知道这个函数永远不会被调用?
  • 不幸的是,不将方法设为纯虚拟不会改变任何事情。
  • 它怎么能不改变什么?创建纯虚方法的实现会导致编译错误。如果您在编译原始代码时没有看到错误,则说明它有问题。
  • 子类中的 data() 仅在我直接从 QAbstractListModel 子类化时才被调用,而不是由任何其他子类调用(我尝试了一个虚拟的 data() 函数,它只会在超类而不是纯虚方法)。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多