0

我正在尝试在 C++ 和 QT 中使用模型/视图架构,需要了解如何将 QTableView 中的一个单元格划分为更多行或更多列并为它们使用不同的小部件以及如何仅显示一些列从模型

我想每行保持这个结构:

- int
- MyStruct - int
           - QString
- 2ndStruct - double
            - double
- QString

重要的是:

  1. 在 2D 表格中显示(例如 QTableView) - 没有树。我可以更改模型,但我需要在表格中显示它。
  2. 仅显示模型中的一些数据。
  3. 根据行索引 - 从父项中选择一些列,并从子项(结构)中选择一些数据。

我有几个问题:

  1. 如何在一个 QTableView 单元格中实现更多的行/列,并为它们使用不同的类型和不同的 QWidget?
  2. 如何只选择一些我想在视图中显示的数据?当我在模型中重新实现“columnCount”时,我不能把常量放在那里,因为我想在不同的视图中使用这个模型。我阅读了教程,发现没有必要重新实现视图类。如何只选择我想显示的数据?
  3. 在这种情况下使用 3D 模型(QStandardItemModel 和 QStandardItems)还是 2D 模型(QAbstractTableModel)更好?
4

1 回答 1

2

我建议针对不同的需求使用单独的模型,但让它们对相同的数据进行操作。

即模型类只是实际数据的接口,它们不需要包含数据。

假设您有一个名为RowDatadata 的结构/类,其中包含您描述的数据。

然后所有行都可以是此类对象的列表或向量,例如QVector<RowData>

然后,每个模型都可以对相同的引用或指向此类容器的指针进行操作

class AllDataInSeparateColumnsModel : public QAbstractTableModel
{
public:
    AllDataInSeparateColumnsModel(QVector<RowData> &data, QObject *parent = nullptr)
        : QAbstractTableModel(parent), m_data(data)
    {}

    int rowCount() const { return m_data.count(); }
    int columnCount() const { return 6; }

private:
    QVector<RowData> &m_data;
};

然后,此模型的data()方法可以将第 0 列映射到第一个 int,第 1 列映射到 MyStruct 中的 int,第 2 列映射到 MyStruct 中的 QString,依此类推。

如果模型每列需要多个值,则它可以定义自己的附加角色。然后,视图需要一个匹配的委托,该委托可以根据需要检索该附加数据(标准委托仅显示 的字符串值Qt::DisplayRole

于 2016-09-18T16:21:42.730 回答