QtableView中添加復選框


先創建一個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的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM