簡體   English   中英

將模型綁定到Qt TableView

[英]Binding model to Qt TableView

我是Qt編程的新手,我想用Qt TableView顯示數據,我從XML文件中獲取。

我找不到有關如何創建自定義模型然后將其綁定到TableView的任何有用的教程。

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

謝謝

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使用它來指定要讀取或寫入的模型數據。

這應該可以開始了, http://doc.qt.io/qt-5/modelview.html

您是否想要自定義模型,因為您希望它能夠從不斷變化的XML源中主動讀取和更新?

如果沒有,您可以簡單地使用任何正常的QTableView教程和QStandardItemModel 自己解析XML文件並創建QStandardItem對象,將它們添加到模型中。

自定義模型是一種將XML文件的讀取直接集成到模型本身的方法,而不是基於項目的方法,您可以在外部填充它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM