QtCreator C ++在主窗口中创建线程

时间:2018-11-14 14:16:57

标签: qt qthread

我正在构建一个应用程序,该应用程序通过串行接口接收数据。因此,我实现了用于串行处理的类,该类可以成功接收和发送数据。现在,我尝试将数据移至UI,并将其提供给控制台,但为此我需要一个线程,这似乎比我预期的要困难。

因此我需要以某种方式定义一个线程,并在创建UserInterface时将其启动,然后该线程应轮询一个函数以获取新数据。我研究了创建线程并将其连接到回调函数的方法,但是它始终与创建一个类有关,该类继承自QThread,而我无法对Main UI进行此操作。

我应该如何在Main UI中定义一个线程,然后可以用来查询函数?

编辑:按照建议,这里不需要线程,但是我不知道如何在没有对象的类中调用函数。在mainWindow类中,所有UI内容(如标签和按钮)都位于其中,我创建了一个用于串行通信的对象。在该对象内部,当接收到新数据时,将调用中断。因此,例如,我可以将该数据放入该串行对象中,但仍然需要某种方式转发它们。

Edit2 :第一种有效的方法是实现计时器,该计时器会定期调用更新功能。但是由于串行rx是中断驱动的,因此必须有一种回调方法,这样我就不必轮询它。

1 个答案:

答案 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();
}