我是Qt编程的新手,我想用Qt TableView显示数据,我从XML文件中获取数据。
我找不到任何关于如何创建自定义模型然后将其绑定到TableView的有用教程。
请提供一些帮助,或者如果有人有一些好的例子请分享。
由于
答案 0 :(得分: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();
}
你知道,它真的很容易使用。但是,缺点是您必须通过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用它来指定要读取的模型数据或
写。
答案 1 :(得分:1)
这应该可以让你开始,http://doc.qt.io/qt-5/modelview.html
答案 2 :(得分:1)
您是否想要自定义模型,因为您希望它能够从不断变化的XML源中主动读取和更新?
如果没有,您可以使用任何正常的QTableView教程和QStandardItemModel。自己解析XML文件并创建QStandardItem个对象,将它们添加到模型中。
自定义模型是一种将XML文件的读取直接集成到模型本身的方法,而不是基于项目的方法,您可以在外部填充它。