Qt Signal Slot连接问题

Qt Signal Slot connection issue

尝试创建 2 个位于不同线程中的对象(客户端)并与位于主线程中的 1 个对象(服务器)通信。 但是我在服务器对象上没有看到任何 activity 。 此代码的主要目标是查看当来自 2 个不同线程的 2 个信号与主线程上的单个对象通信时信号槽的行为。

objects.cpp:

    #include "objects.h"

    Objects::Objects(QObject* parent): QObject (parent)
    {
    }

    void Objects::printData(const QString& data)
    {
        qDebug() << data;
    }

    void Objects::process(const QString& data)
    {
        emit sendData(data+":processed");
    }

    Q_NORETURN void Objects::run()
    {
        while (true) {
            //qDebug() << "hit" << m_rate;
            emit sendData("test"+QString::number(m_rate));
            QThread::sleep(m_rate);
        }
    }

objects.h:

    #ifndef OBJECTS_H
    #define OBJECTS_H
    #include <QObject>
    #include <QDebug>
    #include <QThread>

    class Objects: public QObject
    {
        Q_OBJECT
    public:
        explicit Objects(QObject* parent = Q_NULLPTR);

    signals:
        void sendData(const QString&);

    public slots:
        void printData(const QString&);
        void process(const QString&);
        void run();

    public:
        ulong m_rate;

    };

    #endif // OBJECTS_H

main.cpp:

#include <QCoreApplication>
#include "objects.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Objects ser;
    Objects cl1;
    Objects cl2;
    cl1.m_rate = 1;
    cl2.m_rate = 2;

    QThread cl1_t;
    QThread cl2_t;

    QObject::connect(&cl1_t, &QThread::started, &cl1, &Objects::run);
    QObject::connect(&cl2_t, &QThread::started, &cl2, &Objects::run);


    QObject::connect(&cl1, &Objects::sendData, &ser, &Objects::process);
    QObject::connect(&cl2, &Objects::sendData, &ser, &Objects::process);

    QObject::connect(&ser, &Objects::sendData, &cl1, &Objects::printData);
    QObject::connect(&ser, &Objects::sendData, &cl2, &Objects::printData);

    cl1.moveToThread(&cl1_t);
    cl2.moveToThread(&cl2_t);

    cl1_t.start();
    cl2_t.start();

    return a.exec();
}

看起来您的 void run() 函数成员阻塞了 Qt 内部事件队列。只需将 QCoreApplication::processEvents(); 添加到您的 void run() 即可解决您的问题。

void Objects::run()
{
    while (true) {
        qDebug() << "hit" << m_rate;
        emit sendData("test" + QString::number(m_rate));
        QThread::sleep(m_rate);
        QCoreApplication::processEvents();
    }
}

更新: 我会建议您阅读 THIS wiki 文章,以更详细地解释您的问题。