【QT】使用QT编写一款自己的串口助手
ui界面设计
控件
接收框控件:
(需要将接收框设置为只读 read only)
属性选择控件: 
发送框控件: 
按钮控件: 
外框控件: 
文本控件: 
界面设计
最终设计结果

布局解析

程序设计
第一步
在.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的控制台:
7.在QT的控制台中,使用命令进入到Pack所在的路径:
cd /d 新建Pack的路径复制到这里(注意/和d之间没有空格)
8.使用windeployqt工具将库加入到新创建的文件夹中:
windeployqt .exe文件的整个名称
最终效果

本文来自博客园,作者:膝盖中箭卫兵,转载请注明原文链接:https://www.cnblogs.com/Skyrim-sssuuu/p/19096518




浙公网安备 33010602011771号
https://orcid.org/0000-0001-5102-772X