当前位置: 首页 > Linux

Qt官方例子-简单几步,小白也能做出一个串口终端

时间:2023-04-06 21:55:02 Linux

大家好,我是老吴。又成功写了一篇小文章。每当我没有动力写文章的时候,我就会降低写文章的门槛。这其实是一个很好的技巧。把一个大目标分成许多小目标是好的。对抗拖延症的好方法。正好最近看了一些讨论敏捷开发的文章,或者是不是可以思考一下如何敏捷学习呢?一个项目的长期开发会磨掉开发者的耐心,长期学习一个东西也会磨灭人的信心。另外,你怎么知道你现在学的东西对以后的工作有没有用。因此,我的结论是:尽可能快地运用所学知识。用一点就是一点,不够就回去补!回到正题,学习Qt最好的方法就是看官方手册和例子。今天要分享的是Qt官方的例子:terminal。一个简单的串口终端工具:点击查看大图演示了如何创建终端并使用QSerialPort进行串口通信。源文件:`terminal/``├──console.cpp``├──console.h``├──images/``├──main.cpp``├──mainwindow.cpp``├──mainwindow.h``├──mainwindow.ui``├──settingsdialog.cpp``├──settingsdialog.h``├──settingsdialog.ui``├──terminal.pro``└──终端。qrc`接下来就来和我一起实现这个小工具吧。文本目录:`1.创建一个新的QtWidgetsApplication``2.设计主界面``3.实现主界面的功能``4.设计设置界面``5.实现设置界面的功能``6.相关参考`1.创建一个新的QtWidgets应用程序。在QtCreator中,单击“文件”>“新建文件或项目”>“应用程序”>“QtWidgets应用程序”>“选择”:单击以查看大图。使用QMainWindow作为基类,子类名称为MainWindow:创建完成后,会得到如下文件:`terminal/``├──main.cpp``├──mainwindow.cpp``├──mainwindow.h``├──mainwindow.ui``├──terminal.pro``└──terminal.qrc`运行效果:点击查看大图。此时只有和QMainWindow一样的界面,并没有串口终端相关的功能。二、设计主界面主界面分为4个部分:点击查看大图1、菜单栏由QMenuBar实现,用于提供串口终端的核心操作功能;2、工具栏由QToolBar实现,用于提供快捷操作;3、中间区域留空,后面会继承QPlainTextEdit在C++中实现,用于输入输出串口信息;4、状态栏由QstatusBar实现,用于显示当前的连接状态。在QtDesigner中执行以下操作:1.在菜单栏中添加Calls和Tools菜单项:在Calls中添加子菜单项Connect和Disconnect,分别对应连接和断开串口的功能。Tools中增加子菜单项Configure和Clear,分别对应打开设置窗口和清除终端信息的功能。2.在工具栏中添加连接、断开、配置、清除按钮;3.添加设置对话框:使用DialogwithoutButtons模板创建一个名为“SettingsDialog”的新对话框。运行效果:点击查看大图此时,菜单栏和工具栏中的菜单项没有任何实际功能。3、实现设置功能由于在连接串口之前需要设置参数,所以我们需要先实现设置界面中的功能。设计界面:点击查看大图此时,还没有实际的功能。支持串口设备选择:`//文件:settingsdialog.cpp``voidSettingsDialog::fillPortsInfo()``{``...``//获取系统当前可用的所有串口设备列表``constautoinfos=QSerialPortInfo::availablePorts();``//初始化组合框``for(constQSerialPortInfo&info:infos){``QStringListlist;``description=info.description();``manufacturer=info.manufacturer();``serialNumber=info.serialNumber();``list<serialPortInfoListBox->addItem(list.first(),list);``}``}`在Qt中,可以使用QSerialPortInfo获取系统当前可用的串口设备列表。获取串口信息后,我们用它来初始化串口组合框。选择不同的串口设备时,切换设备的描述信息:``connect(m_ui->serialPortInfoListBox,``QOverload::of(&QComboBox::currentIndexChanged),this,&SettingsDialog::showPortInfo);`运行效果:点击查看大图支持设置串口参数:`//File:settingsdialog.cpp``voidSettingsDialog::fillPortsParameters()``{``//添加波特率、数据位等可选串口参数``m_ui->baudRateBox->addItem(QStringLiteral("9600"),QSerialPort::Baud9600);``m_ui->baudRateBox->addItem(QStringLiteral("19200"),QSerialPort::Baud19200);``m_ui->baudRateBox->addItem(QStringLiteral("38400"),QSerialPort::Baud38400);``m_ui->baudRateBox->addItem(QStringLiteral("115200"),QSerialPort::Baud115200);``...``}`在Qt中,串口相关的功能都是通过qtserialport模块实现的,只要有两个类,QSerialPort和QSerialPortInfo即可。运行效果:点击查看大图支持保存设置:`//文件:settingsdialog.cpp``voidSettingsDialog::apply()``{``updateSettings();``hide();``}``//将串口参数保存在变量m_currentSettings``voidSettingsDialog::updateSettings()``{``m_currentSettings.name=m_ui->serialPortInfoListBox->currentText();``m_currentSettings.baudRate=static_cast(m_ui->baudRateBox->itemData(m_ui->baudRateBox->currentIndex()).toInt());``...``}`当Apply按钮被点击时,apply()将被调用,并且接口串口参数存放在structSettingsm\_currentSettings中。运行效果:点击查看大图4.实现串口连接功能`//文件:mainwindow.cpp``voidMainWindow::openSerialPort()``{``constSettingsDialog::Settingsp=m_settings->settings();``//打开哪个串口设备?``m_serial->setPortName(p.name);``...``//还是熟悉的open()``if(m_serial->open(QIODevice::ReadWrite)){``m_console->setEnabled(true);``m_ui->actionConnect->setEnabled(false);``m_ui->actionDisconnect->setEnabled(true);``m_ui->actionConfigure->setEnabled(false);``...``}``}`当点击连接按钮时,会调用openSerialPort(),然后执行QSerialPort的open()。m\_console是一个QPlainTextEdit类型的对象,负责显示串口。运行效果:点击查看大图,此时可以打开串口设备,但是还不能显示串口数据。5、实现串口读写功能,支持从串口读取数据:`//文件:mainwindow.cpp``voidMainWindow::readData()``{``//从串口硬件读取数据``constQByteArraydata=m_serial->readAll();``//显示在文本框中``m_console->putData(data);``}`打开串口后,当串口有数据时,调用MainWindow::readData()将数据读出并显示在界面上。putData()将调用QPlainTextEdit::insertPlainText()以在文本框中显示数据。支持向串口写入数据:`//文件:console.cpp``voidConsole::keyPressEvent(QKeyEvent*e)``{``switch(e->key()){``//不处理某些键``caseQt::Key_Backspace:``...``break;``default:``//发送和接收用户输入信号``emitgetData(e->text().toLocal8Bit());``}``}`当用户通过键盘输入时,m\_console将捕获事件并发出信号。主界面收到信号后,会执行真正的串口操作:`//file:mainwindow.cpp``MainWindow::MainWindow(QWidget*parent)``:...``{``...``connect(m_console,&Console::getData,this,&MainWindow::writeData);``}``voidMainWindow::writeData(constQByteArray&data)``{``//熟悉的write()``m_serial->write(data);``}`运行效果:点此查看大图,这是Qt官方示例终端核心功能完成。有兴趣的朋友请自行阅读Qt实例中的完整代码。相关参考《Qt 官方文档》https://doc.qt.io/qt-5/qtseri...《C++ GUI Qt4 编程 (第二版)》《Qt5 编程入门 (第二版)》《Qt Creator 快速入门》——完结——推荐阅读:专辑|Linux驱动开发专辑|Linux系统编程专辑|每天一个小CQt入门想加入交流群?后台回复【加群】,我拉你进群。