QAbstractListModel和QList适配器



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

当包装一个简单的CCD_ 2或CCD_,删除和多选功能。

QAbstractListModel应该是这样使用的吗一些适配器类,可以删除重复的代码(至少对于作为Qt一部分的容器)?

示例:我想将vector<ObjectA>vector<ObjectB>封装到一个模型中。insertRowsdeleteRowscolumnCount等的代码总是相同的,我想巩固这一点(使用一些元编程,甚至可以用于tupledata)。

您必须在两个独立的类中执行此操作,因为Qt对c++的扩展(SIGNALS、SLOTS等)不能很好地使用模板。其基本原理和解决方法可在以下网站找到: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. ...
};

通常我会直接实现从QAbstractItemModel继承的自己的模型,并为data()等表示函数提供自己的实现,以处理我给模型的数据存储容器。

如果您使用QList<T>std::vector<T>有代码重复,那么我建议您通过以下任一操作将其中一个转换为另一个:

QList<T> list = QList::fromVector(QVector::fromStdVector(vector));

或者相反。

std::vector<T> vector = qlist.toVector().toStdVector();

我会选择后者,但你可以任意选择。

根据您的其他意见,您可以采取两种行动:

路径1:

执行objectAobjectB如下:

class objectA : baseObject

class objectB : baseObject

其中baseObject为:

struct baseObject
{
    virtual std::string toString() = 0;
};

转换成字符串可能比其他任何东西都容易。

路径2基本上将涉及使用std::vector<boost::any>()作为数据存储容器的模型内部,通过这种方式可以实现std::vector<T>0的单个模型子类。

你必须考虑的是,如果你的数据存储容器你可能会使数据表示变得通用,那么你所能做的是有限的,因为为你的视图提供元素的data()函数必须返回QVariant,并且它仅限于你可以用什么来构造它。

相关内容

  • 没有找到相关文章

最新更新