目录
一. QT制作MYSQL表格
database.cpp
#include "database.h"
#include "ui_database.h"
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
database::database(QWidget *parent) :
QWidget(parent),
ui(new Ui::database)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("test");
// db.setHostName("47.116.118.86");
// db.setPort(3306);
// db.setDatabaseName("qtsql");
// db.setUserName("qt");
// db.setPassword("zhongkeruihe");
bool ok = db.open();
if (ok){
// QMessageBox::information(this, "infor", "success");
qDebug()<<"success";
}
else {
QMessageBox::information(this, "警告!", "DataBase Open Failed,Check whether there is a database or whether the parameters are correct!!!");
qDebug()<<"error open database because"<<db.lastError().text();
ui->label->setText(db.lastError().text());
}
//查询所有并放入表中
SelectAllPushTableData();
//初始化表格 格式
ui->tableView->setColumnWidth(0,80);
ui->tableView->setColumnWidth(1,150);
ui->tableView->setColumnWidth(2,70);
ui->tableView->setColumnWidth(3,70);
ui->tableView->setColumnWidth(4,70);
ui->tableView->setColumnWidth(5,70);
ui->tableView->setColumnWidth(6,70);
ui->tableView->setColumnWidth(7,70);
/*初始化下拉框*/
ui->comboBox->addItem("temp");
ui->comboBox->addItem("humi");
ui->comboBox->addItem("light");
ui->comboBox->addItem("soil");
ui->comboBox->addItem("mq2");
ui->comboBox->addItem("rain");
/*设置日期查询的初始化*/
ui->dateTimeEdit_2->setDateTime(QDateTime::currentDateTime().addSecs(0));
ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime().addSecs(0));
setFixedSize(750,650);
setWindowTitle("——数据库管理平台——");
}
void database::SelectAllPushTableData(){
tableModel = new QSqlQueryModel;//定义一个数据库模型,指定父对象
QString strSelectData = "select * from qtdata";
tableModel->setQuery(strSelectData);
ui->tableView->setModel(tableModel);
}
void database::UpdataToDataBase(QString Stemp,QString Shumi,QString Slight,QString Ssoil,QString Smq2,QString Srain)
{
float val[6];
val[0] = Stemp.toFloat();
val[1] = Shumi.toFloat();
val[2] = Slight.toFloat();
val[3] = Ssoil.toFloat();
val[4] = Smq2.toFloat();
val[5] = Srain.toFloat();
// qDebug()<<val[0]<<" "<<val[1]<<" "<<val[2]<<" "<<val[3]<<" "<<val[4]<<" "<<val[5]<<" "<<" ";
//插入
insertData(val);
//查询并全部显示
SelectAllPushTableData();
}
//插入数据
bool database::insertData(float val[6])
{
QSqlQuery query;
//QDateTime currentTime = QDateTime::currentDateTime();
QString stInsertData = "insert into qtdata values (?,?,?,?,?,?,?,?)";
query.prepare(stInsertData);
query.addBindValue(NULL);
query.addBindValue(QDateTime::currentDateTime().addSecs(0).toString("yyyy-MM-dd hh:mm:ss"));
query.addBindValue(val[0]);
query.addBindValue(val[1]);
query.addBindValue(val[2]);
query.addBindValue(val[3]);
query.addBindValue(val[4]);
query.addBindValue(val[5]);
if(!query.exec())
{
qDebug()<<query.lastError();
}
return true;
}
//清空表
bool database::clearDBTable()
{
QSqlQuery query;
QString strClearDB = "delete from qtdata";
query.prepare(strClearDB);
if(!query.exec())
{
qDebug()<<query.lastError();
}
return true;
}
//日期查询
void database::SelectData()
{
tableModel = new QSqlQueryModel;//定义一个数据库模型,指定父对象
QString startTime = ui->dateTimeEdit->text();
QString startTime2 = ui->dateTimeEdit_2->text();
//查询操作
QString strSelectData = "select *from qtdata where CurrenTime between '"+startTime+"' and '"+startTime2+"';";
tableModel->setQuery(strSelectData);
ui->tableView->setModel(tableModel);
}
database::~database()
{
delete ui;
}
//退出
void database::on_exit_bt_clicked()
{
this->close();
}
//查询按钮 ->查询指定日期
void database::on_select_data_bt_clicked()
{
SelectData();
}
//显示所有
void database::on_displayAll_bt_clicked()
{
SelectAllPushTableData();
}
//now
void database::on_now_bt_clicked()
{
//当前时间
ui->dateTimeEdit_2->setDateTime(QDateTime::currentDateTime().addSecs(0));
}
//最近一天
void database::on_currDay_bt_clicked()
{
//上一天
ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime().addSecs(-3600*24));
//当前时间
ui->dateTimeEdit_2->setDateTime(QDateTime::currentDateTime().addSecs(0));
SelectData();
}
//最近三天
void database::on_currThDay_bt_clicked()
{
//三天前天
ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime().addSecs(-3600*24*3));
//当前时间
ui->dateTimeEdit_2->setDateTime(QDateTime::currentDateTime().addSecs(0));
SelectData();
}
//最近一周
void database::on_currWeek_bt_clicked()
{
//七天前
ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime().addSecs(-3600*24*7));
//当前时间
ui->dateTimeEdit_2->setDateTime(QDateTime::currentDateTime().addSecs(0));
SelectData();
}
//条件查询
void database::on_select_val_bt_clicked()
{
//获取索引值
QString strNum = ui->comboBox->currentText();
//获取上下值
QString downNum = ui->spinBox->text();
QString upNum = ui->spinBox_2->text();
//查询操作
QString strSelectData = "select *from qtdata where "+strNum+" >= "+downNum+" && "+strNum+"<="+upNum+";";
tableModel->setQuery(strSelectData);
ui->tableView->setModel(tableModel);
}
//添加
/*
void database::on_add_bt_clicked()
{
//插入数据
// insertData();
//查询并显示
SelectAllPushTableData();
}*/
//清空表按钮
void database::on_clear_bt_clicked()
{
clearDBTable();
SelectAllPushTableData();
}
database.h
#ifndef DATABASE_H
#define DATABASE_H
#include <QWidget>
#include <QSqlQueryModel>
#include <QSqlQuery>
namespace Ui {
class database;
}
class database : public QWidget
{
Q_OBJECT
public:
explicit database(QWidget *parent = nullptr);
~database();
//查询所有并放入表中
void SelectAllPushTableData();
bool insertData(float val[6]);
bool clearDBTable();
void SelectData();
void UpdataToDataBase(QString Stemp,QString Shumi,QString Slight,QString Ssoil,QString Smq2,QString Srain);
//table 类
QSqlQueryModel *tableModel;
private slots:
void on_exit_bt_clicked();
void on_select_data_bt_clicked();
void on_displayAll_bt_clicked();
void on_now_bt_clicked();
void on_currDay_bt_clicked();
void on_currThDay_bt_clicked();
void on_currWeek_bt_clicked();
void on_select_val_bt_clicked();
void on_clear_bt_clicked();
private:
Ui::database *ui;
};
#endif // DATABASE_H
main.cpp
#include "database.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
database w;
w.show();
return a.exec();
}
二. 自定义exe图标
图标下载网站
PNG转ICO - 免费在线将PNG文件转换成ICO (cdkm.com)https://cdkm.com/cn/png-to-ico这个其实很简单,只需要把图标文件xxx.ico
放到工程文件的目录(和主文件所在的那个文件夹)中:
然后再打开工程文件QT_MySQL.pro
,在最后一行添加语句:RC_ICONS = xxx.ico
比如我这里想把一个名为app
的图标文件做exe的图标,就像下图这样在pro文件末尾补加一条:RC_ICONS = app.ico
三. 打包
强调:使用Qt自带的打包工具
1. 编译
按release方式编译整个工程,把release目录下的可执行文件拷贝到一个空文件夹里面(这个文件夹用来为这个exe存放配套的动态库,以便exe能在其他机器上运行,也就是我们所说的打包里面的那个“包”)。
2. 选择打包工具
我们根据工程设置的编译工具,选择Qt 5.12.9 (MinGW 7.3.0 64-bit)这个命令工具
3. 开始打包
运行Qt 5.12.9 MinGW 7.3.0 64-bit.exe
,切换到上一步把QT_MySQL.exe放到的那个文件夹,命令形式是
cd 文件夹绝对路径
然后使用打包命令:
windeployqt QT_MySQL.exe
这条命令会把Notepad.exe运行时所需要的所有动态库拷贝到这个目录下,也就充实了我们的这个包。
ok,打包完成了,把这个文件夹看成一个整体,拷贝····· 到不同的机器上,我们的QT_MySQL.exe都能运行,这就达到了打包的目的。
但是这样打包之后,虽然可以运行,我们在别人没有配置ODBC的电脑还是无法连接数据库,这时候我们就发现一个大问题了,使用ODBC去连接MySQL无法进行打包,我们只能更换方法
使用ODBC去连接MySQL无法进行打包,我们只能更换方法
使用ODBC去连接MySQL无法进行打包,我们只能更换方法
使用ODBC去连接MySQL无法进行打包,我们只能更换方法
4. 使用QMySQL去连接MySQL
(1) 安装 MySQL
参考链接
MySQL安装教程(详细版)_mysql安装教程8.0.36-CSDN博客https://blog.csdn.net/m0_71422677/article/details/136007088
(2) 配置path环境变量
① 此电脑->属性->高级系统设置->环境变量
② 双击path->右上角新建
③把这两个路径添加进去,最后确定
(3) QT安装MySQL数据库驱动
可以先查看自己QT里面有没有MySQL驱动
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
结果可知QT默认没有MySQL数据库的驱动,原因是:随着商业版MySQL推出,MySQL不再是一个完全开源的数据库了,而Qt默认只会给完全开源的数据库提供支持。那么我们如何给Qt添加MySQL驱动呢?
1) 首先打开MySQL安装目录下的lib文件夹
如:C:\Program Files\MySQL\MySQL Server 8.0\bin
打开后选择 libmysql.dll 和 libmysql.lib ,复制:
然后,将其粘贴到 Qt的MinGW编译器的bin文件夹下,楼主的bin文件夹的地址为:
D:\Qt\Qtv\5.12.9\mingw73_64\bin
2) 找到Qt安装目录下sql驱动中的mysql文件夹
这是楼主的地址:
"D:\Qt\Qtv\5.12.9\Src\qtbase\src\plugins\sqldrivers\mysql"
我们可以把它复制到桌面打开,也可以直接打开。我会复制到桌面。
3) 生成Qt的MySQL动态链接库
打开桌面的mysql文件夹,打开其中的mysql Qt工程文件:
将其.pro工程配置文件修改为如下:
TARGET = qsqlmysql
#添加 MySQL 的 include 路径
INCLUDEPATH += "C:\Program Files\MySQL\MySQL Server 8.0\include"
#添加 MySQL的 libmysql.lib 路径,为驱动的生成提供lib文件
LIBS += "C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.lib"
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#注释掉这一段
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
# 生成 dll 驱动文件的目录地址
DESTDIR = D:\Qt\Qtv\5.12.9\Src\qtbase\src\plugins\sqldrivers\mysql\lib
运行此工程(只管运行如有报错不用管),运行后,打开桌面mysql的lib文件夹,可以发现新生成的4个文件:
4) 复制驱动文件到Qt的sqldrivers文件夹中
把上图的四个文件都复制,并粘贴到
D:\Qt\Qtv\5.12.9\mingw73_64\plugins\sqldrivers
这是我的地址,大家的地址可能都不一样
5) 完成
现在,我们已经成功给Qt添加了MySQL的驱动!
接下来重启Qt,进行测试,继续使用下面的代码打印Qt支持的数据库驱动
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
可以发现已经有MySQL的驱动啦!
可以发现已经有MySQL的驱动啦!
可以发现已经有MySQL的驱动啦!
这样我们就可以在Qt中正常使用MySQL了
并且我们在使用QT编译器的时候位数要和MySQL的位数一致
我的MySQL位数是64位,所以编译器也选择64位
(4) 更改连接数据库的代码
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("47.116.118.86"); //连接数据库主机名,这里需要注意(若填的为”127.0.0.1“,出现不能连接,则改为localhost)
db.setPort(3306); //连接数据库端口号,与设置一致
db.setDatabaseName("qtsql"); //连接数据库名,与设置一致
db.setUserName("qt"); //数据库用户名,与设置一致
db.setPassword("zhongkeruihe"); //数据库密码,与设置一致
(5) 打包的时候加上链接文件
1. libmysql.dll
2. libmysql.lib
3. libcrypto-3-x64.dll。
4. libssl-3-x64.dll。
我这四个文件的路径是在C:\Program Files\MySQL\MySQL Server 8.0\bin
5. 再把之前通过Qt生成的四个文件粘贴到打包的文件夹中sqldrivers路径下