先創建一個Qt widgets 應用程序,並將mainwindow.cpp文件中修改為如下代碼
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> #include <QSqlDatabase> #include <QDebug> #include <QSqlError> #include <QSqlQuery> #include <QSqlRecord> #include <QTableView> #include <QSqlTableModel> static bool createConnectionDateBase() { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");; //創建QSQLdatabase對象,指定QT使用的哪一種SQL。 db.setDatabaseName("testSQL.db"); if(!db.open()) { QMessageBox::critical(NULL,"數據庫打開失敗","打開數據庫失敗!", QMessageBox::Cancel); return false; } QSqlQuery query; query.exec("create table TEST_SQL (id int(1) primary key,name char(200),age int(1),chenked int (1))"); query.exec("insert into TEST_SQL values(1,'測試1',18,0)"); query.exec("insert into TEST_SQL values(2,'測試2',19,0)"); query.exec("insert into TEST_SQL values(3,'測試3',20,0)"); return true; } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); if(!createConnectionDateBase()) { return; } model = new QSqlTableModel(this); model->setTable("TEST_SQL"); model->setHeaderData(0,Qt::Horizontal,tr("ID號")); model->setHeaderData(1,Qt::Horizontal,tr("姓名")); model->setHeaderData(2,Qt::Horizontal,tr("年齡")); model->select(); QTableView *view = new QTableView(this); view->setModel(model); setCentralWidget(view); //ui->tableView->setModel(model); } MainWindow::~MainWindow() { delete ui; }
運行查看效果,
現在開始往這個表中添加復選框,需要繼承QSqlTableModel類,在工程中Add new,新建一個C++類,名字為myTableModel,然后在將生成的mytablemodel.h和metaoblemodel.cpp修改為如下:
#ifndef MYTABLEMODEL_H #define MYTABLEMODEL_H #include <QtSql> class myTableModel:public QSqlTableModel { Q_OBJECT public: myTableModel( QObject * parent = 0, QSqlDatabase db = QSqlDatabase() ); bool setData( const QModelIndex &index, const QVariant &value, int role ); QVariant data(const QModelIndex &index, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; }; #endif // MYTABLEMODEL_H
#include "mytablemodel.h" QMap<int, Qt::CheckState> check_state_map; int checkColumn = 3;//將復選框放到第幾列,從0開始計數 myTableModel::myTableModel(QObject *parent, QSqlDatabase db) { } bool myTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if(!index.isValid()) return false; if (role == Qt::CheckStateRole && index.column() == checkColumn) { check_state_map[index.row()] = (value == Qt::Checked ? Qt::Checked : Qt::Unchecked);return true; } else return QSqlTableModel::setData(index, value,role); } QVariant myTableModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (index.column() != checkColumn ) { return QSqlTableModel::data(index, role); } switch(role) { case Qt::CheckStateRole: if(index.column() == checkColumn) { if (check_state_map.contains(index.row())) { return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked; } return Qt::Unchecked; } default: return QVariant(); } return QVariant(); } Qt::ItemFlags myTableModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; if (index.column() == checkColumn) return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; else return QSqlTableModel::flags(index); return Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
然后將mianwindow.cpp中包含該頭文件 mytablemodel.h 然后將mianwindow.cpp的構造函數修改為如下:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); if(!createConnectionDateBase()) { return; } model = new myTableModel(this); model->setTable("TEST_SQL"); model->setHeaderData(0,Qt::Horizontal,tr("ID號")); model->setHeaderData(1,Qt::Horizontal,tr("姓名")); model->setHeaderData(2,Qt::Horizontal,tr("年齡")); model->select(); QTableView *view = new QTableView(this); view->setModel(model); setCentralWidget(view); //ui->tableView->setModel(model); }
然后運行看效果
復選框已經出現在了第3列。
至於怎么知道是否選中呢,
在myTableModel.cpp文件中的check_state_map中, check_state_map[i]的值就是第i行CheckBox的值。