1. 解释qt的工程结构

一个qt工程由以下几个部分组成

  • .pro 文件:

项目管理文件,用来保存构建项目的配置,记录依赖的库,项目包含的文件等

  • .ui 文件:

界面设计文件。QT新建项目后会生成可视化设计的窗体定义文件。双击.ui文件后就可以在Qt Designer界面里对窗体进行可视化设计

  • mainwindows.h

窗口类的头文件,继承于QMainWindows,会在这个文件里声明用到的函数与成员变量。

  • mainwindows.cpp

窗口类的实现文件,保护构造函数与析构函数的实现,以及其他定义的函数的实现

2. 在.h文件中的 Q_OBJECT 是什么

qt工程默认生成的.h文件中,有Q_OBJECT这个宏

  1. class MainWindow : public QMainWindow
  2. {
  3. Q_OBJECT
  4. public:
  5. explicit MainWindow(QWidget *parent = nullptr);
  6. ~MainWindow();
  7. private:
  8. Ui::MainWindow *ui;
  9. };

这个宏的作用是,声明当前对象是属于QObject对象。而只有QObject对象才能进行信号-槽的连接。因此当我们每新建一个类,并这个类和信号槽有关的时候,就要在这个类的.h文件中添加Q_OBJECT 宏,让它支持信号槽。

3. QT里与串口相关的类有哪些

主要有QSerialPort和QSerialPortInfo

  • QSerialPortInfo:串口信息类。通常使用这个类来获取当前设备上所有可用的串口设备(调用QSerialPortInfo::availablePorts())。而每个串口设备的信息,都会以QSerialPortInfo对象的方式返回。
  • QSerialPort 串口操作类。可以使用这个类对某一个指定的串口设备进行读写操作。指定串口的方式有:
    • setPort(): 传入QSerialPortInfo,设置对应的串口
    • setPortName(): 传入串口的名字,设置对应的串口

4. WiringPi 控制GPIO的流程

  • 在.pro文件中,添加-lwiringPi支持
  • 引入头文件

    1. #include "wiringPi.h"
  • 初始化wiringPi

    1. wiringPiSetup();
  • 设置引脚模式

    1. pinMode(21, OUTPUT);
  • 控制电平

    1. digitalWrite(21, 1); // 设置21引脚为高电平
    2. digitalWrite(21, 0); // 设置21引脚为低电平

    5. QT中使用多窗口的步骤

  • 新建界面类文件

  • 声明并定义这个界面类
  • 调用show函数,显示界面类

    6. QFile写入文件步骤

  • 传入文件路径建立QFile对象

  • 以读取模式打开文件
  • 将文件绑定到QTextStream流上
  • 写入文件
  • 关闭文件

    1. QFile data("file.txt");
    2. if (data.open(QFile::WriteOnly | QIODevice::Truncate)) {
    3. QTextStream out(&data);
    4. out << xxx dat" << 42;
    5. }
    6. data.close();

    7. 蔬菜大棚处理数据逻辑

    在蔬菜大棚的handledata里,传入了两个参数:

  • QString data : 收到的数据

  • QString address : 客户端的ip

由于数据格式是#tem1:23 hum1:44#tem2:29 hum2:55 “
首先通过split,分割字符串

  1. QStringList list = data.split("#");

分割后的数据是:

  1. ["tem1:23 hum1:44", "tem2:29 hum2:55"]

之后将这个数据,拼接成换行的数据

  1. for(int i = 0; i < list.length(); i++)
  2. show = show + list[i] + "\n";

对应的效果是:

  1. "tem1:23 hum1:44
  2. tem2:23 hum3:44
  3. "

最后要根据按钮上文字的第一行(即ip+端口)
找到目标按钮
之后将刚刚生成的新数据字符串,添加到按钮上

  1. // 变量按钮上的ip,寻找目标按钮
  2. for(int i = 0; i < button_list.length(); i++)
  3. {
  4. // 通过换行符号切割,获取按钮上文字的第一行,即ip+端口
  5. QString now = button_list[i]->text().split("\n")[0];
  6. // 如果第一行的ip+端口就是目标IP+端口
  7. if(now == address)
  8. {
  9. show = now + "\n" + show; // 将ip和要显示的数据,一起显示在界面上
  10. button_list[i]->setText(show.toUtf8());
  11. break;
  12. }
  13. }