QT上位机绘制一个表格显示MYSQL数据库(六)

目录

一. QT制作MYSQL表格

二. 自定义exe图标

三. 打包

1. 编译

2. 选择打包工具

3. 开始打包

4. 使用QMySQL去连接MySQL

(1) 安装 MySQL

(2) 配置path环境变量

(3) QT安装MySQL数据库驱动

1) 首先打开MySQL安装目录下的lib文件夹

2) 找到Qt安装目录下sql驱动中的mysql文件夹

3) 生成Qt的MySQL动态链接库

4) 复制驱动文件到Qt的sqldrivers文件夹中

5) 完成

(4) 更改连接数据库的代码

(5) 打包的时候加上链接文件

(6) 成功在任意电脑打开软件连接MySQL

四. 参考链接


一. 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图标

图标下载网站

iconfont-阿里巴巴矢量图标库icon-default.png?t=N7T8https://www.iconfont.cn/search/index?searchType=icon&q=ico&page=1&fromCollection=-1PNG转换ICO

PNG转ICO - 免费在线将PNG文件转换成ICO (cdkm.com)icon-default.png?t=N7T8https://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博客icon-default.png?t=N7T8https://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路径下

(6) 成功在任意电脑打开软件连接MySQL

四. 参考链接

Qt 5 MySQL数据库驱动没有加载(QSqlDatabase: QMYSQL driver not loaded)的解决方法_qsqldatabase::drivers没有qmysql-CSDN博客

Qt连接MySQL数据库(保姆级成功版教程)_qt链接数据库,数据库路径如何写-CSDN博客

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值