QT应用程序打包教程(超简单):QT如何打包生成独立可执行.exe文件
.cpp文件:
// 这里包含所需要的头文件mainwindow.h和ui_mainwindow.h以及Qt提供的QMessageBox和QTextStream类
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QTextStream>// 以下是MainWindow构造函数,构造函数在一个对象被创建时被调用
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) // 创建一个用户界面类的实例
{ui->setupUi(this); // 通过调用setupUi方法来设置初始界面serial = new QSerialPort; // 创建一个新的QSerialPort实例进行串口通信setWindowTitle("简易串口助手"); // 设置应用程序窗口的标题QFont font; // 创建一个QFont对象,用于设置字体font.setPointSize(20); // 设置字体大小为20ui->recvEdit->setFont(font); // 修改接收文本框的字体大小ui->sendEdit->setFont(font); // 修改发送文本框的字体大小
}// ~MainWindow() 是一个析构函数,用于在窗口关闭或应用程序结束时清理并释放资源
MainWindow::~MainWindow()
{delete ui;// 释放 ui 对象所占用内存的语句
}// 处理用户从下拉菜单(ComboBox)中选择的串口配置,并将这些配置应用到串口对象上
void MainWindow::on_SerailCb_activated(const QString &arg1)
{// 当用户选择一个项时,就将选中项的文本作为arg1参数传入,调用方法设置串口名serial->setPortName(arg1);
}void MainWindow::on_baundrateCb_activated(const QString &arg1)
{// 把选中项文本转化为整数用于设置波特率serial->setBaudRate(arg1.toInt());
}void MainWindow::on_databitCb_activated(const QString &arg1)
{// 把选中项文本转化为整数用于设置数据位serial->setDataBits((QSerialPort::DataBits)arg1.toInt());
}void MainWindow::on_CheckbitCb_activated(const QString &arg1)
{// 把选中项的索引用于设置校验位serial->setParity((QSerialPort::Parity)ui->CheckbitCb->currentIndex());
}void MainWindow::on_stopbitCb_2_activated(const QString &arg1)
{// 把选中项文本转化为整数用于设置停止位serial->setStopBits((QSerialPort::StopBits)arg1.toInt());
}// 按钮被点击时的槽函数
void MainWindow::on_openBt_clicked()
{// 检查串口是否已经被打开if(ui->openBt->text()=="打开串口") // 当未打开串口时{if(serial->open(QIODevice::ReadWrite)) // 尝试以读写方式打开串口{// 如果成功打开,按钮的文本变更为"关闭串口"ui->openBt->setText("关闭串口");// 连接串口的readyRead信号到匿名槽函数,意为当串口收到数据时对其进行读取并显示connect(serial, &QSerialPort::readyRead, this, [&](){// 读取串口收到的所有数据QByteArray info = serial->readAll();// 在接收文本框中显示收到的信息,setPlainText会把当前文本框中的内容替换,而不是追加ui->recvEdit->setPlainText(QString(info));});}else{// 如果打开串口失败,弹出错误对话框显示错误信息QMessageBox::critical(this, tr("错误"), serial->errorString());}}else // 如果已经被打开,就关闭串口,并将按钮的文本改回"打开串口"{serial->close();ui->openBt->setText("打开串口");}
}// 发送按钮被点击时调用
void MainWindow::on_sendBt_clicked()
{QString data = ui->sendEdit->toPlainText(); // 从文本框中获取数据serial->write(data.toLocal8Bit()); // 发送数据
}void MainWindow::on_recvEdit_blockCountChanged(int newBlockCount)
{}void MainWindow::on_sendEdit_copyAvailable(bool b)
{}
.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H// 下面的#include指令包含了一些头文件,这里的头文件都是Qt框架所需要的
#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>// 这里将Qt命名空间开始和结束的宏包裹了起来,使得我们可以在这个命名空间中定义一些代码
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE// 这是MainWindow这个类的定义开始的地方,这个类继承自QMainWindow,QMainWindow是一个用于创建应用程序主窗口的类
class MainWindow : public QMainWindow
{// Q_OBJECT是个宏,它在任何继承自QObject的类中都必须出现,能让这个类使用Qt的元对象系统Q_OBJECTpublic:// MainWindow的构造函数和析构函数,构造函数用于初始化对象,析构函数用于清理对象在生命周期结束时的状态MainWindow(QWidget *parent = nullptr);~MainWindow();// QSerialPort是一个类,这里在MainWindow类中声明了一个QSerialPort类型的指针serial,用于串口通信QSerialPort * serial;private slots:// 这些被定义为槽的函数可以通过Qt的信号槽机制与其他对象进行连接并相应交互// 例如,当用户在界面中选择了某个串口,下面的函数就会被调用// 冒号后面的const QString &arg1表示这个函数有一个QString类型的常量引用参数void on_SerailCb_activated(const QString &arg1);// 同样,当用户在界面中选择了波特率、数据位、校验位、停止位时,下面的函数就会被调用void on_baundrateCb_activated(const QString &arg1);void on_databitCb_activated(const QString &arg1);void on_CheckbitCb_activated(const QString &arg1);void on_stopbitCb_2_activated(const QString &arg1);// 当用户点击了打开/关闭串口或发送数据的按钮时,下面的两个函数就会被调用void on_openBt_clicked();void on_sendBt_clicked();void on_recvEdit_blockCountChanged(int newBlockCount);void on_sendEdit_copyAvailable(bool b);private:// 这是一个指向Ui类MainWindow界面的指针,它被封装在MainWindow类中,所有与用户界面有关的改变都在这个指针的对象上操作Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
.pro文件:
# 包含你项目所需的Qt模块
QT += core gui # Qt的基础模块,提供Qt的核心功能和图形用户界面功能QT += core gui serialport # 串口通信功能# 如果所使用的Qt版本号大于4,那么widgets模块也会被包含进来
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets# 告诉Qt使用C++11标准编译项目
CONFIG += c++11# 如果你使用了已经被标记为过时的Qt特性,编译器会产生警告
DEFINES += QT_DEPRECATED_WARNINGS# SOURCES变量包含了需要编译的.cpp源文件
SOURCES += \main.cpp \mainwindow.cpp# HEADERS变量包含了所有的头文件
HEADERS += \mainwindow.h# FORMS变量包含了所有的.ui文件,用于描述图形用户界面
FORMS += \mainwindow.ui# 定义了项目文件的部署路径,目前是默认
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
ui:
端口下拉框(SerailCb),
波特率下拉框(baundrateCb),
数据位下拉框(databitCb),
停止位下拉框(stopbitCb),
校验位(CheckbitCb),
打开串口按钮(openBt),
接收区域(recvEdit),
发送输入区域(sendEdit),
发送按钮(sendBt)
效果: