1、使用sqlite:
首先,打开.pro
文件,在开头添加一句:
QT += sql
(sqlite
多打了个l
,不要在意。。。)
打开mainwindow.cpp
或main.cpp
,添加数据库创建和操作代码。
(1)创建数据库连接:
mainwindow.h
中添加库文件:
#include <QSqlDatabase>
#include <QSqlError>
mainwindow.cpp
中数据库连接:
//连接数据库
QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setHostName("localhost");//设置你本地服务器的IP
database.setDatabaseName("MyDataBase.db"); //这里的db文件是临时的,可以指定为本地的db文件
database.setUserName("root"); //用户名
database.setPassword("123"); //密码</span>
if (!database.open())
{
qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
qDebug() << "Succeed to connect database." ;
}
database.close();
上面代码中db
数据库文件是临时的,可以有如下指定:
database.setDatabaseName("E:/1/MyDataBase.db");
那么当这个db
文件存在时,就会访问这个db
文件,不存在时,上面的代码会创建这个db
文件。
(2)数据库操作:
mainwindow.h
中引入QSqlQuery
:
#include <QSqlQuery>
mainwindow.cpp
中添加代码:
database.open();
//数据库操作对象
QSqlQuery sql_query;
//创建表格
if(!sql_query.exec("create table add1(date date primary key, time text, rollnm int,coordinate text,x float,y float,classify int,level int,Graydifference float,area float,lengthofwidth float)"))
{
qDebug() << "Error: Fail to create table."<< sql_query.lastError();
}
else
{
qDebug() << "Table created!";
}
//插入数据
if(!sql_query.exec("INSERT INTO add1 VALUES('2017-12-28', time('now'),3,'(21,2)',21,41,1,3,23,11,23)"))
{
qDebug() << sql_query.lastError();
}
else
{
qDebug() << "inserted add1!";
}
//查询
sql_query.exec("select * from add1");
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
while(sql_query.next())
{
QString date= sql_query.value(0).toString();
QString time= sql_query.value(1).toString();
int rollnm = sql_query.value(2).toInt();
QString coordinate= sql_query.value(3).toString();
float x=sql_query.value(4).toFloat();
float y=sql_query.value(5).toFloat();
int classify=sql_query.value(6).toInt();
int level=sql_query.value(7).toInt();
float Graydifference=sql_query.value(8).toFloat();
float area=sql_query.value(9).toFloat();
float lengthofwidth=sql_query.value(10).toFloat();
//qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
qDebug()<<QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11").arg(date).arg(time).arg(rollnm).arg(coordinate).arg(x).arg(y).arg(classify).arg(level).arg(Graydifference).arg(area).arg(lengthofwidth);
}
}
database.close();
代码参考自:https://blog.csdn.net/weixin_41656968/article/details/80473137
注意,exec
执行sql
时,运行的代码放在database.open()
和database.close()
中间, 每段exec
执行的sql
前面都需要添加一个QSqlQuery sql_query
,否则会报错数据库未打开。
输出结果:
关于sqlite
可以结合SQLite Administrator
来使用,可以直接打开db文件和执行sql
语句:
2、在Table Widget表格中显示从数据库查询的数据:
结合昨天的,来把数据库中查询出来的数据插入到tabel widget的表格中。
插入好以后,先把插入数据的代码注释掉。接着修改数据库查询的代码:
//查询
sql_query.exec("select * from add1");
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{ int k=0; //行标志
while(sql_query.next())
{
QString date= sql_query.value(0).toString();
QString time= sql_query.value(1).toString();
QString rollnm = sql_query.value(2).toString();
QString coordinate= sql_query.value(3).toString();
QString x=sql_query.value(4).toString();
QString y=sql_query.value(5).toString();
QString classify=sql_query.value(6).toString();
QString level=sql_query.value(7).toString();
QString Graydifference=sql_query.value(8).toString();
QString area=sql_query.value(9).toString();
QString lengthofwidth=sql_query.value(10).toString();
ui->tableWidget->setItem(k,0,new QTableWidgetItem(date));
ui->tableWidget->item(k, 0)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,1,new QTableWidgetItem(time));
ui->tableWidget->item(k, 1)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,2,new QTableWidgetItem(rollnm));
ui->tableWidget->item(k, 2)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,3,new QTableWidgetItem(coordinate));
ui->tableWidget->item(k, 3)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,4,new QTableWidgetItem(x));
ui->tableWidget->item(k, 4)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,5,new QTableWidgetItem(y));
ui->tableWidget->item(k, 5)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,6,new QTableWidgetItem(classify));
ui->tableWidget->item(k, 6)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,7,new QTableWidgetItem(level));
ui->tableWidget->item(k, 7)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,8,new QTableWidgetItem(Graydifference));
ui->tableWidget->item(k, 8)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,9,new QTableWidgetItem(area));
ui->tableWidget->item(k, 9)->setTextAlignment(Qt::AlignCenter);//居中显示
ui->tableWidget->setItem(k,10,new QTableWidgetItem(lengthofwidth));
ui->tableWidget->item(k, 10)->setTextAlignment(Qt::AlignCenter);//居中显示
k+=1;
}
}
由于试了好几遍都没能把float()
和int()
在表格中显示出来(单元格显示空),所以干脆把数据都转换成了字符串成功显示出来。
修改显示行数:
sql_query.exec("select count(*) from add1");
if(sql_query.first())
{
int rownm=sql_query.value(0).toInt();
ui->tableWidget->setRowCount(rownm); //设置表格行数
}
程序运行结果:
刚刚插入表格中的数据就显示在表格中了。之后开始研究边缘端插数据,本地端读数据。
3、打包生成exe文件:
点击左下角的小电脑,选择想要生成的项目,构建选择Release:
点击运行程序。
执行完以后,打开项目地址生成的release
文件夹:
接着,打开Release
文件夹,将生成的exe
文件拷贝出来,放到一个单独的目录,比如:e://demo
,由于程序中还有用到的一些依赖,所以还需要把依赖的 dll
文件拷贝过来,怎么拷贝看下面。
点击搜索框,搜索QT:
有可能会像我一样,出现多个编译器,这里选择 Qt5.14.1(MSVC)
。
打开进入到e://demo
,并执行 windeployqt+程序名.exe
:
执行完以后,dll
文件就拷贝好了:
4、日常报错:
点击运行程序,无法定位程序输入点于动态链接库:
如上图所示,搜索qt的时候出现了三个编译器,因为我安装qt时选择了好几个版本。。。重新选择编译器为qt5.14.1(MSVC)
,删掉原有的dll
,重新运行编译器复制dll就可以了。