QAbstractListModel和QList适配器

pmr*_*pmr 5 qt qabstractitemmodel qabstractlistmodel

我的应用程序存储了一些从QAbstractListModel对象继承的类型的 对象.

当使用常规添加,删除和多选功能包装简单std::vector<T>QList<T>模型时,这会生成大量重复的代码 .

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

示例:我想换行vector<ObjectA>vector<ObjectB>进入模型.对于代码insertRows,deleteRows,columnCount等总是将是相同的,我想巩固(一点点元编程,可以即使对于工作tupledata).

Dav*_*eer 6

你必须在两个单独的类中执行此操作,因为Qt对c ++(SIGNALS,SLOTS等)的扩展不能很好地与模板一起使用.有关这方面的基本原理和解决方法,请访问:http://doc.qt.digia.com/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. ...

};
Run Code Online (Sandbox Code Playgroud)

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_;
};
Run Code Online (Sandbox Code Playgroud)

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. ...
};
Run Code Online (Sandbox Code Playgroud)