我正在构建一个应用程序,该应用程序通过串行接口接收数据。因此,我实现了用于串行处理的类,该类可以成功接收和发送数据。现在,我尝试将数据移至UI,并将其提供给控制台,但为此我需要一个线程,这似乎比我预期的要困难。
因此我需要以某种方式定义一个线程,并在创建UserInterface时将其启动,然后该线程应轮询一个函数以获取新数据。我研究了创建线程并将其连接到回调函数的方法,但是它始终与创建一个类有关,该类继承自QThread,而我无法对Main UI进行此操作。
我应该如何在Main UI中定义一个线程,然后可以用来查询函数?
编辑:按照建议,这里不需要线程,但是我不知道如何在没有对象的类中调用函数。在mainWindow类中,所有UI内容(如标签和按钮)都位于其中,我创建了一个用于串行通信的对象。在该对象内部,当接收到新数据时,将调用中断。因此,例如,我可以将该数据放入该串行对象中,但仍然需要某种方式转发它们。
Edit2 :第一种有效的方法是实现计时器,该计时器会定期调用更新功能。但是由于串行rx是中断驱动的,因此必须有一种回调方法,这样我就不必轮询它。
答案 0 :(得分:1)
正如评论中所讨论的,在这种用例中,最好不使用线程,而是利用Qt事件循环和信号时隙机制。这是MainWindow和SerialReciver类的框架,以及它们如何在main.cpp中连接在一起。为简单起见,SerialReceiver类仅以当前时间每秒发送一次信号,该信号将附加到主窗口中的editfield内容中。
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPlainTextEdit>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void onSerialMessage(const QString &msg);
private:
QPlainTextEdit mTextField;
};
mainwindow.cpp:
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
mTextField.setReadOnly(true);
setCentralWidget(&mTextField);
}
MainWindow::~MainWindow()
{
}
void
MainWindow::onSerialMessage(const QString &msg)
{
mTextField.appendPlainText(msg);
}
#endif // MAINWINDOW_H
serialreceiver.h:
#ifndef SERIALRECEIVER_H
#define SERIALRECEIVER_H
#include <QObject>
#include <QTimer>
class SerialReceiver : public QObject
{
Q_OBJECT
public:
explicit SerialReceiver(QObject *parent = nullptr);
signals:
void newMsg(const QString &msg);
public slots:
void onSerialReceived();
private:
QTimer mTimer;
};
#endif // SERIALRECEIVER_H
serialreceiver.cpp:
#include "serialreceiver.h"
#include <QDateTime>
SerialReceiver::SerialReceiver(QObject *parent) : QObject(parent)
{
mTimer.setInterval(1000);
mTimer.setSingleShot(false);
connect(&mTimer, &QTimer::timeout,this,&SerialReceiver::onSerialReceived);
mTimer.start();
}
void
SerialReceiver::onSerialReceived()
{
QDateTime now = QDateTime::currentDateTime();
emit newMsg(now.toString());
}
和main.cpp:
#include "mainwindow.h"
#include "serialreceiver.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SerialReceiver receiver;
MainWindow w;
QObject::connect(&receiver, &SerialReceiver::newMsg,
&w,&MainWindow::onSerialMessage);
w.show();
return a.exec();
}