我的应用程序存储了一些继承自该对象的类型的对象QAbstractListModel
对象。
包装一个简单的包时,这会生成很多重复的代码
将std::vector<T>
或QList<T>
放入具有一般添加项的模型中,
删除和多选功能。
是应该使用QAbstractListModel
的方式还是在那里
某些适配器类可以删除重复的代码(至少对于
容器是Qt的一部分)?
示例:我想将vector<ObjectA>
和vector<ObjectB>
包装到模型中。 insertRows
,deleteRows
,columnCount
等的代码始终是相同的,我想对此加以合并(使用一些甚至可以用于tuple
和data
的元编程)。
最佳答案
您必须在两个单独的类中执行此操作,因为Qt对c++的扩展(信号,插槽等)在模板中不能很好地发挥作用。可以在以下位置找到其基本原理和解决方法:https://doc.qt.io/archives/qq/qq15-academic.html
这是解决方案的粗略概述。 (这是基于我们在应用程序中使用的代码,并且运行良好。)
1.执行Qt的抽象列表类
class FooListModelQt : public QAbstractTableModel {
Q_OBJECT
public:
// Non-template methods, signals, slots, etc. can be used here. For example...
QSet<int> SelectedRows() const;
// ... etc. ...
signals:
void SelectionChanged();
// ... etc. ...
protected:
explicit FooListModelQt(QObject *parent = NULL);
virtual ~FooListModelQt() = 0;
// ... etc. ...
};
2.做模板工作的抽象类
template <typename T>
class FooListModel : public FooListModelQt {
public:
const T* at(int index) const { return items_.at(index); }
int count() const { return items_.count(); }
void Append(T *item);
// ... etc. ...
protected:
explicit FooListModel(QObject *parent = NULL);
virtual ~FooListModel();
private:
QList<T*> items_;
};
3.实际列表类
class BarListModel : public FooListModel<Bar> {
Q_OBJECT
public:
explicit BarListModel(QObject *parent = NULL);
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
// ... etc. ...
};
关于qt - QAbstractListModel和QList适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8895458/