将模型绑定到Qt TableView

use*_*717 15 c++ qt qtgui

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

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

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

谢谢

Meh*_*olf 26

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();
}
Run Code Online (Sandbox Code Playgroud)

你看,它真的很容易使用.但是,缺点是您必须通过a提供数据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();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,该模型不会复制任何数据,只是作为适配器.如果您需要更大的灵活性,可以去QAbstractItemModel事件实现模型索引的创建,Qt使用它来指定要读取或写入的模型数据.