主要介绍qt框架中对数据库的增加,删除和修改功能。
软件界面如下
程序结构
tdialogdata.h中代码
#ifndef TDIALOGDATA_H
#define TDIALOGDATA_H
#include <QDialog>
#include<QSqlRecord>
namespace Ui {
class TDialogData;
}
class TDialogData : public QDialog
{
Q_OBJECT
public:
explicit TDialogData(QWidget *parent = nullptr);
~TDialogData();
QSqlRecord record();
void setRecord(const QSqlRecord &newRecord);
private slots:
void on_pushButtonImport_clicked();
void on_pushButtonClear_clicked();
private:
QSqlRecord m_record;
private:
Ui::TDialogData *ui;
};
#endif // TDIALOGDATA_H
tdialogdata.cpp中代码
#include "tdialogdata.h"
#include "ui_tdialogdata.h"
#include <QPixmap>
#include<QBitArray>
#include<QFileDialog>
TDialogData::TDialogData(QWidget *parent)
: QDialog(parent)
, ui(new Ui::TDialogData)
{
ui->setupUi(this);
}
TDialogData::~TDialogData()
{
delete ui;
}
QSqlRecord TDialogData::record()
{
m_record.setValue("EmpNo",ui->spinBoxEmpNo->value());
m_record.setValue("Name",ui->lineEditName->text());
m_record.setValue("Gender",ui->comboBoxSex->currentText());
m_record.setValue("Birthday",ui->dateTimeEdit->date());
m_record.setValue("Province",ui->comboBoxBirth->currentText());
m_record.setValue("Department",ui->comboBoxDepartment->currentText());
m_record.setValue("Salary",ui->spinBoxSalary->value());
m_record.setValue("Memo",ui->plainTextEdit->toPlainText());
return m_record;
}
void TDialogData::setRecord(const QSqlRecord &newRecord)
{
ui->spinBoxEmpNo->setEnabled(false);
ui->spinBoxEmpNo->setValue(newRecord.value("EmpNo").toInt());
ui->lineEditName->setText(newRecord.value("Name").toString());
ui->comboBoxSex->setCurrentText(newRecord.value("Gender").toString());
ui->dateTimeEdit->setDate(newRecord.value("Birthday").toDate());
ui->comboBoxBirth->setCurrentText(newRecord.value("Province").toString());
ui->comboBoxDepartment->setCurrentText(newRecord.value("Department").toString());
ui->spinBoxSalary->setValue(newRecord.value("Salary").toInt());
ui->plainTextEdit->setPlainText(newRecord.value("Memo").toString());
QVariant va=newRecord.value("Photo");
if(va.isValid())
{
QPixmap pic;
pic.loadFromData(va.toByteArray());
ui->labelpic->setPixmap(pic.scaledToWidth(ui->labelpic->size().width()));
}
m_record = newRecord;
}
void TDialogData::on_pushButtonImport_clicked()
{
QString aFile=QFileDialog::getOpenFileName(this,"选择文件","","照片(*.jpg)");
if(aFile.isEmpty())
return;
QFile file(aFile);
if(!file.open(QIODevice::ReadOnly))
{
return;
}
QByteArray data=file.readAll();
file.close();
m_record.setValue("Photo",data);
QPixmap pic;
pic.loadFromData(data);
ui->labelpic->setPixmap(pic.scaledToWidth(ui->labelpic->size().width()));
}
void TDialogData::on_pushButtonClear_clicked()
{
m_record.setNull("Photo");
ui->labelpic->clear();
}
MainWindow.h中的代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QtSql>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public:
QSqlDatabase DB;
QSqlQueryModel *qryModel;
QItemSelectionModel *selectModel;
public:
void selectData();
void updateRecord(int recNo);
private slots:
void on_actOpenDB_triggered();
void on_actInsert_triggered();
void on_actEdit_triggered();
void on_tableView_doubleClicked(const QModelIndex &index);
void on_actDelete_triggered();
void on_actAddMoney_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp中的代
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QMessageBox>
#include"tdialogdata.h"
#include<QSqlQuery>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setCentralWidget(ui->tableView);
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tableView->setAlternatingRowColors(true);
//ui->tableView->setStyleSheet("alternate-background-color:rgb(217,225,240);background-color:rgb(255,255,255)");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::selectData()
{
qryModel=new QSqlQueryModel();
selectModel=new QItemSelectionModel(qryModel,this);
ui->tableView->setModel(qryModel);
ui->tableView->setSelectionModel(selectModel);
qryModel->setQuery("SELECT empNo,Name,Gender,Birthday,Province,Department,"
"Salary FROM employee order by empNo");
if(qryModel->lastError().isValid())
{
QMessageBox::information(this,"error","数据库表格读取失败\n"+qryModel->lastError().text());
return;
}
QSqlRecord rec=qryModel->record();
qryModel->setHeaderData(rec.indexOf("empNo"),Qt::Horizontal,"工号");
qryModel->setHeaderData(rec.indexOf("Name"),Qt::Horizontal,"姓名");
qryModel->setHeaderData(rec.indexOf("Gender"),Qt::Horizontal,"性别");
qryModel->setHeaderData(rec.indexOf("Birthday"),Qt::Horizontal,"出生日期");
qryModel->setHeaderData(rec.indexOf("Province"),Qt::Horizontal,"省份");
qryModel->setHeaderData(rec.indexOf("Department"),Qt::Horizontal,"部门");
qryModel->setHeaderData(rec.indexOf("Salary"),Qt::Horizontal,"工资");
ui->actOpenDB->setEnabled(false);
ui->actAddMoney->setEnabled(true);
ui->actEdit->setEnabled(true);
ui->actDelete->setEnabled(true);
ui->actInsert->setEnabled(true);
}
void MainWindow::updateRecord(int recNo)
{
QSqlRecord curRec=qryModel->record(recNo);
int empNo=curRec.value("EmpNo").toInt();
QSqlQuery query;
query.prepare("select *from employee where EmpNo=:ID");
query.bindValue(":ID",empNo);
query.exec();
query.first();
if(!query.isValid())
return;
curRec=query.record();
TDialogData *dataDialog=new TDialogData(this);
dataDialog->setRecord(curRec);
if(dataDialog->exec()==QDialog::Accepted)
{
QSqlRecord recData=dataDialog->record();
query.prepare("update employee set Name=:Name,Gender=:Gender,"
"Birthday=:Birthday,Province=:Province,"
"Department=:Department,Salary=:Salary,"
"Memo=:Memo,Photo=:Photo "
"where EmpNo=:EmpNo"
);
query.bindValue(":EmpNo",recData.value("EmpNo"));
query.bindValue(":Name",recData.value("Name"));
query.bindValue(":Gender",recData.value("Gender"));
query.bindValue(":Birthday",recData.value("Birthday"));
query.bindValue(":province",recData.value("Province"));
query.bindValue(":Department",recData.value("Department"));
query.bindValue(":Salary",recData.value("Salary"));
query.bindValue(":Memo",recData.value("Memo"));
query.bindValue(":Photo",recData.value("Photo"));
if(!query.exec())
{
QMessageBox::critical(this,"错误","更新数据错误\n"+query.lastError().text());
}
else
{
qryModel->setQuery(qryModel->query().executedQuery());
}
}
}
void MainWindow::on_actOpenDB_triggered()
{
QString aFile=QFileDialog::getOpenFileName(this,"选择文件","","SQLite数据库(*.db3)");
if(aFile.isEmpty())
return;
DB=QSqlDatabase::addDatabase("QSQLITE");
DB.setDatabaseName(aFile);
if(DB.open())
selectData();
else
QMessageBox::warning(this,"警告","打开数据文件失败");
}
void MainWindow::on_actInsert_triggered()
{
QSqlQuery query;
query.exec("select * from employee where EmpNo=-1");
QSqlRecord curRec=query.record();
curRec.setValue("EmpNo",3000+qryModel->rowCount());
TDialogData *dataDialog=new TDialogData(this);
dataDialog->setRecord(curRec);
if(dataDialog->exec()==QDialog::Accepted)
{
QSqlRecord recData=dataDialog->record();
query.prepare("INSERT INTO employee (EmpNo,Name,Gender,Birthday,Province,"
"Department,Salary,Memo,Photo)"
"VALUES(:EmpNo,:Name,:Gender,:Birthday,:Province,"
":Department,:Salary,:Memo,:Photo)");
query.bindValue(":EmpNo",recData.value("EmpNo"));
query.bindValue(":Name",recData.value("Name"));
query.bindValue(":Gender",recData.value("Gender"));
query.bindValue(":Birthday",recData.value("Birthday"));
query.bindValue(":province",recData.value("Province"));
query.bindValue(":Department",recData.value("Department"));
query.bindValue(":Salary",recData.value("Salary"));
query.bindValue(":Memo",recData.value("Memo"));
query.bindValue(":Photo",recData.value("Photo"));
if(!query.exec())
{
QMessageBox::critical(this,"错误","插入数据错误\n"+query.lastError().text());
}
else
{
qryModel->setQuery(qryModel->query().executedQuery());
}
}
delete dataDialog;
}
void MainWindow::on_actEdit_triggered()
{
int curRecNo=selectModel->currentIndex().row();
updateRecord(curRecNo);
}
void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
updateRecord(index.row());
}
void MainWindow::on_actDelete_triggered()
{
int curNo=selectModel->currentIndex().row();
QSqlRecord curRec=qryModel->record(curNo);
if(curRec.isEmpty())
return;
int empNo=curRec.value("EmpNo").toInt();
QSqlQuery query;
query.prepare("delete from employee where EmpNo=:ID");
query.bindValue(":ID",empNo);
if(!query.exec())
QMessageBox::critical(this,"error","删除失败\n"+query.lastError().text());
else
{
qryModel->setQuery(qryModel->query().lastQuery());
qryModel->query().executedQuery();
}
}
void MainWindow::on_actAddMoney_triggered()
{
QSqlQuery qryUpdate;
qryUpdate.exec("UPDATE employee SET Salary=Salary+1000");
qryModel->setQuery(qryModel->query().lastQuery());
// qryModel->query().executedQuery();
}
码