1、 checkbox 代理
将checkbox处理成单选的效果
#ifndef CHECKBOXDELEGATE_H
#define CHECKBOXDELEGATE_H
#include <QStyledItemDelegate>
#include <QCheckBox>
class CheckBoxDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
CheckBoxDelegate(QObject *parent = NULL);
~CheckBoxDelegate();
public:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
signals:
void signalClicked(const QModelIndex &index);
};
#endif // CHECKBOXDELEGATE_H
#include "my-checkboxdelegate.h"
#include <QApplication>
#include <QMouseEvent>
#include <QDebug>
//只处理第五列
#define CHECK_BOX_COLUMN 5
CheckBoxDelegate::CheckBoxDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
CheckBoxDelegate::~CheckBoxDelegate()
{
}
// 绘制复选框
void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem viewOption(option);
initStyleOption(&viewOption, index);
if (option.state.testFlag(QStyle::State_HasFocus))
viewOption.state = viewOption.state ^ QStyle::State_HasFocus;
QStyledItemDelegate::paint(painter, viewOption, index);
if (index.column() == CHECK_BOX_COLUMN)
{
QString data = index.model()->data(index).toString();
QStyleOptionButton checkBoxStyle;
checkBoxStyle.state = data.toUInt()== 1 ? QStyle::State_On : QStyle::State_Off;
checkBoxStyle.state |= QStyle::State_Enabled;
checkBoxStyle.iconSize = QSize(20, 20);
checkBoxStyle.rect = option.rect;
// 画checkbox
QCheckBox checkBox;
QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter, &checkBox);
}
}
// 响应鼠标事件,更新数据
bool CheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
QRect decorationRect = option.rect;
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
if (event->type() == QEvent::MouseButtonPress && decorationRect.contains(mouseEvent->pos()))
{
if (index.column() == CHECK_BOX_COLUMN)
{
int data = model->data(index).toString().toUInt();
QString other;
// 互斥处理 ,处理成单选的功能
if(data == 1)
{
model->setData(index,QString("0"));
other = QString("1");
}
else
{
model->setData(index, QString("1"));
other = QString("0");
int row = index.row();
for(int i =0 ; i< model->rowCount();i++)
{
if(i != row)
{
QModelIndex temp = model->index(i,CHECK_BOX_COLUMN);
model->setData(temp,other);
}
}
emit signalClicked(index);
}
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
2、SqlTable 继承
让显示居中
#include <QtSql>
#include <QModelIndex>
#include "my-editablesqlmodel.h"
EditableSqlModel::EditableSqlModel(QObject *parent, QSqlDatabase db)
: QSqlTableModel(parent,db)
{
}
QVariant EditableSqlModel::data(const QModelIndex & index, int role) const
{
QVariant value = QSqlTableModel::data(index,role);
if(role == Qt::TextAlignmentRole)
{
value = Qt::AlignCenter; // 居中显示
return value;
}
return value;
}
3、 Tableview
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "my-checkboxdelegate.h"
#include "my-editablesqlmodel.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_3_clicked();
void on_pushButton_2_clicked();
void on_pushButton_clicked();
void on_comboBox_home_currentTextChanged(const QString &arg1);
void on_comboBox_dep_currentTextChanged(const QString &arg1);
void on_pushButton_4_clicked();
private:
Ui::MainWindow *ui;
EditableSqlModel *model;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QSqlTableModel>
#include <QTableView>
#include <QDebug>
#include <QMessageBox>
#include <QSqlQuery>
#include <QComboBox>
#include <QHeaderView>
#include <QObject>
#include <QSqlRecord>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("./tableview-deom.db");
if(database.open())
{
qDebug()<<"open db";
}
else
{
QMessageBox msgBox;
msgBox.setText("db open failed.");
msgBox.exec();
}
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->tableView->setSelectionMode(QAbstractItemView::SelectionMode::MultiSelection);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//根据内容调整列宽度
model = new EditableSqlModel(this,database);
model->setTable("user");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID_hiden"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("用户名"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("电话号码"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("PW_hiden"));
model->setHeaderData(4, Qt::Horizontal, QObject::tr("家乡"));
model->setHeaderData(5, Qt::Horizontal, QObject::tr("默认用户"));
model->setHeaderData(6, Qt::Horizontal, QObject::tr("部门"));
ui->tableView->setModel(model);
ui->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section {"
"color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");
ui->tableView->verticalHeader()->setStyleSheet("QHeaderView::section {"
"color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");
ui->tableView->verticalHeader()->setDefaultSectionSize(60);
ui->tableView->horizontalHeader()->setDefaultSectionSize(30);
ui->tableView->horizontalHeader()->setStretchLastSection(true);
ui->tableView->setColumnWidth(0,10);
ui->tableView->setColumnWidth(1,150);
ui->tableView->setColumnWidth(2,200);
ui->tableView->setColumnWidth(3,10);
ui->tableView->setColumnWidth(4,120);
ui->tableView->setColumnWidth(5,80);
ui->tableView->setColumnWidth(6,200);
ui->tableView->setColumnHidden(0,true);
ui->tableView->setColumnHidden(3,true);
CheckBoxDelegate *checkboxdelegate = new CheckBoxDelegate;
ui->tableView->setItemDelegate(checkboxdelegate);
QObject::connect(checkboxdelegate,&CheckBoxDelegate::signalClicked,this ,[this](QModelIndex index){
bool ok ;
ui->tableView->model()->index(index.row(),5).data().toUInt(&ok);
qDebug()<<"第 "<<index.row()+1<<"行"<<"被选中";
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
if(sqlmodel)
{
sqlmodel->submitAll();
sqlmodel->select();
}
});
int row = model->rowCount();
QSet<QString> hometowm;
QSet<QString> department;
for(int i = 0;i <row; i++)
{
QModelIndex index1 = model->index(i,4);
QModelIndex index2 = model->index(i,6);
hometowm<<index1.data().toString();
department<<index2.data().toString();
}
QStringList list1 = hometowm.toList();
list1.prepend(QString(" "));
ui->comboBox_home->addItems(list1);
QStringList list2 = department.toList();
list2.prepend(QString(" "));
ui->comboBox_dep->addItems(list2);
}
MainWindow::~MainWindow()
{
delete ui;
}
//add
void MainWindow::on_pushButton_3_clicked()
{
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
QSqlRecord record = sqlmodel->record();
record.setValue(1,"Jrodan");
record.setValue(2,"13022324455");
record.setValue(3,"123321");
record.setValue(4,"USA");
record.setValue(5,0);
record.setValue(6,"Sport");
sqlmodel->insertRecord(sqlmodel->rowCount(), record);
sqlmodel->submitAll();
sqlmodel->select();
}
//update
void MainWindow::on_pushButton_2_clicked()
{
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
int row = 2;
QSqlRecord record = sqlmodel->record(row);
record.setValue("Name",record.value("Name").toString()+"add");
sqlmodel->setRecord(row,record);
sqlmodel->submitAll();
sqlmodel->select();
}
//delete 选中的
void MainWindow::on_pushButton_clicked()
{
QItemSelectionModel *selections = ui->tableView->selectionModel();
QModelIndexList selected = selections->selectedIndexes();
QSet<int> rowset;
for (QModelIndex index: selected)
{
if(index.column() == 0)
{
rowset<<index.row();
}
}
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
for(int row: rowset)
{
sqlmodel->removeRow(row);
}
sqlmodel->submitAll();
sqlmodel->select();
}
//筛选家乡
void MainWindow::on_comboBox_home_currentTextChanged(const QString &txt)
{
if(txt == QString(" ")) return;
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
QString sql = QString("Home='%1'").arg(txt);
sqlmodel->setFilter(sql);
sqlmodel->select();
}
//筛选部门
void MainWindow::on_comboBox_dep_currentTextChanged(const QString &txt)
{
if(txt == QString(" ")) return;
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
QString sql = QString("Department='%1'").arg(txt);
sqlmodel->setFilter(sql);
sqlmodel->select();
}
// display all
void MainWindow::on_pushButton_4_clicked()
{
QAbstractItemModel *models = ui->tableView->model();
QSqlTableModel* sqlmodel = qobject_cast<QSqlTableModel*>(models);
sqlmodel->setFilter("");
sqlmodel->select();
}