[英]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.