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

当包装一个简单的代码时,这会产生相当多的重复代码std::vector<T> 或一个 QList<T> 带有一般添加,删除和多选项功能的模型。

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

例子:我想包裹 vector<ObjectA>vector<ObjectB> 变成一个模型。代码为 insertRows, deleteRows, columnCount ETC。总是一样的,我想巩固这一点(通过一些元编程,甚至可以与 tupledata).

有帮助吗?

解决方案

您必须在两个单独的类中执行此操作,因为 Qt 对 c++ 的扩展(信号、槽等)不能很好地与模板配合使用。其理由和解决方法可以在以下位置找到: 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. ...

};

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>() 作为您的数据存储容器,这样您就可以实现单个模型子类化 QAbstractListModel.

您必须考虑的事情是,如果您的数据存储容器可以使数据呈现变得通用,那么您可以做的事情就会受到限制,因为 data() 函数将为您提供元素必须返回的视图 QVariant 而且它的构建能力是有限的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top