课程设计总结之Qt(1)

经过这几天不断百度、查看博客,终算是把这个课程设计完成了。在此写篇博客来总结身为Qt小白的我在这几天的流程和遇到的问题。

在开始这个课程设计前,我们上了一门用VB和ACCESS进行数据交互的数据库设计课程,练习代码老师完整给出,这次的课程设计就是基于这门课的。但我考虑到个人原因,选择了Qt和mysql,Qt是5.4,mysql是5.7,Windows下的Qt只有32位,所以mysql我装了32位。在设计这个上位机中,有很多方面做得不够好,也没有对内存各方面进行权衡,敬请见谅。

课程设计题目:

一、设计任务 
(1)设计题目:多点温湿度监测系统上位机程序设计
(2)设计说明和要求:
①以串口调试助手(提供软件:串口调试助手V2.2.exe)模拟温湿度监测仪器,模拟的温湿度监测仪器每隔5s从串口发送数据包,数据包格式为“ID=xxx;T=xx.x;H=xx;”,为字符串ASCII编码格式。例如“ID=001;T=32.3;H=62;”,其中ID=001表示下位机编号为001,T=32.3表示当前测量的温度为32.3度,H表示当前测量的湿度为62%。测量的温度范围为0-100度,湿度范围为0%-100%,温湿度监测仪器数量设定为4台,仪器编号为001-004。
②使用虚拟串口软件(提供软件:vspdxp虚拟串口破解版.rar)模拟串口线连接串口调试助手和上位机程序。
③程序设计语言可以选择使用VB、VC++、C#、Java和其他高级程序设计语言;数据库管理系统软件可选择使用Access、SQL Server、Oracle或MySQL。
④上位机程序应包含如下功能:
1)	登录功能:用户分为管理员和普通用户两类;登录时需要选择用户类型,管理员和普通用户进入后进入不同的操作界面,具有不同的操作功能;
2)	管理员具有的功能为:
a)普通用户管理功能:添加普通用户帐号信息;查看全部普通用户信息;修改某个指定的普通用户信息;删除某个指定的普通用户信息;
b)仪器管理功能:添加仪器信息;查看所有仪器信息;修改某台指定的仪器信息;删除某台指定的仪器信息;
c)退出系统和返回登录界面功能。
3)普通用户具有的功能为:
a)温湿度实时监测和存储功能:接收温湿度监测仪器发送的数据包(数据包格式为“ID=xxx;T=xx.x;H=xx;”,具体见上面描述),解析出仪器编号、温湿度数据,并将解析数据包的时间为测量时间,同时根据仪器编号确定监测地点,然后在界面上显示监测地点、监测仪器编号、温湿度值和测量时间,并将这些信息存储进数据库;需要同时显示4台监测仪器的实时监测信息;
b)历史监测数据管理功能:设计一个窗体,可以在该窗体中通过指定仪器编号(通过组合框选择仪器编号)和指定时间段查询和删除相应的存储在数据库中的监测数据。
c)退出系统和返回登录界面功能。
4)选做功能((注意:该功能为选做功能,非必须完成,但是完成该功能比较有机会获得优秀等级,不完成该功能也不代表不能获得优秀等级)):增加普通用户的功能:①查看和修改个人信息功能;②修改密码功能。

1.基本知识:

1.ui设计器:

在使用Qt之前需要准备一些基本的知识,Qt有一个ui设计器,这个设计器我们可以直接拖拉控件非常的方便。Qt利用C++封装了极多的类库供我们调用,甚至你都不用了解C++就能做出很多东西。

2.信号与槽:

信号其实就是函数的声明,其返回值是void,它是没有实现的,仅仅是一个声明,并且这是全局的。槽就是函数的集合,可以将这些函数和控件的事件进行绑定响应。

例如:一个button被点击后会发出被点击的信号,某个控件接收到这个信号后,与这个信号绑定的槽函数就会响应。

Qt提供了connect函数让我们可以连接部件的信号,QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection),这是Qt自带的说明文档,最后一个是默认参数不用管。const QObject * sender:是发送信号的部件, const char * signal其实就是信号,const QObject * receiver:是处理这个信号的对象, const char * method:是处理这个信号对象对应的方法。

connect(ui->pushButton,&QPushButton::pressed,this,getLogin);//this的getLogin函数绑定了pushButton的按下信号

ui->pushbutton:就是ui设计器中添加的button,button的名称是pushbutton,这个button在按下是,会执行this对象中的getLogin()函数。

3.Lambda表达式

虽然这个不是要求,但很多功能简单的函数,完全可以用Lambda表达式代替,例如:一些显示、隐藏窗口,用Lambda更好,免得再声明定义一个成员函数。Lambda表达式的基本形式:[ ]( ){  };

4.自定义信号:

在使用Qt中,难免有些信号需要自己写,例如:有两个窗口分别为A、B,B是A的子窗口(这里的意思是A包含了B),要实现这两个窗口相互切换怎么办?这里就要用到自定义信号了。我们让B想切换到A时,发射一个要返回的信号,A窗口对这个信号处理不就行了?Qt提供了signals这个关键词来说明信号。

在B中声明信号:

{
signals: //Qt中特有的,用来处理信号
    void back();//此处写信号
public:
    //类成员
private:
    //类成员
};

注意:这仅仅是Qt中的用法,并非C++语法。

定义了信号,我们还要发送信号啊~~在B中的构造函数:(此处认为B中有一个返回button,可在ui设计器上添加)

    connect(ui->back,&QPushButton::pressed,this,[=](){
        emit back(); //发射信号
    });

这里的button被按下后会执行emit back();这个函数,这就是发射信号。然后我们就可以在窗口A中处理这个信号了。

在A的构造函数中处理信号:

    void(B::*pback)()=&B::back; //将B发射的信号赋值给函数指针
    connect(&B,pback,this,[=](){   //窗口A绑定信号
        B.hide();
        this->show();
    });

这些绑定信号都是在构造函数中实现的,在创建这个对象时,就会初始化。其实用到C++语法的地方不多,可能是我还没有深入去了解,但有了这些基本知识,就能完成一些简单的功能了。

2.连接Mysql:

连接数据库是个比较蛋疼的事情,开始对Qt不熟悉上去就是一顿乱搞。

首先在工程文件加上sql:

QT +=sql

Qt中,这种添加方式是非常多的,没有带上就一直报错~~~~~

头文件导入:

#include<QSqlDatabase>

额外的库:把“C:\Program Files (x86)\MySQL\MySQL Server 5.7\lib”下的libmysql.dll、libmysql.lib复制到Qt的bin目录下,注意mysql的位数和Qt一致。后来在博客看到mysql-connector-c可以解决位数问题~~~~~有兴趣的可以考虑去实践

连接mysql语句:

QSqlDatabase db; //Qt中连接数据库的变量
db=QSqlDatabase::addDatabase("QMYSQL");//指定连接mysql
db.setHostName("127.0.0.1");//主机ip
db.setDatabaseName("temphumdatabase"); //数据库名
db.setPort(3307);//端口
db.setPassword("141111lwj");//mysql密码
db.setUserName("root");//mysql用户名
if(!db.open()) //判断是否打开mysql
{
   return;
}

我的mysql数据库储存路径是默认的,也就是C盘下的隐藏目录,可在“查看”一栏把隐藏目录选为可见。

Qt支持的数据库不止mysql,可以通过下面代码查看支持的数据库:

在头文件包含:

#include<QDebug>
qDebug()<<QSqlDatabase::drivers(); //查看支持的数据库

输出:

("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")

这些就是Qt支持的数据库。

数据库事务:

Mysql连接一次后,在整个应用都能使用,但连接的数据库变量是局部变量,那怎么在其他类或者函数中使用?

在其他类的头文件中包含相应的头文件:

#include<QSqlDatabase>

然后就可以开始一个数据库事务,这样你就可以对数据库操作

QSqlDatabase::database().contains();     //开始一个事务

那么QSqlDatabase::database()到底是什么?

我们打印出来看看:

在程序中添加:qDebug()<<QSqlDatabase::database();

Qt给我们返回的是:

QSqlDatabase(driver="QMYSQL", database="temphumdatabase", host="127.0.0.1", port=3307, user="root", open=true)

也就是我们连接的数据库!!!

猜你喜欢

转载自blog.csdn.net/weixin_40850689/article/details/84955306