1. 解释qt的工程结构
一个qt工程由以下几个部分组成
- .pro 文件:
项目管理文件,用来保存构建项目的配置,记录依赖的库,项目包含的文件等
- .ui 文件:
界面设计文件。QT新建项目后会生成可视化设计的窗体定义文件。双击.ui文件后就可以在Qt Designer界面里对窗体进行可视化设计
- mainwindows.h
窗口类的头文件,继承于QMainWindows,会在这个文件里声明用到的函数与成员变量。
- mainwindows.cpp
窗口类的实现文件,保护构造函数与析构函数的实现,以及其他定义的函数的实现
2. 在.h文件中的 Q_OBJECT 是什么
qt工程默认生成的.h文件中,有Q_OBJECT这个宏
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
这个宏的作用是,声明当前对象是属于QObject对象。而只有QObject对象才能进行信号-槽的连接。因此当我们每新建一个类,并这个类和信号槽有关的时候,就要在这个类的.h文件中添加Q_OBJECT 宏,让它支持信号槽。
3. QT里与串口相关的类有哪些
主要有QSerialPort和QSerialPortInfo
- QSerialPortInfo:串口信息类。通常使用这个类来获取当前设备上所有可用的串口设备(调用QSerialPortInfo::availablePorts())。而每个串口设备的信息,都会以QSerialPortInfo对象的方式返回。
- QSerialPort 串口操作类。可以使用这个类对某一个指定的串口设备进行读写操作。指定串口的方式有:
- setPort(): 传入QSerialPortInfo,设置对应的串口
- setPortName(): 传入串口的名字,设置对应的串口
4. WiringPi 控制GPIO的流程
- 在.pro文件中,添加-lwiringPi支持
引入头文件
#include "wiringPi.h"
初始化wiringPi
wiringPiSetup();
设置引脚模式
pinMode(21, OUTPUT);
控制电平
digitalWrite(21, 1); // 设置21引脚为高电平
digitalWrite(21, 0); // 设置21引脚为低电平
5. QT中使用多窗口的步骤
新建界面类文件
- 声明并定义这个界面类
-
6. QFile写入文件步骤
传入文件路径建立QFile对象
- 以读取模式打开文件
- 将文件绑定到QTextStream流上
- 写入文件
关闭文件
QFile data("file.txt");
if (data.open(QFile::WriteOnly | QIODevice::Truncate)) {
QTextStream out(&data);
out << “xxx dat" << 42;
}
data.close();
7. 蔬菜大棚处理数据逻辑
在蔬菜大棚的handledata里,传入了两个参数:
QString data : 收到的数据
- QString address : 客户端的ip
由于数据格式是#tem1:23 hum1:44#tem2:29 hum2:55 “
首先通过split,分割字符串
QStringList list = data.split("#");
分割后的数据是:
["tem1:23 hum1:44", "tem2:29 hum2:55"]
之后将这个数据,拼接成换行的数据
for(int i = 0; i < list.length(); i++)
show = show + list[i] + "\n";
对应的效果是:
"tem1:23 hum1:44
tem2:23 hum3:44
"
最后要根据按钮上文字的第一行(即ip+端口)
找到目标按钮
之后将刚刚生成的新数据字符串,添加到按钮上
// 变量按钮上的ip,寻找目标按钮
for(int i = 0; i < button_list.length(); i++)
{
// 通过换行符号切割,获取按钮上文字的第一行,即ip+端口
QString now = button_list[i]->text().split("\n")[0];
// 如果第一行的ip+端口就是目标IP+端口
if(now == address)
{
show = now + "\n" + show; // 将ip和要显示的数据,一起显示在界面上
button_list[i]->setText(show.toUtf8());
break;
}
}