Qt - 项目模型/视图 - QTableView的一个单元格中的多个数据

时间:2016-03-04 15:35:15

标签: qt qtableview model-view qabstracttablemodel qstandarditem

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

我想每行保留这个结构:

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

重要的是:

  1. 在2D表格中显示(例如QTableView) - 没有树木。我可以改变模型,但我需要在表格中显示它。
  2. 仅显示模型中的部分数据。
  3. 根据行索引 - 从父级中选择一些列,并从子级(结构)中选择一些数据。
  4. 我有几个问题:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

然后,所有行都可以是这些对象的列表或向量,例如, 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的字符串值)

相关问题