qt5子线程向主线程发信号(被ChatGPT拯救的一天)

 最近需要用qt做界面,因为好久不用的缘故,尝试了N中子线程向主线程发信号的写法都失败了。

按照如下的方案,一定要注意,每个细节,尤其是connect函数中的书写一定要正确,否则可能无法关联信号。中年大叔被chatgpt拯救的一天。

以下回答来源与chatgpt4o

在 Qt 中,子线程向 UI 界面发信号是一种常见的线程间通信方式。由于 UI 线程(主线程)负责处理所有的 GUI 操作,直接在子线程中操作 UI 是不安全的。通过信号和槽机制,子线程可以发送信号,UI 线程可以接收并处理这些信号,从而实现线程间的安全通信。

下面是一个简单的例子,展示了如何在子线程中发出信号并在主线程中处理该信号。

步骤1:定义一个工作线程类

首先,我们定义一个 WorkerThread 类,它继承自 QThread。这个类有一个信号 progress,用于向主线程发送进度更新。

cpp

复制

#include <QThread>
#include <QObject>

class WorkerThread : public QThread {
    Q_OBJECT

public:
    WorkerThread(QObject* parent = nullptr) : QThread(parent) {}

signals:
    void progress(int value);

protected:
    void run() override {
        for (int i = 0; i <= 100; ++i) {
            QThread::sleep(1); // 模拟一些工作
            emit progress(i);  // 向主线程发送信号
        }
    }
};

步骤2:在主窗口中处理信号

然后,我们在主窗口类(例如 MainWindow)中连接这个信号,并定义一个槽函数来处理它。

cpp

复制

#include <QMainWindow>
#include <QProgressBar>
#include <QVBoxLayout>
#include "WorkerThread.h"

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) {
        QVBoxLayout* layout = new QVBoxLayout;
        progressBar = new QProgressBar;
        layout->addWidget(progressBar);

        QWidget* centralWidget = new QWidget;
        centralWidget->setLayout(layout);
        setCentralWidget(centralWidget);

        workerThread = new WorkerThread(this);
        connect(workerThread, &WorkerThread::progress, this, &MainWindow::updateProgress);
        workerThread->start();
    }

    ~MainWindow() {
        workerThread->quit();
        workerThread->wait();
    }

public slots:
    void updateProgress(int value) {
        progressBar->setValue(value);
    }

private:
    WorkerThread* workerThread;
    QProgressBar* progressBar;
};

步骤3:运行应用程序

最后,我们需要一个 main 函数来运行这个应用程序。

cpp

复制

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MainWindow window;
    window.show();
    return app.exec();
}

说明

  1. WorkerThread 类:继承自 QThread,在 run 方法中模拟了一些工作,并通过 progress 信号向主线程发送进度值。
  2. MainWindow 类:设置了一个进度条,并连接了 WorkerThread 的 progress 信号和 updateProgress 槽。当收到进度更新信号时,更新进度条的值。
  3. main 函数:启动应用程序并显示主窗口。

通过这种方式,可以安全地在子线程中进行后台处理,并在 UI 线程中更新界面。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值