用Qt 做了一个Demo 实现数据库增删改查的功能
登陆页面
数据库页面,没有登陆前只能查看
登陆后可以新增,修改,删除
条件查询
新增
修改
数据库资料
部分代码
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
if(!connectDB()){
qDebug()<<"无法连接数据库";
return;
};
if(!basicSetup()){
qDebug()<<"basicSetup 失败";
return;
};
if(!createActions()){
qDebug()<<"createActions 失败";
return;
};
if(!createMenus()){
qDebug()<<"createMenus 失败";
return;
};
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::basicSetup()
{
resize(700,500);
setWindowTitle("Hello QT");
mdiArea = new QMdiArea;
setCentralWidget(mdiArea);
mdiArea->setBackground(Qt::NoBrush);
//mdiArea->setStyleSheet("background-image:url(D:/workspaceForQt/FirstQtDemo/3.jpg)");
mdiArea->setStyleSheet("background-color:yellowgreen");
mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
mdiArea->show();
setWindowIcon(QIcon("main.png"));//设置窗口光标
return true;
}
bool MainWindow::createActions()
{
connect(&confirm_btn,&QPushButton::clicked,this,[=]{closeDialog(true,false);});
connect(&cancel_btn,&QPushButton::clicked,this,[=]{closeDialog(false,true);});
loginAction = new QAction(tr("登录"),this);
loginAction->setShortcut(tr("Ctrl+i"));
connect(loginAction, &QAction::triggered, this,&MainWindow::on_login);
logoutAction = new QAction(tr("注销"),this);
logoutAction->setShortcut(tr("Ctrl+o"));
connect(logoutAction, &QAction::triggered, this,&MainWindow::on_logout);
exitAction = new QAction(tr("退出"),this);
exitAction->setShortcut(tr("Ctrl+q"));
connect(exitAction, &QAction::triggered, this,&MainWindow::exit);
showAllData_ActPtr = new QAction(tr("显示全部资料"),this);
showAllData_ActPtr->setEnabled(true);
connect(showAllData_ActPtr, &QAction::triggered, this,&MainWindow::showAllData);
selectByAge_ActPtr = new QAction(tr("依照年龄选择"),this);
selectByAge_ActPtr->setEnabled(true);
connect(selectByAge_ActPtr, &QAction::triggered, this,&MainWindow::selectByAge);
addData_ActPtr = new QAction(tr("新增资料(需登陆)"),this);
addData_ActPtr->setEnabled(false);
connect(addData_ActPtr, &QAction::triggered, this,&MainWindow::addData);
deleteData_ActPtr = new QAction(tr("删除资料(需登陆)"),this);
deleteData_ActPtr->setEnabled(false);
connect(deleteData_ActPtr, &QAction::triggered, this,&MainWindow::deleteData);
updateData_ActPtr = new QAction(tr("更新资料(需登陆)"),this);
updateData_ActPtr->setEnabled(false);
connect(updateData_ActPtr, &QAction::triggered, this,&MainWindow::updateData);
helpAction = new QAction(tr("帮助"), this);
helpAction->setShortcut(tr("Ctrl+s"));
connect(helpAction, &QAction::triggered, this,[=]{
QMessageBox::information(this, "帮助", "数据库账号密码都是root,数据库名称data,数据库里建立一张表student,column包括id,pwd,age,description,可以运行附件中的sql");
});
aboutAction = new QAction(tr("关于"), this);
aboutAction->setShortcut(tr("Ctrl+t"));
connect(aboutAction, &QAction::triggered, this,[=]
{
QMessageBox::information(this, "关于", "参考视频和网络,练习用的,无版权");
});
return true;
}
bool MainWindow::createMenus()
{
adminMenu = menuBar()->addMenu(tr("管理"));//添加管理菜单
adminMenu->addAction(loginAction);
adminMenu->addAction(logoutAction);
adminMenu->addSeparator();//加入分隔符
adminMenu->addAction(exitAction);
dataMenu = menuBar()->addMenu(tr("数据"));//添加数据菜单
dataMenu->addAction(showAllData_ActPtr);
dataMenu->addAction(selectByAge_ActPtr);
dataMenu->addAction(addData_ActPtr);
dataMenu->addAction(deleteData_ActPtr);
dataMenu->addAction(updateData_ActPtr);
helpMenu = menuBar()->addMenu(tr("帮助"));
helpMenu->addAction(helpAction);
helpMenu->addSeparator();
helpMenu->addAction(aboutAction);
return true;
}
void MainWindow::on_login()
{
LoginDlg dlg(db);
dlg.exec();
if(dlg.login_success==true)
{
addData_ActPtr->setText("新增资料");
addData_ActPtr->setEnabled(true);
deleteData_ActPtr->setText("删除资料");
deleteData_ActPtr->setEnabled(true);
updateData_ActPtr->setText("更新资料");
updateData_ActPtr->setEnabled(true);
}
}
void MainWindow::on_logout()
{
addData_ActPtr->setText("新增资料(需登陆)");
addData_ActPtr->setEnabled(false);
deleteData_ActPtr->setText("删除资料(需登陆)");
deleteData_ActPtr->setEnabled(false);
updateData_ActPtr->setText("更新资料(需登陆)");
updateData_ActPtr->setEnabled(false);
QMessageBox::information(this,"","登出成功");
}
void MainWindow::exit()
{
close();
}
void MainWindow::showAllData()
{
QStandardItemModel *model=new QStandardItemModel;
QString sql="select * from student";
bool res=db->sql_open(sql,&model);
if(!res){
qDebug()<<"无法取得数据库资料";
}else
{
showByModel(model);
}
}
void MainWindow::selectByAge()
{
dlg=new QDialog;
QGridLayout layout(dlg);
QLabel label1("年龄上限");
QLabel label2("年龄下限");
QLineEdit ageCell;
QLineEdit ageFloor;
confirm_btn.setText("查询");
cancel_btn.setText("取消");
layout.addWidget(&label1,0,0);
layout.addWidget(&ageCell,0,1);
layout.addWidget(&label2,1,0);
layout.addWidget(&ageFloor,1,1);
layout.addWidget(&confirm_btn,2,0);
layout.addWidget(&cancel_btn,2,1);
layout.setColumnStretch(0,1);
layout.setColumnStretch(1,1);
dlg->exec();
dlg=nullptr;
if(isConfirm){
QString str=ageCell.text();
QString str2=ageFloor.text();
bool ageCellValid=true;
bool ageFloorValid=true;
if(str.trimmed().isEmpty()){
ageCellValid=false;
}
if(str2.trimmed().isEmpty()){
ageFloorValid=false;
}
if(!ageCellValid&&!ageFloorValid){
QMessageBox::warning(this,"warn","年龄上限下限不能同时为空");
return;
}
QString sql;
if(ageCellValid&&ageFloorValid){
sql="select * from student where age>="+ageFloor.text()+" and age<="+ageCell.text();
}else if (ageCellValid) {
sql="select * from student where age<="+ageCell.text();
}else {
sql="select * from student where age>="+ageFloor.text();
}
QStandardItemModel *model=new QStandardItemModel;
bool res=db->sql_open(sql,&model);
if(!res){
qDebug()<<"无法取得数据库资料";
}else
{
showByModel(model);
}
}
}
void MainWindow::addData()
{
dlg=new QDialog;
QGridLayout layout(dlg);
QLabel label1("ID");
QLabel label2("密码");
QLabel label3("年龄");
QLabel label4("描述");
QLineEdit edit1;
QLineEdit edit2;
QLineEdit edit3;
QLineEdit edit4;
confirm_btn.setText("确定");
cancel_btn.setText("取消");
layout.addWidget(&label1,0,0);
layout.addWidget(&edit1,0,1);
layout.addWidget(&label2,1,0);
layout.addWidget(&edit2,1,1);
layout.addWidget(&label3,2,0);
layout.addWidget(&edit3,2,1);
layout.addWidget(&label4,3,0);
layout.addWidget(&edit4,3,1);
layout.addWidget(&confirm_btn,5,0);
layout.addWidget(&cancel_btn,5,1);
layout.setColumnStretch(0,1);
layout.setColumnStretch(1,1);
dlg->exec();
dlg=nullptr;
if(isConfirm){
QString str1=edit1.text();
QString str2=edit2.text();
QString str3=edit3.text();
QString str4=edit4.text();
if(str1.trimmed().isEmpty()||str2.trimmed().isEmpty()||str3.trimmed().isEmpty()||str4.trimmed().isEmpty())
{
QMessageBox::warning(this,"warn","ID,密码,年龄,描述不能为空");
return;
}
if(isIdExist(str1))
{
QMessageBox::warning(this,"warn","ID已经存在");
return;
}
QString sql="INSERT INTO student VALUES ('"+str1+"', '"+str2+"', '"+str3+"', '"+str4+"')";
bool res=db->sql_exec(sql);
if(res){
QMessageBox::information(this,"info","操作成功");
showAllData();
}else
{
QMessageBox::warning(this,"warn","操作失败");
showAllData();
}
}
}
void MainWindow::deleteData()
{
dlg=new QDialog;
QGridLayout layout(dlg);
QLabel label1("ID");
QLineEdit edit1;
confirm_btn.setText("确定");
cancel_btn.setText("取消");
layout.addWidget(&label1,0,0);
layout.addWidget(&edit1,0,1);
layout.addWidget(&confirm_btn,1,0);
layout.addWidget(&cancel_btn,1,1);
layout.setColumnStretch(0,1);
layout.setColumnStretch(1,1);
dlg->exec();
dlg=nullptr;
if(isConfirm){
QString str1=edit1.text();
if(str1.trimmed().isEmpty())
{
QMessageBox::warning(this,"warn","ID不能为空");
return;
}
QString sql="delete from student where id= '"+str1+"'";
bool res=db->sql_exec(sql);
if(res){
QMessageBox::information(this,"info","操作成功");
showAllData();
}else
{
QMessageBox::warning(this,"warn","操作失败");
showAllData();
}
}
}
void MainWindow::updateData()
{
dlg=new QDialog;
QGridLayout layout(dlg);
QLabel label1("要修改的ID");
QLineEdit edit1;
confirm_btn.setText("确定");
cancel_btn.setText("取消");
layout.addWidget(&label1,0,0);
layout.addWidget(&edit1,0,1);
layout.addWidget(&confirm_btn,1,0);
layout.addWidget(&cancel_btn,1,1);
layout.setColumnStretch(0,1);
layout.setColumnStretch(1,1);
dlg->exec();
dlg=nullptr;
if(isConfirm)
{
QString str_id=edit1.text();
if(str_id.trimmed().isEmpty())
{
QMessageBox::warning(this,"warn","ID不能为空");
return;
}
if(!isIdExist(str_id)){
QMessageBox::warning(this,"warn","ID不存在");
return;
}
QString sql="select * from student where id= '"+str_id+"'";
QStandardItemModel *model=new QStandardItemModel;
bool res=db->sql_open(sql,&model);
if(!res)
{
QMessageBox::warning(this,"warn","操作失败");
return;
}
QString str_pwd=model->takeItem(0,1)->text();
QString str_age=model->takeItem(0,2)->text();
QString str_des=model->takeItem(0,3)->text();
dlg=new QDialog;
dlg=new QDialog;
QGridLayout layout(dlg);
QLabel label1("ID(不可修改)");
QLabel label2("密码");
QLabel label3("年龄");
QLabel label4("描述");
QLineEdit edit1;
edit1.setText(str_id);
edit1.setReadOnly(true);
QLineEdit edit2;
edit2.setText(str_pwd);
QLineEdit edit3;
edit3.setText(str_age);
QLineEdit edit4;
edit4.setText(str_des);
confirm_btn.setText("确定");
cancel_btn.setText("取消");
layout.addWidget(&label1,0,0);
layout.addWidget(&edit1,0,1);
layout.addWidget(&label2,1,0);
layout.addWidget(&edit2,1,1);
layout.addWidget(&label3,2,0);
layout.addWidget(&edit3,2,1);
layout.addWidget(&label4,3,0);
layout.addWidget(&edit4,3,1);
layout.addWidget(&confirm_btn,5,0);
layout.addWidget(&cancel_btn,5,1);
layout.setColumnStretch(0,1);
layout.setColumnStretch(1,1);
dlg->exec();
if(isConfirm)
{
str_pwd=edit2.text();
str_age=edit3.text();
str_des=edit4.text();
sql="UPDATE student SET pwd='"+str_pwd+"', age='"+str_age+"', description='"+str_des+"' WHERE id='"+str_id+"'";
int res=db->sql_exec(sql);
if(res)
{
QMessageBox::information(this,"info","操作成功");
showAllData();
}else
{
QMessageBox::warning(this,"warning","操作失败");
showAllData();
}
}
}
}
bool MainWindow::connectDB()
{
db=new MysqlUtil();
bool res;
if(!db->connected)
{
res = db->sql_connect();
if (!res)
{
QMessageBox::information(this, "登录失败","无法连接数据库");
return false;
}else {
db->connected=true;
}
}
return true;
}
void MainWindow::showByModel(QStandardItemModel *model)
{
QTableView *view1 = new QTableView;
view1->setAttribute(Qt::WA_DeleteOnClose);//view在close的时候自动会delete,这个时候如果view有modul的话,这个modul会被view自动释放。
//view1->setStyleSheet("border-image: url(3.jpg);");//设置widget背景图片
//view1继承自widget,如果没有modul,那么view不会显示任何数据.
view1->setModel(model);
//view1->setStyleSheet("background-color:lightgreen");
view1->resizeColumnsToContents();
view1->resizeRowsToContents();
mdiArea->addSubWindow(view1);
view1->showMaximized();
}
void MainWindow::closeDialog(bool confirm,bool cancel){
isConfirm=confirm;
isCancel=cancel;
dlg->close();
}
bool MainWindow::isIdExist(QString id)
{
QStandardItemModel *model=new QStandardItemModel;
QString sql="select * from student where id='"+id+"'";
bool res=db->sql_open(sql,&model);
if(!res)
{
QMessageBox::warning(this,"warn","操作失败");
return false;
}
QList list=model->takeRow(0);
if(list.isEmpty()){
return false;
}else{
return true;
}
}