【问题标题】:Connect signals from worker class to controller class - QThreads将信号从工作类连接到控制器类 - QThreads
【发布时间】:2018-06-06 10:15:30
【问题描述】:

标题:

#ifndef CONTROLLER_THREAD
#define CONTROLLER_THREAD

#include <QThread>

class Worker : public QObject
{
    Q_OBJECT
public:
    Worker();
    ~Worker();

private slots:
    void calculateImage();

signals:
    void imageReady();
};

class Controller: public QObject
{
public:
    Worker  objWorker;
    QThread objQThread;

    Controller();
    ~Controller();

public slots:
    void receiveImage();
};

#endif // CONTROLLER_THREAD

来源:

#include <controller_thread.h>

Worker::Worker(){}
Worker::~Worker(){}

void Worker::calculateImage()
{

}

Controller::Controller()
{
    objWorker.moveToThread( &objQThread );

    connect( objWorker, objWorker::imageReady, this, receiveImage );

    objQThread.start();
}

Controller::~Controller(){}

void Controller::receiveImage()
{

}

我收到错误消息:

 error: ‘objWorker’ is not a class, namespace, or enumeration
     connect( objWorker, objWorker::imageReady, this, receiveImage );

                     ^

这个错误是什么意思?如何解决?

输入:
connect( objWorker, &amp;Worker::imageReady, this, &amp;Controller::receiveImage );

结果:

error: no matching function for call to ‘Controller::connect(Worker&amp;, void (Worker::*)(), Controller*, void (Controller::*)())

【问题讨论】:

    标签: c++ qt qthread


    【解决方案1】:

    错误在这一行:

    connect( objWorker, objWorker::imageReady, this, receiveImage );

    在“新”Qt5 语法中,您需要在此处提供类名而不是对象名 - objWorker::imageReady

    所以,你的连接语句应该是这样的:

    connect( objWorker, &Worker::imageReady, this, &Controller::receiveImage );
    

    有关“新”Qt5 连接语法的更多帮助,您可以参考here

    【讨论】:

    • 更一般地说,这就是我们在 C++ 中编写指向成员函数的指针的方式。
    • 是的,详细解释在我提供的文档中。不想让简单的问题变得复杂
    • 我输入了这个:connect( objWorker, &amp;Worker::imageReady, this, &amp;Controller::receiveImage );。它导致了这个错误:error: no matching function for call to ‘Controller::connect(Worker&amp;, void (Worker::*)(), Controller*, void (Controller::*)())’ connect( objWorker, &amp;Worker::imageReady, this, &amp;Controller::receiveImage ); ^
    • 还注意到,您的 Controller 类的定义中没有 Q_OBJECT 宏。没有它,信号和插槽将不适用于该类
    • 谢谢,这是一个问题。另一个问题是,我需要写 connect(&objWorker,而不是 connect(objWorker,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2015-11-11
    相关资源
    最近更新 更多