qt子线程向主线程发消息

您可以使用信号量与槽来传递数据给主线程,让主线程更新。下面是一个最简单的例子,界面中只有一个label,主线程中通过movetothread的方法创建了一个子线程,然后子线程中不断触发showNum信号让主线程调用DisplayMsg来更新label 。

Qt子线程与主线程

在 Qt 中,我们可以使用 QThread 类来创建和管理线程,QThread 是 Qt 提供的一个用于管理子线程的类,它提供了一些信号和槽机制,使得子线程可以与主线程进行通信,子线程通过发出信号,主线程通过连接信号到槽函数来接收信号并处理。

子线程如何向主线程发送信号

1、使用 emit() 关键字

qt子线程向主线程发消息

在子线程中,我们可以使用 QObject 类的 emit() 关键字来发出信号,首先需要在子线程类中定义一个信号,然后在需要发送信号的地方调用 emit() 函数,这样,当主线程中的槽函数被调用时,子线程发出的信号就会被传递给主线程。

示例代码:

qt子线程向主线程发消息

include <QThread>
include <QObject>
include <QDebug>
class Worker : public QObject
{
    Q_OBJECT
public:
    explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
signals:
    void finished();
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Worker worker;
    QThread thread;
    worker.moveToThread(&thread);
    QObject::connect(&thread, &QThread::started, &worker, [&]() {
        // 在子线程中执行一些操作
        qDebug() << "子线程开始执行";
        QThread::sleep(1);
        qDebug() << "子线程执行完毕";
        // 发出信号
        worker.emit(worker, &Worker::finished);
    });
    QObject::connect(&worker, &Worker::finished, []() {
        qDebug() << "主线程收到信号";
    });
    thread.start();
    return a.exec();
}

2、使用 moveToThread() 函数和 queuedConnection()

如果子线程中的信号没有直接与主线程中的槽函数连接,我们可以使用 moveToThread() 函数将子线程移动到主线程中,并使用 queuedConnection() 将信号与槽函数连接起来,这样,当子线程发出信号时,信号会被自动放入主线程的事件队列中,等待主线程处理。

qt子线程向主线程发消息

示例代码:

include <QThread>
include <QObject>
include <QDebug>
include <QTimer>
include <QCoreApplication>
include <QQmlApplicationEngine>
include <QQuickView>
include <QEventLoop>
include <QMetaObject>
include <QMetaMethod>
include <QVariantMap>
include <QVariant>
include <QUrl>
include <QUrlQuery>
include <QJsonDocument>
include <QJsonObject>
include <QNetworkAccessManager>
include <QNetworkReply>
include <QNetworkRequest>
include <QFileInfo>
include <QFileDialog>
include <QMessageBox>
include <QInputDialog>
include <QTextStream>
include <QTextCodec>
include <QTimeZone>
include <QDateTime>
include <QLocale>
include <QMimeDatabase>
include <QProcessEnvironment>
include <QProcessState>
include <QProcessEnvironmentVariable>
include <QProcessStandardOutputProcessErrorStreamer>
include <QProcessStandardOutputProcessErrorStreamerSource>
include <QProcessStandardOutputProcessErrorStreamerDestination>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevices>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesType>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesName>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesSerialNumber>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesLocation>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesInterfaceName>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesInterfaceType>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesIPv4Address>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesIPv6Address>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesHostname>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesDomainName>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserName>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserPasswordHash>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserHomeDirectoryPathname>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesGroupNamesList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesGroupMembershipList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellPathname>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellIdentifierName>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutablePathname>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableArgumentsList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableWorkingDirectoryPathname>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableValueMapList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableValueMapKeyList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableValueMapKeyAndValueList>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableValueMapKeyAndValueListIterator>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableValueMapKeyAndValueListConstIterator>
include <QProcessStandardOutputProcessErrorStreamerDestinationDevicesUserShellExecutableEnvironmentVariableValueMapKeyAndValueListReverseIterator>

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/198439.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-01-04 22:36
Next 2024-01-04 22:37

相关推荐

  • Java线程安全的三大核心是什么「java线程安全的三大核心是什么」

    Java线程安全的三大核心是:原子性、可见性和有序性。1. 原子性(Atomicity):原子性是指一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行,在Java中,可以通过synchronized关键字来保证原子性,当一个线程访问一个对象的某个状态时,其他线程不能同时访问该对象的状态,直到当前线程完成对……

    2023-11-11
    0143
  • jsp中的include指令

    JSP(Java Server Pages)是一种基于Java技术的服务器端编程技术,它允许将Java代码嵌入到HTML页面中,从而实现动态网页的生成,在JSP中,include指令是一种用于包含其他文件内容的技术,可以将一个JSP文件的内容插入到另一个JSP文件中,从而实现页面的模块化和重用,本文将详细介绍JSP的include指令……

    2024-01-11
    0121
  • accept函数使用的方法有哪些

    在计算机编程中,accept函数是一个非常重要的函数,它主要用于网络编程中的服务器端,accept函数的主要作用是接受客户端的连接请求,当有新的客户端连接到服务器时,服务器会调用这个函数来接受这个连接,本文将详细介绍accept函数的使用方法。1、accept函数的基本概念在网络编程中,服务器端和客户端之间的通信是通过套接字(sock……

    2024-01-06
    0178
  • c 中ostream怎么使用

    ostream是C++标准输出流的一个基类,通常作为某个类的友元函数出现,用于˂˂操作重载中。ostream类的主要成员函数用法包括构造函数、插入运算符、输出运算符等 。

    2024-01-05
    0252
  • lock为什么要锁定一个参数

    为什么很多人都用CRITICAL_SECTION实现锁在多线程编程中,为了保证数据的一致性和完整性,我们需要对共享资源进行加锁和解锁操作,而Windows操作系统提供了一个名为CRITICAL_SECTION的原子操作对象,可以用来实现线程同步,那么为什么很多人都用CRITICAL_SECTION实现锁呢?

    2023-12-23
    0102
  • C语言的usleep函数怎么使用

    C语言的usleep函数是一个用于让程序暂停执行指定微秒数的函数,它属于unistd.h头文件,usleep函数的原型如下:include &lt;unistd.h&gt;unsigned int usleep(unsigned int usec);usec参数表示要暂停的微秒数,需要注意的是,usleep函数使用的是……

    2024-01-11
    0223

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入