前言
- QT版本 5.9.9 32位
- 数据库 MySQL5.6
1. QT连接数据库
1.1 直接连接(大部分会失败)
- 创建空widget窗口
- 在.pro文件下添加sql模块
QT += core gui sql
- widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setDatabaseName("数据库名");
db.setUserName("用户名");
db.setPassword("密码");
bool ok = db.open();
if (ok){
qDebug()<<"sucess open database ";
}
else {
qDebug()<<"error open database ";
}
}
Widget::~Widget()
{
delete ui;
}
- 运行编译,如果输出sucess open database表示连接成功
否则失败,若报如下错误,建议直接采用第二种方法连接。
1.2 ODBC连接
- ODBC下载 官网下载
- 选择Qt对应的32位或64位版本,我这里选择32位,下载完成后直接安装就行
- 打开ODBC连接数据库,32位安装后可能也有64位的,不要选错了,选择32bit的
- 输入数据库信息
Data Source Name 是之后代码中 db.setDatabaseName参数,最好设置与所连接的数据库名一样,好理解
- 输入完成后点击test测试一下看是否连接成功,
- QT中连接代码 widget.cpp文件,pro文件中也要加sql
#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("127.0.0.1");
db.setHostName("8.130.35.24");
db.setPort(3306);
db.setDatabaseName("data"); //不是Database,记得别填错
db.setUserName("root");
db.setPassword("****");
bool ok = db.open();
if (ok){
qDebug()<<"sucess open database ";
}
else {
qDebug()<<"error open database ";
}
}
Widget::~Widget()
{
delete ui;
}
运行,连接成功
2. 读写数据库操作
- 查询表数据
//查询表数据
QSqlQuery query;
query.exec(" select * from users");//users为表名,*为所有列数据,可写列名选择目标列
while(query.next()){
qDebug()<<query.value("ID").toString(); //ID为对应列名称,toString为对应列的数据类型
qDebug(<<query.value("datetime").toString();//同上
- 插入表数据
QSqlQuery query;
query.exec("insert into door(datetime,ID) values ( '2023-05-08 22:16:58','12')");
- 读取表中最新一条数据
对应的表中必须有时间戳列
//查询表中的最新一条数据
QSqlQuery query;
query.exec("SELECT * FROM door ORDER BY datetime DESC LIMIT 1");//door为表名,datetime为时间戳所在列名,此句实现按datetime列实现降序排列
query.next();
qDebug()<<query.value("ID").toString();
qDebug()<<query.value("datetime").toString();
3.qt中设置表格展示数据库数据
- ui界面插入tablewidget 默认名称tablewidget
- 设置表格参数
ui->tableWidget->setRowCount(30);//设置行数
ui->tableWidget->setColumnCount(7);//设置列数
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"time"<< "tem"<< "hum"<<"pm1"<< "pm2"<< "pm10"<< "co");//设置表头
ui->tableWidget->setColumnWidth(0,130);//设置列宽
ui->tableWidget->setColumnWidth(1,70);
ui->tableWidget->setColumnWidth(2,70);
ui->tableWidget->setColumnWidth(3,70);
ui->tableWidget->setColumnWidth(4,70);
ui->tableWidget->setColumnWidth(5,70);
ui->tableWidget->setColumnWidth(6,70);
- 设置按钮,点击查询数据库表数据写入表格,在连接数据库成功以后
connect(ui->bt_chaxun, &QPushButton::clicked,this,&MainWindow::on_bt_chaxun_clicked);
void MainWindow::on_bt_chaxun_clicked(){
qDebug()<<connectsqlfalg;
if(connectsqlfalg){
QSqlQuery query;
//读取表中的最新30条数据
query.exec("SELECT * FROM data ORDER BY datetime DESC LIMIT 30"); //data 为表名 30代表获取30条数据
for(int i=0;i<30;i++)
{
query.next();
QString tem = query.value("tem").toString();
QString hum = query.value("hum").toString();
QString pm1 = query.value("pm1").toString();
QString pm2 = query.value("pm2").toString();
QString pm10 = query.value("pm10").toString();
QString co = query.value("co").toString();
QString datetime = query.value("datetime").toString();
int j=0;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(datetime));//第i行第j列
j++;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(tem));
j++;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(hum));
j++;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(pm1));
j++;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(pm2));
j++;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(pm10));
j++;
ui->tableWidget->setItem(i,j, new QTableWidgetItem(co));
}
}
else
{
QMessageBox::critical(this, QLatin1String("Error"), QLatin1String("连接数据库失败"));
}
}