gpt4 book ai didi

qt - QAbstractListModel和QList适配器

转载 作者:行者123 更新时间:2023-12-04 18:13:09 24 4
gpt4 key购买 nike

我的应用程序存储了一些继承自该对象的类型的对象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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com