一、环境介绍
操作系统: win10 64位
QT版本: QT5.12.6
编译器: MinGW 32
二、功能介绍
需要将服务器上传的温度、湿度、经度、纬度、数据存放到数据库,并查询最高温度和最低温度。
三、相关代码
3.1 pro文件
QT += sql
3.2 创建数据库并新建表
//登录存储数据库名称
#define LOG_IN_DATABASE_NAME "xl_DataBase.db"
//登录数据库连接名称
#define LOG_IN_DATABASE_CONNECT_NAME "qt_sql_login_connection"
QSqlDatabase database;
//设置并打开数据库
if (QSqlDatabase::contains(LOG_IN_DATABASE_CONNECT_NAME))
{
database = QSqlDatabase::database(LOG_IN_DATABASE_CONNECT_NAME);
}
else
{
//数据库类型
database = QSqlDatabase::addDatabase("QSQLITE",LOG_IN_DATABASE_CONNECT_NAME);
database.setDatabaseName(LOG_IN_DATABASE_NAME); //数据库名称
database.setUserName("xl"); //用户名
database.setPassword("123456"); //密码
}
//打开数据库,如果数据库存在就打开,不存在就自动创建
if(database.open()==false)
{
Log_Text_Display("数据库打开失败.请检查程序运行路径和权限.\n");
}
else
{
Log_Text_Display("连接数据库成功.\n");
}
//数据库: 建表,如果存在就不创建,不存在就创建
QSqlQuery sql_query(database);
//下面语句查询名称为CarData 的表是否存在.
sql_query.exec(QString("select count(*) from sqlite_master where type='table' and name='%1'").arg("CarData"));
if(sql_query.next())
{
if(sql_query.value(0).toInt()==0)
{
Log_Text_Display("数据库表是不存在的.准备创建.\n");
//创建表格 创建表格语句:create table <table_name> (f1 type1, f2 type2,…);
/* CREATE TABLE 是告诉数据库系统创建一个新表的关键字。
* CREATE TABLE 语句后跟着表的唯一的名称
* 或标识*/
/*下面的语句: 创建一个名称为CarData的表,字段分别是存放 时间、温度、湿度、经度、纬度*/
QString create_sql = "create table CarData(id int primary key, time varchar(100),temperature varchar(100), humidity varchar(100),longitude varchar(100),latitude varchar(100))";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{
Log_Text_Display("数据库表创建失败.\n");
}
else
{
Log_Text_Display("数据库表创建成功.\n");
}
}
else
{
Log_Text_Display("数据库表是存在的.不需要创建.\n");
}
}
3.3 插入数据
//客户端模式:读取服务器发过来的数据
//温湿度: #123,456,120.086199,30.139219
//分别表示: 温度、湿度、经度、纬度
void Widget::LocalTcpClientReadDtatSlot()
{
QString array=LocalTcpClientSocket->readAll();
QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间
QString time_str = time.toString("yyyy-MM-dd hh:mm:ss"); //设置显示格式
QString text;
text +=array;
text +="\n";
Log_Text_Display(text);
//解析数据
if(array.at(0)=='#')
{
array.remove('#');
QString T_str=array.section(',',0,0); //温度
QString H_str=array.section(',',1,1); //湿度
QString jin_str=array.section(',',2,2); //经度
QString wei_str=array.section(',',3,4); //纬度
ui->label_H->setText(H_str+"%");
ui->label_Temp->setText(T_str+"℃");
ui->label_latitude->setText(wei_str);
ui->label_longitude_jin->setText(jin_str);
//保存数据到数据库
QSqlQuery sql_query(database);
//查询最大ID
QString select_max_sql = "select max(id) from CarData";
int max_id = 0;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{
Log_Text_Display("数据库最大ID查找失败.\n");
}
else
{
while(sql_query.next())
{
max_id = sql_query.value(0).toInt();
}
Log_Text_Display(QString("data base max id:%1\n").arg(max_id));
//添加数据
//插入数据 插入语句:insert into <table_name> values (value1, value2,…);
QString insert_sql = tr("insert into CarData values(?,?,?,?,?,?)");
sql_query.prepare(insert_sql);
sql_query.addBindValue(max_id+1); //id
sql_query.addBindValue(time_str); //时间
sql_query.addBindValue(T_str); //温度
sql_query.addBindValue(H_str); //湿度
sql_query.addBindValue(jin_str); //经度
sql_query.addBindValue(wei_str); //纬度
if(!sql_query.exec())
{
Log_Text_Display("数据插入失败.\n");
}
}
}
}
3.4 查询数据
/*
工程: CarControl
日期: 2021-04-28
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 历史最高温度
*/
void Widget::on_pushButton_tempH_clicked()
{
//指定操作的数据库
QSqlQuery sql_query(database);
//查询全部数据
sql_query.prepare("select * from CarData");
if(!sql_query.exec())
{
Log_Text_Display("数据库查询错误.\n");
}
else
{
QString T_max_time; //最高温度所在的时间
int T_max=0; //最高温度
int t_tmp=0; //当前温度
QString H_max_time; //最高湿度所在的时间
int H_max=0; //最高湿度
int h_tmp=0; //当前湿度
while(sql_query.next())
{
// int id = sql_query.value(0).toInt(); //ID
QString time = sql_query.value(1).toString(); //时间
QString T_str = sql_query.value(2).toString(); //温度
QString H_str = sql_query.value(3).toString(); //湿度
QString jin_str = sql_query.value(4).toString(); //经度
QString wei_str = sql_query.value(5).toString(); //纬度
//比较温度
t_tmp=T_str.toInt();
if(t_tmp>T_max)
{
T_max=t_tmp;
T_max_time=time;
}
//比较湿度
h_tmp=H_str.toInt();
if(h_tmp>H_max)
{
H_max=h_tmp;
H_max_time=time;
}
}
QString show_text=QString("最高温度:%1,时间:%2\n").arg(T_max).arg(T_max_time);
show_text+=QString("最高湿度度:%1,时间:%2\n").arg(H_max).arg(H_max_time);
QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_temp_data;
//设置光标到文本末尾
plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
//当文本数量超出一定范围就清除
if(plainTextEdit_log->toPlainText().size()>1024*4)
{
plainTextEdit_log->clear();
}
plainTextEdit_log->insertPlainText(show_text);
//移动滚动条到底部
QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar();
if(scrollbar)
{
scrollbar->setSliderPosition(scrollbar->maximum());
}
}
}
/*
工程: CarControl
日期: 2021-04-28
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 历史最低温度
*/
void Widget::on_pushButton_tempL_clicked()
{
//指定操作的数据库
QSqlQuery sql_query(database);
//查询全部数据
sql_query.prepare("select * from CarData");
if(!sql_query.exec())
{
Log_Text_Display("数据库查询错误.\n");
}
else
{
QString T_min_time; //最低温度所在的时间
int T_min=28; //最低温度
int t_tmp=28; //当前温度
QString H_min_time; //最低湿度所在的时间
int H_min=80; //最低湿度
int h_tmp=80; //当前湿度
while(sql_query.next())
{
// int id = sql_query.value(0).toInt(); //ID
QString time = sql_query.value(1).toString(); //时间
QString T_str = sql_query.value(2).toString(); //温度
QString H_str = sql_query.value(3).toString(); //湿度
QString jin_str = sql_query.value(4).toString(); //经度
QString wei_str = sql_query.value(5).toString(); //纬度
//比较温度
t_tmp=T_str.toInt();
if(t_tmp<T_min)
{
T_min=t_tmp;
T_min_time=time;
}
//比较湿度
h_tmp=H_str.toInt();
if(h_tmp<H_min)
{
H_min=h_tmp;
H_min_time=time;
}
}
QString show_text=QString("最低温度:%1,时间:%2\n").arg(T_min).arg(T_min_time);
show_text+=QString("最低湿度度:%1,时间:%2\n").arg(H_min).arg(H_min_time);
QPlainTextEdit *plainTextEdit_log=ui->plainTextEdit_temp_data;
//设置光标到文本末尾
plainTextEdit_log->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
//当文本数量超出一定范围就清除
if(plainTextEdit_log->toPlainText().size()>1024*4)
{
plainTextEdit_log->clear();
}
plainTextEdit_log->insertPlainText(show_text);
//移动滚动条到底部
QScrollBar *scrollbar = plainTextEdit_log->verticalScrollBar();
if(scrollbar)
{
scrollbar->setSliderPosition(scrollbar->maximum());
}
}
}
3.5 清空数据表
/*
工程: CarControl
日期: 2021-04-28
作者: DS小龙哥
环境: win10 QT5.12.6 MinGW32
功能: 清空数据库
*/
void Widget::on_pushButton_clean_data_clicked()
{
QString cmd;
cmd = QString("delete from CarData");
QSqlQuery sql_query(database);
if(!sql_query.exec(cmd))
{
Log_Text_Display("delete table Error.\n");
}
}
3.6 SQLite数据管理工具
数据库存储之后,可以使用 SQLite数据管理工具.exe 进行查看。
下载地址: download.csdn.net/download/xi…