为啥我可以在 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。该项目本身是关于用于港口集装箱管理的汽车机器人,在它处于开发阶段(以及最终版本)期间,如果有一种方法可以监控并向其发送命令,那将是一件很酷的事情。 最初通过串行端口实现通信然后重写/重用无线电通信器或类似东西的代码似乎是个好主意。代码运行良好,直到出现一些错误

首先使用QSerialPortQSerialPortInfo,遵循Qt 网站上的several programs 示例。编译器出现了一些关于缺少"QT+=serialport" 和错误前向声明的错误,但过了一段时间我可以修复它们。然后在编写打开串口的代码时,程序开始崩溃......

几个小时后,这个 GUI Qt 代码(以及相应的控制台版本)工作并举例说明了问题:

ma​​inwindow.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

ma​​inwindow.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;

ma​​in.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();

但是,在更改 ma​​inwindow.h 并在 MainWindows 的 private 部分中插入 QSerialPort *connected_port; 并将其从 ma​​inwindow.cpp 中删除之后,这个简单的程序就会启动崩溃。

ma​​inwindow.h

  (...)

class MainWindow : public QMainWindow 

  (...)

    private:
        QSerialPort *connected_port;
        Ui::MainWindow *ui;
;

  (...)

ma​​inwindow.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 值

QT5 串口操作

如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)

为啥多个文件可以在 Qt .qrc 中使用相同的别名?

Qt 5.7 版本+2013VS环境配置

Qt 5.5.1:找不到 -lGL