qt - QAbstractListModel和QList适配器

标签 qt qabstractitemmodel qabstractlistmodel

我的应用程序存储了一些继承自该对象的类型的对象QAbstractListModel对象。

包装一个简单的包时,这会生成很多重复的代码
std::vector<T>QList<T>放入具有一般添加项的模型中,
删除和多选功能。

是应该使用QAbstractListModel的方式还是在那里
某些适配器类可以删除重复的代码(至少对于
容器是Qt的一部分)?

示例:我想将vector<ObjectA>vector<ObjectB>包装到模型中。 insertRowsdeleteRowscolumnCount等的代码始终是相同的,我想对此加以合并(使用一些甚至可以用于tupledata的元编程)。

最佳答案

您必须在两个单独的类中执行此操作,因为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/

相关文章:

c++ - 拖动释放后如何适本地获得 QGraphicsRectItem 的位置?

c++ - QWidget/QWindow 标题栏 : custom look, 原生感觉(类似Chrome)

qt - Qt模型/ View 和QTableView的基本概念

c++ - 使用模型作为 QMenu 的源

c++ - 如何使用 QScopedPointer<QApplication>

windows - 如何在 Windows 上开始 Qt 开发,但目标是 Maemo 5?

python - QTreeView 请求无效行的索引

qt - 我可以在 QThread 中使用与 QAbstractTableModel 数据的交互吗?

使用未定义角色调用 Qt QAbstractItemModel 函数 data()

python - 使用文件监视通过 PyQt4 刷新日志查看器