pmr*_*pmr 5 qt qabstractitemmodel qabstractlistmodel
我的应用程序存储了一些从QAbstractListModel对象继承的类型的
对象.
当使用常规添加,删除和多选功能包装简单std::vector<T>或QList<T>模型时,这会生成大量重复的代码
.
是QAbstractListModel应该使用的方式还是有一些适配器类可以删除重复的代码(至少对于属于Qt的容器)?
示例:我想换行vector<ObjectA>并vector<ObjectB>进入模型.对于代码insertRows,deleteRows,columnCount等总是将是相同的,我想巩固(一点点元编程,可以即使对于工作tuple和data).
你必须在两个单独的类中执行此操作,因为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)