【问题标题】:Binding model to Qt TableView将模型绑定到 Qt TableView
【发布时间】:2012-08-10 17:13:17
【问题描述】:

我是 Qt 编程的新手,我想使用从 XML 文件中获取的 Qt TableView 显示数据。

我找不到任何关于如何创建自定义模型并将其绑定到 TableView 的有用教程。

请提供一些帮助,或者如果有人有一些好的例子,请分享。

谢谢

【问题讨论】:

    标签: c++ qt qtgui


    【解决方案1】:

    Qt 中的模型视图方法非常通用。所有模型都继承自QAbstractItemModel。使用这个类,您可以创建相当复杂的数据布局(列表、树、表格等),但相比之下,实现的工作量也相当大。

    可以使用的类是QStandardItemModel。您可以轻松地创建表模型并添加项目,它们是QStandardItem 的实例。您可以使用以下代码开始:

    #include <QtGui>
    
    QStandardItemModel* createModel(QObject* parent)
    {
        const int numRows = 10;
        const int numColumns = 10;
    
        QStandardItemModel* model = new QStandardItemModel(numRows, numColumns);
        for (int row = 0; row < numRows; ++row)
        {
            for (int column = 0; column < numColumns; ++column)
            {
                QString text = QString('A' + row) + QString::number(column + 1);
                QStandardItem* item = new QStandardItem(text);
                model->setItem(row, column, item);
            }
         }
    
        return model;
    }
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QMainWindow window;
        QTableView* view = new QTableView;
        view->setModel(createModel(view));
        window.setCentralWidget(view);
        window.show();
    
        return app.exec();
    }
    

    你看,它真的很容易使用。但是,缺点是您必须通过QStandardItem 提供数据,这可能会浪费内存。例如,假设您有几个 100MB 的数据,您希望在视图中显示这些数据。由于您已经将数据存储在某处,因此最好对其进行调整,使其可以在视图中使用,而不是为每个单元格创建 QStandardItem

    这就是QAbstractTableModel 发挥作用的地方。以下示例创建一个矩阵 有 250.000 个条目。而不是为每个矩阵元素创建一个QStandardItem, 我们继承QAbstractTableModel并实现三个纯虚方法 numRows()numColumns()data(),返回行数、列数和 要显示的数据。

    #include <QtGui>
    
    class MatrixModel : public QAbstractTableModel
    {
    public:
        MatrixModel(int numRows, int numColumns, double* data)
            : m_numRows(numRows),
              m_numColumns(numColumns),
              m_data(data)
        {
        }
    
        int rowCount(const QModelIndex& parent = QModelIndex()) const
        {
            return m_numRows;
        }
    
        int columnCount(const QModelIndex& parent = QModelIndex()) const
        {
            return m_numColumns;
        }
    
        QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const
        {
            if (!index.isValid() || role != Qt::DisplayRole)
                return QVariant();
    
            // Return the data to which index points.
            return m_data[index.row() * m_numColumns + index.column()];
        }
    
    private:
        int m_numRows;
        int m_numColumns;
        double* m_data;
    };
    
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        // Create a matrix.
        const int numRows = 500;
        const int numColumns = 500;
        double matrix[numRows][numColumns];
        for (int i = 0; i < numRows; ++i)
            for (int j = 0; j < numColumns; ++j)
                matrix[i][j] = i + j;
    
        // Create a model which adapts the data (the matrix) to the view.
        MatrixModel model(numRows, numColumns, (double*)matrix);
    
        QMainWindow window;
        QTableView* view = new QTableView;
        view->setModel(&model);
        window.setCentralWidget(view);
        window.show();
    
        return app.exec();
    }
    

    如您所见,模型不会复制任何数据,而只是充当适配器。如果你需要更多的灵活性,你可以去QAbstractItemModel和事件实现 模型索引的创建,Qt 使用它来指定要读取的模型数据或 写。

    【讨论】:

      【解决方案2】:

      您是否想要一个自定义模型,因为您希望它能够从不断变化的 XML 源中主动读取和更新?

      如果没有,您可以简单地使用任何普通的 QTableView 教程和QStandardItemModel。自己解析 XML 文件并创建 QStandardItem 对象,将它们添加到您的模型中。

      自定义模型是一种将 XML 文件的读取直接集成到模型本身的方法,而不是在外部填充它的基于项的方法。

      【讨论】:

        【解决方案3】:

        这应该可以让你开始,http://doc.qt.io/qt-5/modelview.html

        【讨论】:

          猜你喜欢
          • 2011-01-15
          • 1970-01-01
          • 2023-03-30
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-04
          相关资源
          最近更新 更多