为什么我可以使用 QSerialPort* 作为临时变量而不是 Qt 5.5.1 中的 class' 成员?
Why can I use QSerialPort* as a temporary variable but not as a class' member in Qt 5.5.1?
我试图为一个 Arduino 的项目构建一个 GUI。该项目本身是关于一个用于港口集装箱管理的汽车机器人,在它处于开发阶段(以及最终发布)期间,如果有一种方法可以监控它并向它发送命令,那将是一件很酷的事情。
最初通过串口实现通信似乎是个好主意,然后 rewrite/reuse 无线电通信器或类似东西的代码。代码运行良好,直到 出现一些错误。
首先使用 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 的终端示例中是一种类似的方法,但我不明白它为什么起作用,而这段代码却不起作用。它是如何工作的?
已解决。出于某种原因,在 .pro 文件上添加 "QT+=widgets"
生成了一个功能程序,除了已经添加的 "QT+=serialport"
.
我试图为一个 Arduino 的项目构建一个 GUI。该项目本身是关于一个用于港口集装箱管理的汽车机器人,在它处于开发阶段(以及最终发布)期间,如果有一种方法可以监控它并向它发送命令,那将是一件很酷的事情。
最初通过串口实现通信似乎是个好主意,然后 rewrite/reuse 无线电通信器或类似东西的代码。代码运行良好,直到 出现一些错误。
首先使用 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 的终端示例中是一种类似的方法,但我不明白它为什么起作用,而这段代码却不起作用。它是如何工作的?
已解决。出于某种原因,在 .pro 文件上添加 "QT+=widgets"
生成了一个功能程序,除了已经添加的 "QT+=serialport"
.