MySql与Qt连接、将数据输出到QT的窗口tableWidget详细过程。
2023-09-27 14:19:51 时间
文章目录
前言
本章节讲为大家讲述,MySql与Qt连接的详细过程及代码框架设计
没有安装MySql的小伙伴可参考一下MySql下载与环境配置、链接放下面了
效果实图
图一
图二
这里我们要注意一下我们创建的表是student 这里是直接在代码中写死了。
注意记得在服务器中,创建mydata数据库 代码已经写死数据库
“ db.setDatabaseName(“mydata”);//使用哪个数据库”
二、完成Qt与MySql服务的连接需要满足
- 安装MySql并设置环境
- 安装Qt并设置适用与MySql的环境
- 如果Qt报错:QMYSQL driver not loaded
1、 解决方法是把MySql的 libmysql.dll拷贝到相对应的编译器中
2、 注意:QT选用的Windows32位要对应32位的 libmysql.dll。
3、注意:QT选用的Windows64位要对应64位的 libmysql.dll。
4、注意:需要在工程文件中的xxxx.pro中添加 QT += sql 如下图所示
5、注意:选择C:\mysql-5.7.37-win32\lib中的libmysql.dll拷贝到 C:\Qt\Qt5.9.0\5.9\mingw53_32\bin中 (记得对应是32位还是64位的 一定要对应)libmysql.dll。
一、代码框架设计思路
二、开发工具源码
没什么好说的直接拷贝源码到工程中、MinGw编译即可
记得在.pro文件中加入QT += sql
QT += sql
mainwindow.h 文件源码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMainWindow>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QGridLayout>
#include <QTableWidget>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
public:
void myLayout();
private slots:
void button_1_clicked();
void button_2_clicked();
void button_3_clicked();
void button_4_clicked();
void button_5_clicked();
protected:
QLabel *Label_1;
QLabel *Label_2;
QLabel *Label_3;
QLabel *Label_4;
QLineEdit *Line_1;
QLineEdit *Line_2;
QLineEdit *Line_3;
QLineEdit *Line_4;
QPushButton *Button_1;
QPushButton *Button_2;
QPushButton *Button_3;
QPushButton *Button_4;
QPushButton *Button_5;
QTableWidget *tableWidget;
QSqlDatabase db;
};
#endif // MAINWINDOW_H
main.cpp文件源码
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
w.setFixedSize(300,280);
w.setWindowTitle("MySql连接工具");
w.myLayout();
return a.exec();
}
mainwindow.cpp文件源码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::myLayout()
{
QWidget *centerWindow = new QWidget;
this->setCentralWidget(centerWindow);
Button_1 = new QPushButton("连接MySql");
Button_2 = new QPushButton("添加数据");
Button_3 = new QPushButton("更新数据");
Button_4 = new QPushButton("删除数据");
Button_5 = new QPushButton("显示当前表号数据");
Line_1 = new QLineEdit;
Line_2 = new QLineEdit;
Line_3 = new QLineEdit;
Line_4 = new QLineEdit;
Label_1 = new QLabel("id");
Label_2 = new QLabel("name");
Label_3 = new QLabel("age");
Label_4 = new QLabel("score");
Button_1->setMinimumHeight(50);
Button_2->setMinimumHeight(50);
Button_3->setMinimumHeight(50);
Button_4->setMinimumHeight(50);
Button_5->setMinimumHeight(50);
connect(Button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked()));
connect(Button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
connect(Button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
connect(Button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
connect(Button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));
QGridLayout *layout = new QGridLayout;
layout->addWidget(Line_1,0,1,1,3,Qt::Alignment());
layout->addWidget(Line_2,1,1,1,3,Qt::Alignment());
layout->addWidget(Line_3,2,1,1,3,Qt::Alignment());
layout->addWidget(Line_4,3,1,1,3,Qt::Alignment());
layout->addWidget(Button_1,4,0,Qt::Alignment());
layout->addWidget(Button_2,4,1,Qt::Alignment());
layout->addWidget(Button_3,4,2,Qt::Alignment());
layout->addWidget(Button_4,4,3,Qt::Alignment());
layout->addWidget(Button_5,5,0,1,4,Qt::Alignment());
layout->addWidget(Label_1,0,0,Qt::Alignment());
layout->addWidget(Label_2,1,0,Qt::Alignment());
layout->addWidget(Label_3,2,0,Qt::Alignment());
layout->addWidget(Label_4,3,0,Qt::Alignment());
layout->setMargin(12);
centerWindow->setLayout(layout);
}
void MainWindow::button_1_clicked()
{
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");//数据库服务器ip
db.setUserName("root");//数据库用户名
db.setPassword("123456");//数据库密码
db.setDatabaseName("mydata");//使用哪个数据库
//端口号就使用默认的3306吧,因为在本地
if( !db.open() )//打开数据库,如果返回false表示打开失败
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}else
{
QMessageBox::warning(this,"恭喜~~~","Mysql连接成功!");
}
QSqlQuery query;
QString sql = "create table student(id int primary key auto_increment,name varchar(255),age int,score int);";
query.exec(sql);
}
void MainWindow::button_2_clicked()
{
if(!db.open() )
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}
int id = Line_1->text().toInt();
QString name = Line_2->text();
int age = Line_3->text().toInt();
int score = Line_4->text().toInt();
QString sql = QString("insert into student(id,name,age,score) values('%1','%2','%3','%4')").arg(id).arg(name).arg(age).arg(score);
QSqlQuery query;
query.exec(sql);
}
void MainWindow::button_3_clicked()
{
if(!db.open() )
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}
int id = Line_1->text().toInt();
QString name = Line_2->text().toUtf8();
int age = Line_3->text().toInt();
int score = Line_4->text().toInt();
QString sql = QString("update student set id='%1',name='%2',age='%3',score='%4' ").arg(id).arg(name).arg(age).arg(score);
QSqlQuery query;
query.exec(sql);
}
void MainWindow::button_4_clicked()
{
if(!db.open() )
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}
int id = Line_1->text().toInt();
QString sql = QString("delete from student where id = '%1'").arg(id);
QSqlQuery query;
query.exec(sql);
}
void MainWindow::button_5_clicked()
{
if(!db.open() )
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}
tableWidget = new QTableWidget(8,4);
tableWidget->setWindowTitle("mydata surface");
tableWidget->resize(420, 200); //设置表格
QStringList header;
header<<"id"<<"name"<<"age"<<"score";
tableWidget->setHorizontalHeaderLabels(header);
tableWidget->setItem(0,0,new QTableWidgetItem(""));
tableWidget->setItem(1,0,new QTableWidgetItem(""));
tableWidget->setItem(2,0,new QTableWidgetItem(""));
tableWidget->setItem(0,1,new QTableWidgetItem(""));
tableWidget->setItem(1,1,new QTableWidgetItem(""));
tableWidget->setItem(2,1,new QTableWidgetItem(""));
tableWidget->show();
QString sqlstr="select id,name,age,score from student;";//查询语句
QSqlQuery query;
query.prepare(sqlstr);//准备
int i=0;
if(query.exec())
{
while(query.next())
{
tableWidget->setRowCount(i+1);//设置表格行数
tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString()));
tableWidget->item(i,0)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
tableWidget->item(i,1)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
tableWidget->item(i,2)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
tableWidget->setItem(i,3,new QTableWidgetItem(query.value(3).toString()));
tableWidget->item(i,3)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
i++;
}
}
}
源码详解
画窗口内的按钮等 自定义接口 (函数)myLayout 看注释。
void MainWindow::myLayout()
{
QWidget *centerWindow = new QWidget; //声明一个QWidget 类 用于连接QGridLayout 画窗口布局
this->setCentralWidget(centerWindow);
Button_1 = new QPushButton("连接MySql"); //在头文件中声明一个 QPushButton类的指针 *button_1 然使用new 初始化按钮属性,并建立对象空间。
Button_2 = new QPushButton("添加数据"); //同上
Button_3 = new QPushButton("更新数据"); //同上
Button_4 = new QPushButton("删除数据"); //同上
Button_5 = new QPushButton("显示当前表号数据"); //同上
Line_1 = new QLineEdit;
Line_2 = new QLineEdit;
Line_3 = new QLineEdit;
Line_4 = new QLineEdit;
Label_1 = new QLabel("id");
Label_2 = new QLabel("name");
Label_3 = new QLabel("age");
Label_4 = new QLabel("score");
Button_1->setMinimumHeight(50); //设置按钮的高度
Button_2->setMinimumHeight(50);
Button_3->setMinimumHeight(50);
Button_4->setMinimumHeight(50);
Button_5->setMinimumHeight(50);
connect(Button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked())); //连接按钮与接口,使其监听到点击按钮信号时,调用,按钮对象里的代码。
connect(Button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
connect(Button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
connect(Button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
connect(Button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));
QGridLayout *layout = new QGridLayout; //声明一个网格布局的QGridLayout类控件 用坐标的形式设计 控件的位置
layout->addWidget(Line_1,0,1,1,3,Qt::Alignment()); // 0,1,1,3 对应x,y,长,高。
layout->addWidget(Line_2,1,1,1,3,Qt::Alignment());
layout->addWidget(Line_3,2,1,1,3,Qt::Alignment());
layout->addWidget(Line_4,3,1,1,3,Qt::Alignment());
layout->addWidget(Button_1,4,0,Qt::Alignment());
layout->addWidget(Button_2,4,1,Qt::Alignment());
layout->addWidget(Button_3,4,2,Qt::Alignment());
layout->addWidget(Button_4,4,3,Qt::Alignment());
layout->addWidget(Button_5,5,0,1,4,Qt::Alignment());
layout->addWidget(Label_1,0,0,Qt::Alignment());
layout->addWidget(Label_2,1,0,Qt::Alignment());
layout->addWidget(Label_3,2,0,Qt::Alignment());
layout->addWidget(Label_4,3,0,Qt::Alignment());
layout->setMargin(12);
centerWindow->setLayout(layout);
}
接口按钮button_1_clicked() 详解 看注释
void MainWindow::button_1_clicked()
{
QSqlDatabase db; //QSqlDatabase类处理与数据库的连接,要使用这个类,头文件需要导入QSqlDatabase库:
db = QSqlDatabase::addDatabase("QMYSQL"); //设置QSqlDatabase 类型 的db 用于设置连接数据库的参数
db.setHostName("127.0.0.1");//数据库服务器ip
db.setUserName("root");//数据库用户名
db.setPassword("123456");//数据库密码
db.setDatabaseName("mydata");//使用哪个数据库
//端口号就使用默认的3306吧,因为在本地
db.setPort(3306); //设置连接端口
if( !db.open() )//打开数据库,如果返回false表示打开失败
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}else
{
QMessageBox::warning(this,"恭喜~~~","Mysql连接成功!");
}
QSqlQuery query; //QSqlQuery类提供了一个用于执行SQL语句和浏览查询的结果集的接口。
QString sql = "create table student(id int primary key auto_increment,name varchar(255),age int,score int);"; //建立一个QString 型字符串,用于存储MYSQL的命令
query.exec(sql); //使用接口调用命令
画表格类控件QTableWidget类接口函数 button_5_clicked() 详解,看注释
void MainWindow::button_5_clicked()
{
if(!db.open() ) //检测服务器是否打开,在工程中,我使用的是全局变量,用于监测服务器是否打开的状态
{
QMessageBox::warning(this,"错误",db.lastError().text() );//打开失败,显示错误信息
return;
}
tableWidget = new QTableWidget(8,4); //初始化 tableWidget 设置表格8行4列
tableWidget->setWindowTitle("mydata surface");
tableWidget->resize(420, 200); //设置表格
QStringList header;
header<<"id"<<"name"<<"age"<<"score";
tableWidget->setHorizontalHeaderLabels(header);
tableWidget->setItem(0,0,new QTableWidgetItem("")); //初始化表
tableWidget->setItem(1,0,new QTableWidgetItem(""));
tableWidget->setItem(2,0,new QTableWidgetItem(""));
tableWidget->setItem(0,1,new QTableWidgetItem(""));
tableWidget->setItem(1,1,new QTableWidgetItem(""));
tableWidget->setItem(2,1,new QTableWidgetItem(""));
tableWidget->show(); //使其通过打开一个窗口打开表
QString sqlstr="select id,name,age,score from student;";//使用MYSQL查询语句获取表的数据 ,写入tableWidget中
QSqlQuery query;
query.prepare(sqlstr);//准备
int i=0;
if(query.exec())
{
while(query.next())
{
tableWidget->setRowCount(i+1);//设置表格行数,每一次加一行
tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString())); //将从数据库中表获取的数据写入到tableWidget 表中
tableWidget->item(i,0)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
tableWidget->item(i,1)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
tableWidget->item(i,2)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
tableWidget->setItem(i,3,new QTableWidgetItem(query.value(3).toString()));
tableWidget->item(i,3)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
i++;
}
}
}
心得
框架设计,使用myLayout 画出控件的位置并展现到窗口中,使用QLineEdit,获取数据,通过点击按钮调用按钮对象,通过MYSQL语句命令写入到数据库表内,整个app工具设置,采用纯代码形式,方便WIndow与Ubuntu操作系统代码移植方便。
相关文章
- MySQL数据库Binlog解析工具--binlog2sql
- QT连接mysql(解决QT5.12无mysql驱动)
- mysql InnoDB事务
- 在新机器部署Qt+mysql程序
- qt编译mysql插件
- 记录一个mysql按日期分组统计的查询
- Mysql常用函数操作
- RDS for MySQL 空间问题的原因和解决
- 基于javaEE+jqueryEasyUi+eclipseLink+MySQL的课程设计客房管理信息系统【100010148】
- 基于QT(C++)+Mysql实现的带GUI的图书管理系统【100010047】
- Qt 连接MySQL数据库(很多相关文章)
- shell处理mysql增、删、改、查
- mysql按照天统计报表,当天没有数据,填0
- Mysql学习---基础操作学习
- Mysql 行列转换
- mysql pt-osc
- Windows下命令行怎样登录MySQL
- ubuntu下安装mysql