我的一个项目,用Qt编写,我有一个QWidget Widget
,应显示MyTreeWidget
(继承自QTreeWidget
)或MyTableWidget
(继承自QTableWidget
)
Widget
不应该知道与谁交谈。因此它必须(??)拥有由My(Tree|Table)Widget
MyTreeWidget
和MyTableWidget
分享了大量代码,我不想复制粘贴此代码。所以我想让它们继承自MyGenericView
继承自QAbstractItemView
#include <QAbstractItemView>
#include <QTreeWidget>
#include <QTableWidget>
class MyGenericView : public QAbstractItemView
{
Q_OBJECT
public:
MyGenericView();
};
class MyTreeWidget : virtual public QTreeWidget,
virtual public MyGenericView
{
Q_OBJECT
public:
explicit MyTreeWidget(QWidget *parent = 0);
};
class MyTableWidget : public MyGenericView, public QTableWidget { ... };
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0) :
QWidget(parent)
{
m_genericView = new MyTreeWidget();
}
private:
MyGenericView *m_genericView;
};
erreur : invalid new-expression of abstract class type 'MyTableWidget'
m_genericView = new MyTableWidget();
note: because the following virtual functions are pure within 'MyTableWidget':
class MyTableWidget : public QTableWidget, public MyGenericView
chcp 1252
MyTreeWidget也一样。
那你怎么纠正这个?
答案 0 :(得分:1)
你似乎想要做的事情是不明智的。您从中获得的两种视图都是便利视图。他们无可救药地将视图与模型混为一谈。如果需求很简单且方便就是你之后的事情,可以使用它们,但在你的情况下,我认为大部分共享代码都与模型方面有关,而与视图无关。只需在库存QStandardItemModel
或库存QTableView
上显示QTreeView
,并拥有一个使用QStandardItemModel
来构建您的{{1}}的类,您就可以实现您的目标。数据结构。
有关如何执行此操作的详细信息,如果结果是正确的,请参阅this answer。
答案 1 :(得分:-1)
编辑:正如下面评论中所建议的那样,这个答案是基于错误的假设。请看下面更好的答案。
首先,您有钻石继承问题。您的错误是因为MyTableWidget具有未定义的纯虚拟成员函数。
但是坦率地说,我不确定你为什么要在这里使用多重继承。如果要节省代码重复,为什么MyTreeWidget和MyTableWidget不能通过合成而不是继承来共享行为元素?这绝对是a-a vs has-a的情况吗?如果它的代码特定于共享但不以任何方式与QTableWidget / QTreeWidget方法重叠的小部件,那么只需编写一个将填充Tree或Table小部件的适配器类。