在Qt編程中我非常新,我想用從Qt獲取的Qt TableView顯示數據。綁定模型到Qt TableView
我找不到有關如何創建自定義模型,然後將其綁定到TableView的任何有用的教程。
請提供一些幫助,如果有人有一些很好的例子,請分享。
感謝
在Qt編程中我非常新,我想用從Qt獲取的Qt TableView顯示數據。綁定模型到Qt TableView
我找不到有關如何創建自定義模型,然後將其綁定到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文件的讀取直接集成到模型本身的方法,而不是基於項目的方法,您可以在外部對其進行填充。