为啥我可以在 Qt 5.5.1 中使用 QSerialPort* 作为临时变量而不是作为类的成员?
Posted
技术标签:
【中文标题】为啥我可以在 Qt 5.5.1 中使用 QSerialPort* 作为临时变量而不是作为类的成员?【英文标题】:Why can I use QSerialPort* as a temporary variable but not as a class' member in Qt 5.5.1?为什么我可以在 Qt 5.5.1 中使用 QSerialPort* 作为临时变量而不是作为类的成员? 【发布时间】:2016-04-02 19:17:53 【问题描述】:我正在尝试为具有 Arduino 的项目构建 GUI。该项目本身是关于用于港口集装箱管理的汽车机器人,在它处于开发阶段(以及最终版本)期间,如果有一种方法可以监控并向其发送命令,那将是一件很酷的事情。 最初通过串行端口实现通信然后重写/重用无线电通信器或类似东西的代码似乎是个好主意。代码运行良好,直到出现一些错误。
首先使用QSerialPort
和QSerialPortInfo
,遵循Qt 网站上的several programs 示例。编译器出现了一些关于缺少"QT+=serialport"
和错误前向声明的错误,但过了一段时间我可以修复它们。然后在编写打开串口的代码时,程序开始崩溃......
几个小时后,这个 GUI Qt 代码(以及相应的控制台版本)工作并举例说明了问题:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtSerialPort/QSerialPortInfo>
#include <QtSerialPort/qserialport.h>
#include <QMainWindow>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
;
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
ui->setupUi(this);
QSerialPort *connected_port;
connected_port = new QSerialPort;
MainWindow::~MainWindow()
delete ui;
main.cpp
#include <QApplication>
#include <QMainWindow>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
;
int main(int argc, char *argv[])
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
但是,在更改 mainwindow.h 并在 MainWindows 的 private
部分中插入 QSerialPort *connected_port;
并将其从 mainwindow.cpp 中删除之后,这个简单的程序就会启动崩溃。
mainwindow.h
(...)
class MainWindow : public QMainWindow
(...)
private:
QSerialPort *connected_port;
Ui::MainWindow *ui;
;
(...)
mainwindow.cpp
(...)
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
ui->setupUi(this);
connected_port = new QSerialPort;
(...)
会崩溃。在 qt 的终端示例中是一种类似的方法,但我没有得到它为什么起作用而这段代码没有。如何让它发挥作用?
【问题讨论】:
我不明白为什么这不起作用,我在某些应用程序中也是如此。也许尝试将构造函数调用为: ... = new QSerialPort("myport"); @TheBadger 这是个好主意,但它不起作用(构造函数与 QSerialPortInfo 都没有) 【参考方案1】:解决了。出于某种原因,在 .pro 文件中添加 "QT+=widgets"
会生成一个功能程序,除了已经添加的 "QT+=serialport"
。
【讨论】:
仅供参考:在 Qt 中使用串行端口不需要"QT+=widgets"
。我一直使用串行端口运行应用程序——我并不总是使用 GUI 组件,所以我不需要小部件。我会说你一定是遇到了 gui/widgets 问题,而不是串口问题。
@code_fodder 此代码的控制台版本运行没有问题,但此 GUI 版本崩溃。乍一看,我猜这是一个串口问题,因为删除connected_port = new QSerialPort
行会导致程序运行良好。但是,在实际代码中尝试此解决方案时,发现父子小部件的关系存在更多缺陷,因此我可能会同意您的看法。但是,另一方面,这个程序以这种方式崩溃听起来不奇怪吗?
添加 Qt 模块时,有时完全删除构建目录并从头开始构建项目会有所帮助。您可能会遇到与您自己的代码不兼容的问题。 OTOH,您可以简单地在您的小部件中按值保存QSerialPort
和 Ui,无需通过指针添加间接:class MainWindow : public QMainWindow Ui::MainWindow ui; QSerialPort m_serialPort; ... ;
以上是关于为啥我可以在 Qt 5.5.1 中使用 QSerialPort* 作为临时变量而不是作为类的成员?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Qt 5.5.1 在调试器中查看 QString 值