因项目需要编写一个上位机软件,前段时间刚接触Qt,觉着这个框架类库会比MFC更好用,并且具有跨平台的特性,所以采用Qt5.2写了一个基于串行通讯的调试上位机。
遇到的主要问题:
1、串口能接收数据,但接收速度很慢,工作不正常?
问题:程序只在开始的时候设置了COM口和参数,但是如果预设的COM口不存在,那么新设置好com口后,并没有再次进行初始化操作,所以会导致串口工作不正常。
2、窗口布局如何是空间跟随主窗口的大小变化而变化?
首先sizepolicy要采用 “Expanding”模式;
其次,使用gridlayout spacer groupbox等空间,先从整体上布局,再着眼于细节,一层一层的布局即可。同时还需要注意有些控件大小需要设置成fixed固定长度。
3、中文显示问题?
目前试了两种方法
- :QStringLiteral
setWindowTitle(QStringLiteral("我是中文"));
- :
QTextCodec *codec = QTextCodec::codecForName("GB18030"); setWindowTitle(codec->toUnicode("我是中文"));
4、程序打包发布问题
新版本的Qt自带了一个文件打包工具windeployqt.exe ,路径在D:Qtmsvc32in下。我们可以使用其为我们找到exe所依赖的dll文件。
- 添加环境变量: path D:Qtmsvc32in,如此才能在cmd命令中使用windeplot.exe 程序。
- 改变cmd路径到exe所在路径 cmd命令行中输入: cd /d D:SerialPort
- 路径修改完成后,在cmd中输入命令 windeployqt myCom.exe,运行完后会发现exe所需的dll文件已经查找完毕并添加到了exe所在文件夹中
- 使用Depends软件查找可能还缺少的dll文件(黄色感叹号的就是缺少的dll),将缺失的dll添加到exe所在文件夹中
- 将所有需要的dll文件查找完毕后,使用enigma virtual box软件打包exe+dll文件,生成一个独立的exe文件。
- 将生成的exe在其他电脑上运行测试,如果没有问题,表示打包成功。
5、Qt界面更新后运行出来的结果界面并没有更新
mainwindow.ui 编译生成的ui_mainwidow.h文件位置不对,导致引用的是旧版.h界面,所以会导致界面显示未更新。解决办法:删除原来的.h文件,clear-> qmake->rebuild,OK!
6、怎么实现自动搜索串口功能?
一开始呢,是使用Qextserialportenumerator来做的,结果呢,这个文件运行需要.lib文件,于是我就开始在VS中配置终于生成了lib文件(后来发现直接把.cpp .h文件加到现在工程不就可以了么。。。绕了个大弯,坑爹),然而并没有能够搜索到系统已有的串口,一直显示零个串口。于是在网上找其他方法,结果发现在Qt5中自带QtSerialPort类和QSerialPortInfo类,前者用于设置串口,读出数据等,后者用于枚举出系统已有的串口。got it,Qt的安装包example中有各种关于串口操作的例程,运行后发现可以枚举出系统已有串口,问题解决。
文件地址:D:QtExamplesQt-5.4serialport
7、图片显示?
(1)添加Resource -> picture.png
(2)点击resource 中的图片,右键 copy path,即可以获得图片的相对地址。
对应程序:
void MainWindow::Init_COM() { QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); QStringList strList; strList.clear(); QChar *serialNum = new QChar [ports.size()]; //get the number in array for (int i = 0; i < ports.size(); i++) { serialNum[i] = ports.at(i).portName().at(3); } // //Bubble_Sort for (int j = ports.size()-1; j>0; j--) { for(int i=0;i<j;i++) { if(serialNum[i]>serialNum[i+1]) { QChar temp = serialNum[i]; serialNum[i] = serialNum[i+1]; serialNum[i+1] = temp; } } } //set the COMx for(int i=0;i<ports.size();i++) { strList.append(QString::number(serialNum[i].toLatin1()-0x30)); } ui->comCombo->clear(); ui->comCombo->addItems(strList); //显示下拉菜单 ui->comCombo->showPopup(); free(serialNum); }
8、环境变量设置问题
由于更改了环境变量,导致Qt工程无法编译。这里主要是系统环境变量设置问题
打开 计算机-属性-高级设置-环境变量设置
编辑
INCLUDE | C:Program Files (x86)Microsoft Visual StudioVC98atlinclude;C:Program Files (x86)Microsoft Visual StudioVC98mfcinclude;C:Program Files (x86)Microsoft Visual StudioVC98include;C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude |
PATH | C:WindowsSystem32;C:QtQt5.4.15.4msvc2013in;C:Program Files (x86)Microsoft Visual Studio 12.0Common7IDE;C:QtQt5.4.1ToolsQtCreatorin;C:QtQt5.4.15.4msvc2013in;C:Program Files (x86)Windows Kits8.1Windows Performance Toolkit |
LIB | C:Program Files (x86)Microsoft Visual Studio 12.0VCin |
VS120COMNTOOLS | C:Program Files (x86)Microsoft Visual Studio 12.0Common7Tools |
VCINSTALLDIR | C:Program Files (x86)Microsoft Visual Studio 12.0VC |
主要设置C:WindowsSystem32 C:QtQt5.4.15.4msvc2013in等,
如果提示cl不是内部命令也不是外部命令时,表明path环境变量设置有误,可以通过cmd命令框中输入ipconfig 等命令来测试,如果显示不是内部或外部命令,则表明环境变量设置有误,那么需要在path中重新正确设置参数。
9、如何在多窗口之间共享数据?
- signal/slot方法,在一个dialog中定义signals,在mainwindow中接收,并编写槽函数,注意connect建立之间一定要初始化dlg对象。
- signals函数不能有返回值,并且不能有实现,slot函数的参数不能比signals函数的参数多。
- signals/slot是Qt中用于消息传递的一种策略。
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //信号槽方式下父子窗体传值的测试 dlg = new Dialog2(); //dlg->show(); //关联信号和槽函数 connect(dlg,SIGNAL(SendString(QString)),this,SLOT(SetString(QString))); // dlg->setModal(true); 不论是模态或者非模态都可以正常传值 //dlg->show(); } MainWindow::~MainWindow() { } void MainWindow::on_pushButton_clicked() { dlg->show(); qDebug() << "open a new dialog succeed" << endl; } void MainWindow::SetString(QString str) { ui->textEdit->setText("Hello"); qDebug() << "signal received" << endl; }
class Dialog2 : public QDialog { Q_OBJECT public: explicit Dialog2(QWidget *parent = 0); ~Dialog2(); signals: void SendString(QString str); private slots: void on_buttonBox_accepted(); private: Ui::Dialog2 *ui; };
界面如如下:
附源码:https://files.cnblogs.com/files/wll-zju/%281%29SerialPort%E5%8A%A0%E5%85%A5%E6%8C%87%E7%A4%BA%E7%81%AF%EF%BC%8C%E4%B8%B2%E5%8F%A3%E8%87%AA%E5%8A%A8%E6%90%9C%E7%B4%A2%E5%8A%9F%E8%83%BD.zip
开发环境:VS2013 32bit + Qt5.2.1 32bit