ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

QT的视图类(QTableView和QListView)(一)

QT的视图类(QTableView和QListView)(一) QTableView开发工具QT CreatorQTableView用于显示表格形式的数据其中数据呈现为行和列。适合用于多维数据结构比如电子表格、数据表格等。通常与QAbstractTableModel或QStandardItemModel配合使用来提供数据源。1、QTableView和QStandardarItemModel配合使用void MainWindow::StandardItemModelTest() { // 创建一个3*3的model并设置数据 QStandardItemModel *model new QStandardItemModel(3, 3); model-setItem(0, 0, new QStandardItem(Alice)); model-setItem(0, 1, new QStandardItem(25)); model-setItem(0, 2, new QStandardItem(Engineer)); model-setItem(1, 0, new QStandardItem(Bob)); model-setItem(1, 1, new QStandardItem(30)); model-setItem(1, 2, new QStandardItem(Doctor)); model-setItem(2, 0, new QStandardItem(Charlie)); model-setItem(2, 1, new QStandardItem(35)); model-setItem(2, 2, new QStandardItem(Artist)); // 给view设置model ui-tableView-setModel(model); }注意必须要保证model的生命周期足够长如果在该函数函数中仅仅是定义了一个QStandardItemModel model(3, 3) 这样的model函数结束后model的生命周期结束会导致数据不会显示。解决方案第一种使用指针如上面例子。第二种将model作为类的成员变量。从模型中删除特定的数据或删除整行、整列的数据。//下面代码中row表示第几行从0开始,col表示第几列从0开始 // 往已有的model中添加新的数据 // 方式一 model-setItem(row, 0, new QStandardItem(Charlie)); model-setItem(row, 1, new QStandardItem(35)); model-setItem(row, 2, new QStandardItem(Artist)); //方式二 // 在模型末尾添加新的一行 QListQStandardItem* newRow; newRow.append(new QStandardItem(David)); newRow.append(new QStandardItem(28)); newRow.append(new QStandardItem(Teacher)); model-appendRow(newRow); // 方式三 // 在指定的一行添加 QListQStandardItem* newRow2; newRow2.append(new QStandardItem(Eve)); newRow2.append(new QStandardItem(22)); newRow2.append(new QStandardItem(Designer)); model-insertRow(row, newRow2); // 往已有的model中删除数据 //删除行 model-removeRow(row); //删除第row行 model-removeRows(row, 2); // 删除从第row行开始的2行 //删除列 model-removeColumn(col); // 删除某一个单元格 model-setItem(row, col, nullptr);// 如果需要可以强制刷新视图 ui-tableView-reset();2、QTableView和QAbstractTableModel配合使用QAbstractTableModel的目的是将数据与视图比如QTableView分离使得数据的显示和操作逻辑与视图的显示和交互逻辑解耦。需要实现几个必要的虚拟方法rowCount()返回模型中的行数必须实现。columnCount()返回模型中的列数data()返回指定索引的单元格数据headerData()返回表格的列和行头部数据// mymodel.h #ifndef MYMODEL_H #define MYMODEL_H #include QObject #include QAbstractTableModel #include QList struct ModelItem { QString strName; int nSex; int nAge; QString strTel; }; class MyModel: public QAbstractTableModel { public: MyModel(QObject *parent nullptr); int rowCount(const QModelIndex parent QModelIndex()) const override ; int columnCount(const QModelIndex parent QModelIndex()) const override; QVariant data(const QModelIndex index, int role Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QListModelItem modelData; void update(const ModelItem item); void remove(); }; #endif // MYMODEL_H// mymodel.cpp #include mymodel.h MyModel::MyModel(QObject *parent) :QAbstractTableModel (parent) { modelData QListModelItem { {Aria, 0, 22, 110}, {Bab, 1, 21, 120}, {KangKang, 1, 24, 109}, }; } int MyModel::rowCount(const QModelIndex parent) const{ return modelData.count(); } int MyModel::columnCount(const QModelIndex parent) const{ return 4; } QVariant MyModel::data(const QModelIndex index, int role) const{ if (!index.isValid()) return QVariant(); if (role Qt::DisplayRole || role Qt::EditRole) { const int row index.row(); switch (index.column()) { case 0: return modelData.at(row).strName; case 1: return (modelData.at(row).nSex 0) ? woman : man; case 2: return modelData.at(row).nAge; case 3: return modelData.at(row).strTel; } } return QVariant(); } QVariant MyModel::headerData(int section, Qt::Orientation orientation, int role) const { if(role Qt::DisplayRole orientation Qt::Horizontal) { switch(section) { case 0: return QString(name); case 1: return QString(sex); case 2: return QString(age); case 3: return QString(tel); } } return QVariant(); } void MyModel::update(const ModelItem item) { ModelItem data item; modelData.push_back(data); int row modelData.count(); beginInsertRows(QModelIndex(), row, row); endInsertRows(); } void MyModel::remove() { int row modelData.count() - 1; // 确保行号有效 if (row 0 || row modelData.count()) return; // 通知模型删除数据前的变化 beginRemoveRows(QModelIndex(), row, row); // 删除数据 modelData.removeAt(row); // 通知模型删除数据后的变化 endRemoveRows(); }// 使用 QAbstractTableModel 的视图 QTableView *tableView new QTableView(this); MyModel *model new MyModel (); tableView-setModel(model);
返回列表