标题:Qt如何快速的开发一款界面简洁的串口调试助手,打包可执行程序
文章目录
话不多说,先上截图吧!!!
接下来讲教大家怎么制作一款自己的串口助手,分为以下几个步骤:
- 界面设计
- 串口搜索以及打开串口
- 发送数据(包含进制接收发)
- 接收串口发来的数据
- 设置标题栏的图标
- 设置可执行程序的桌面图标
- 打包可执行程序(可发送给其他好友,无需安装环境)
一、首先创建一个空的项目
二、在Ui界面设置自己的专属界面
- 可在开始菜单找到Qt文件夹,选择Designer,这是一个可视化的界面,设计界面的话用这个比较舒服,不需要等待编译时间,如果在Qt主界面运行看效果那可太浪费时间了。
- 设计界面小技巧:把界面分成几块区域,用widget控件分开,然后再在里面添加控件。
- 预览界面快捷键:ctrl+r
打开界面如下
三、设计控件的风格
点击所需要设计的控件,在属性界面找到styleSheet,点击…即可进入快捷设计界面
QPushButton{
background-color: rgb(170, 170, 255);
color: white;
border-radius: 10px;
border: 2px groove gray;
border-style: outset;
}
四、编写我们的代码
- 在我们的Ui界面,串口配置无需操作,接下来我们来自动获取电脑的串口信息并自动添加到列表里。
- 选中查询串口按钮,右击选中转到槽,这里槽函数的功能是,当你点击这个按钮将做什么事情。
- 在.pro文件中添加设置
QT += serialport #加入串口模块
实现代码:
//搜索串口
void MainWindow::on_Serach_Button_clicked()
{
// 清除当前显示的端口号
ui->Serial_engine_comboBox->clear();
//检索端口号
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->Serial_engine_comboBox->addItem(info.portName());
}
}
3.打开串口
//打开串口
void MainWindow::on_open_Button_clicked()
{
if(ui->open_Button->text() == QString("OpenPort")) //串口未打开
{
//设置端口号
Serial.setPortName(ui->Serial_engine_comboBox->currentText());
//设置波特率
Serial.setBaudRate(ui->Speed_comboBox->currentText().toInt());
//设置数据位
switch (ui->Data_bits_comboBox->currentText().toInt())
{
case 8: Serial.setDataBits(QSerialPort::Data8); break;
case 7: Serial.setDataBits(QSerialPort::Data7); break;
case 6: Serial.setDataBits(QSerialPort::Data6); break;
case 5: Serial.setDataBits(QSerialPort::Data5); break;
default: break;
}
//设置停止位
switch (ui->Stop_bits_comboBox->currentText().toInt())
{
case 1: Serial.setStopBits(QSerialPort::OneStop);break;
case 2: Serial.setStopBits(QSerialPort::TwoStop);break;
case 3: Serial.setStopBits(QSerialPort::OneAndHalfStop);break;
default:break;
}
//设置校验方式
switch (ui->Parity_comboBox->currentIndex())
{
case 0: Serial.setParity(QSerialPort::NoParity);break;
default:break;
}
//设置流控制模式
Serial.setFlowControl(QSerialPort::NoFlowControl);
//打开串口
if(Serial.open(QIODevice::ReadWrite)==false)
{
QMessageBox::warning(NULL , "提示", "串口打开失败!");
return;
}
// 使能串口设置控件
ui->Serial_engine_comboBox->setEnabled(false);
ui->Speed_comboBox->setEnabled(false);
ui->Data_bits_comboBox->setEnabled(false);
ui->Stop_bits_comboBox->setEnabled(false);
ui->Parity_comboBox->setEnabled(false);
ui->Flow_control_comboBox->setEnabled(false);
ui->Serach_Button->setEnabled(false);
//调整串口控制按钮的文字提示
ui->open_Button->setText(QString("ClosePort"));
}
else //串口已经打开
{
Serial.close();
// 使能串口设置控件
ui->Serial_engine_comboBox->setEnabled(true);
ui->Speed_comboBox->setEnabled(true);
ui->Data_bits_comboBox->setEnabled(true);
ui->Stop_bits_comboBox->setEnabled(true);
ui->Parity_comboBox->setEnabled(true);
ui->Flow_control_comboBox->setEnabled(true);
ui->Serach_Button->setEnabled(true);
//调整串口控制按钮的文字提示
ui->open_Button->setText(QString("OpenPort"));
}
}
4.串口发送
//串口发送
void MainWindow::on_Send_Four_pushButton_clicked()
{
if(Serial.isOpen()==false) //判断串口是否打开
{
QMessageBox::warning(NULL , "提示", "请打开串口!");
return;
}
//toPlainText() 转换为纯文本格式
//toUtf8() 转换为UTF-8 编码
QByteArray senddata = ui->SendEdit_Four->toPlainText().toUtf8();
//判断是否有非16进制字符
if(ui->hex_radioButton_four->isChecked()==true) //勾选了16进制发送
{
int cnt = senddata.size(); //计算要发送数据的长度
char *data = senddata.data();
for(int i=0;i<cnt;i++)//判断是否有非16进制字符
{
if(data[i]>='0' && (data[i]<='9'))
continue;
else if(data[i]>='a' && (data[i]<='f'))
continue;
else if(data[i]>='A' && (data[i]<='F'))
continue;
else if(data[i] == ' ') //是否有空格
continue;
else
{
QMessageBox::warning(NULL , "提示", "输入非16进制字符!");
return;
}
}
senddata = senddata.fromHex(senddata);
}
//勾选了发送新行,意思是在发送数据之后加上一个回车换行符
if(ui->New_checkBox_four->isChecked()==true)
{
int cnt = senddata.size();
senddata = senddata.insert(cnt,"\r\n");
}
Serial.write(senddata); //通过串口发送数据
}
5.串口接收数据
这里需要把串口读取函数定义在private slots:里
private slots:
void on_open_Button_clicked();
void on_Serach_Button_clicked();
void on_Send_Four_pushButton_clicked();
void Serial_read();//串口读取
void on_Clearn_Button_clicked();
void MainWindow::Serial_read()
{
//读取串口收到的数据
QByteArray buffer = Serial.readAll();
//判断是否需要16进制显示
if(ui->hex_radioButton_read->isChecked()==true)
{
buffer = buffer.toHex() ;//转换为16进制 例:"1234" -->“31323334”
}
QString receive = QString(buffer);
//在接收窗口显示收到的数据
ui->Receive_Edit->insertPlainText(receive);
}
并设置它的一个槽函数:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowIcon(QIcon("://images/myico.png")); //设置启动左上角图标
ui->Speed_comboBox->setCurrentIndex(5); //波特率默认9600
ui->Data_bits_comboBox->setCurrentIndex(3); //数据位默认8
ui->Stop_bits_comboBox->setCurrentIndex(0); //停止位默认1
ui->Parity_comboBox->setCurrentIndex(0); //校验位默认0
ui->Flow_control_comboBox->setCurrentIndex(0); //流控制默认 NoFlowControl
//连接槽函数
connect(&Serial,&QSerialPort::readyRead,this,&MainWindow::Serial_read);
}
6.清屏
//清空接收窗口
void MainWindow::on_Clearn_Button_clicked()
{
ui->Receive_Edit->clear();
}
7.其他一些小功能还没完善,比如说计算收到多少个字节,发送了多少个字节,清除接收发送的字节数,而发送这里也只实现了最下面的一个,其他三个没实现,读者可自行实现。
五、如何设置标题栏图标
- 右击工程,添加新文件
- 定义名称
- 添加资源
- 代码实现
this->setWindowIcon(QIcon("://images/myico.png")); //设置启动左上角图标
- 效果图
六、如何制作可执行程序的桌面图标
- 先看效果图吧,上面的是设置好的,而下面的是自带的
- 在工程目录下,添加两个文件
第一个是图标:必须是.ico结尾的照片,可在网站上自行转换,这里贴一个转换网站
https://www.aconvert.com/cn/icon/png-to-ico/
转换几秒钟的事,转换完把图片保存到工程目录下
第二个是编写.rc后缀的文件,用notepad++打开,复制以下代码,名字是图片的名字
IDI_ICON1 ICON DISCARDABLE "myico.ico"
- 然后最后一步是在Qt工程中的.pro文件加上一句话,名字也是和文件一样的名字
RC_FILE += myico.rc
- 运行即可看到图标制作完成
七、如何打包可执行程序
-
选择编译器
-
将构建好的可执行程序复制到桌面并创建一个空的文件夹放里面
-
打开Qt自带的终端
-
切换刚才复制的可执行程序所在的文件夹,并执行一下代码
cd /d C:\Users\Unicorn\Desktop\new // /d:切换盘符所需要添加
windeployqt serialport.exe //可执行程序的名字.exe
- 等待打包
- 打包完成可在刚才新建的文件夹下看到生成的一大堆东西,然后就可以压缩打包发送给其他小伙伴炫耀了,哈哈哈哈