【QT】使用QT编写一款自己的串口助手

ui界面设计

控件

接收框控件: image(需要将接收框设置为只读 read only)
属性选择控件: image

发送框控件: image

按钮控件: image

外框控件: image

文本控件: image

界面设计

最终设计结果

image

布局解析

image

程序设计

第一步

在.pro文件中修改增加:
QT += core gui serialport // 增加 serialport 模块

第二步

在widget.cpp文件增加以下程序:

点击查看代码
#include <QSerialPortInfo>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QStringList serialNamePort;
    
    foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {
        serialNamePort << info.portName();
    }
}

解析程序:

点击查看代码
#include <QSerialPortInfo>	// 必要头文件
    QStringList serialNamePort;	// 新建了字符串列表为serialNamePort
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        serialNamePort<<info.portName();
    }
    ui->seriaCb->addItems(serialNamePort);
	
	// #include <QSerialPortInfo>	// 必要头文件
	// QStringList serialNamePort;	// 新建了字符串列表为serialNamePort
	// QSerialPortInfo // 用于存放串口信息
	// QSerialPortInfo::availablePorts() // 自动搜索可用串口,返回值为一个数组,数组元素类型就是 QSerialPortInfo
	// serialNamePort<<info.portName(); // 把返回值加到了二维数组serialNamePort中
	// ui->seriaCb->addItems(serialNamePort); // 将serialNamePort的元素在ui界面显示出来

程序实现逻辑功能

程序源码

widget.h

点击查看代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>  // 包含串口模块头文件
#include <QString>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QSerialPort *serialPort_port;
private slots:
    void on_openBt_clicked();

    void on_closeBt_clicked();

    void serialPortRead_Slot();

    void on_sendBt_clicked();

    void on_clearBt_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

点击查看代码
#include "widget.h"
#include "ui_widget.h"
#include <QSerialPortInfo>
#include <QMessageBox>  // windows 弹出提示框


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QStringList serialNamePort;

    serialPort_port = new QSerialPort(this);    // 新建一个串口端口的对象,即初始化

    connect(serialPort_port, SIGNAL(readyRead()), this, SLOT(serialPortRead_Slot()));

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        serialNamePort<<info.portName();
    }
    ui->seriaCb->addItems(serialNamePort);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openBt_clicked()    // 按下打开串口后初始化串口槽函数
{
    // 新建对象
    QSerialPort::BaudRate baudRate; // 波特率
    QSerialPort::DataBits dataBits; // 数据位
    QSerialPort::StopBits stopBits; // 停止位
    QSerialPort::Parity checkBits;  // 校验位

    // 设置波特率
    if (ui->baundrateCb->currentText() == "4800")
        baudRate = QSerialPort::Baud4800;
    else if (ui->baundrateCb->currentText() == "9600")
        baudRate = QSerialPort::Baud9600;
    else if (ui->baundrateCb->currentText() == "115200")
        baudRate = QSerialPort::Baud115200;

    // 设置数据位
    if (ui->dataCb->currentText() == "5")
        dataBits = QSerialPort::Data5;
    else if (ui->dataCb->currentText() == "6")
        dataBits = QSerialPort::Data6;
    else if (ui->dataCb->currentText() == "7")
        dataBits = QSerialPort::Data7;
    else if (ui->dataCb->currentText() == "8")
        dataBits = QSerialPort::Data8;

    // 设置停止位
    if (ui->stopCb->currentText() == "1")
        stopBits = QSerialPort::OneStop;
    else if (ui->stopCb->currentText() == "1.5")
        stopBits = QSerialPort::OneAndHalfStop;
    else if (ui->stopCb->currentText() == "2")
        stopBits = QSerialPort::TwoStop;

    // 设置校验位
    if (ui->checkCb->currentText() == "无校验")
        checkBits = QSerialPort::NoParity;

    // 给串口设置以上属性
    serialPort_port->setPortName(ui->seriaCb->currentText());   // 设置端口号
    serialPort_port->setBaudRate(baudRate);                 // 设置波特率
    serialPort_port->setDataBits(dataBits);                 // 设置数据位
    serialPort_port->setStopBits(stopBits);                 // 设置停止位
    serialPort_port->setParity(checkBits);                  // 设置校验位

    // 判断串口是否打开成功
    if (serialPort_port->open(QIODevice::ReadWrite) == true) {
        QMessageBox::information(this, "提示", "打开串口成功");
    } else {
        QMessageBox::critical(this, "提示", "打开串口失败");
    }

}

void Widget::on_closeBt_clicked()    // 关闭串口
{
    serialPort_port->close();
    QMessageBox::information(this, "提示", "关闭串口");
}

void Widget::serialPortRead_Slot()  // 接收数据
{
    QString buf;
    buf = QString(serialPort_port->readAll());
    ui->recvEdit->appendPlainText(buf);
}

void Widget::on_sendBt_clicked()    // 发送数据
{
    serialPort_port->write(ui->sendEdit->text().toLocal8Bit().data());
}

void Widget::on_clearBt_clicked()   // 清空
{
    ui->recvEdit->clear();
}

main.cpp

点击查看代码
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

打包和部署

如何打包和部署

1.将工程右下角的dubug模式切换为release模式,然后编译。

release模式: 更为精简,基本没有调试信息。
debug模式: 有详细的调试信息。
2.找到release模式编译后构建的文件夹
3.给打包的.exe文件加一个图标,需要用.ico格式,其他格式不行,这里推荐一个网站:.ico图标
4.将图标加到工程所在文件夹,并在.pro文件中添加:RC_ICONS = safe.ico // 等号右边为图标名称
5.新建一个文件夹,我们命名为Pack,仅将.exe文件复制到Pack中
6.进行封包操作,需要用到QT的控制台:
image
7.在QT的控制台中,使用命令进入到Pack所在的路径:
cd /d 新建Pack的路径复制到这里(注意/和d之间没有空格)
image
8.使用windeployqt工具将库加入到新创建的文件夹中:
windeployqt .exe文件的整个名称
image

最终效果

image

posted @ 2025-09-17 12:09  膝盖中箭卫兵  阅读(99)  评论(0)    收藏  举报
ORCID iD icon https://orcid.org/0000-0001-5102-772X