Qt Object::connect: No such slot Signal to Thread Slot

Posted

技术标签:

【中文标题】Qt Object::connect: No such slot Signal to Thread Slot【英文标题】: 【发布时间】:2012-10-26 07:26:28 【问题描述】:

我尝试在线程启动时调用线程对象中的 Slot 但收到此错误:

Object::connect: No such slot Worker::doWork(pFoo)

线程执行代码:

// main class   

            m_WorkerThread = new QThread();

             FooStack* pfooStack = InternalStorageManager::getInstance()->getStack();
             m_Worker = new Worker();
             bool done = connect(m_WorkerThread,
                                    SIGNAL(started()),
                                    m_Worker,
                                    SLOT(doWork(pfooStack))); 

             m_Worker->moveToThread(m_WorkerThread);          
             m_WorkerThread->start();



// class Worker
 // cpp imple            
void Worker::doWork(FooStack *& rp_urlsStack)



// header 
class Worker : public QObject


    Q_OBJECT

    public :

        Worker();
        ~Worker();
    public slots:
        void doWork(FooStack *&);

;

【问题讨论】:

【参考方案1】:
Object::connect: No such slot Worker::doWork(pFoo)

您不能在连接声明中传递对象。

你不能将pfooStack 传递给Worker 构造函数吗?

编辑:

class Main : ...

    ...
    void startThread();  // The method in your example.
private slots:
     void startWork();
    ...
;

void Main::startThread()

     m_WorkerThread = new QThread();
     m_Worker = new Worker();
     bool done = connect(m_WorkerThread, SIGNAL(started()),
                         this, SLOT(startWork())); 

     m_Worker->moveToThread(m_WorkerThread);          
     m_WorkerThread->start();


void Main::startWork()

     m_Worker->doWork(InternalStorageManager::getInstance()->getStack());

【讨论】:

我想避免将成员保留在 Worker 对象中,以使 pFoo 引用指向指针 然后在您的主类中创建一个不带参数的私有插槽,并将其连接到您的工作线程的start() 信号。在您的私人插槽中调用m_WorkerThread->doWork((pfooStack)) 我在这里很困惑你是什么意思? .. 好的,你 .. 它是线程安全的吗? 只要InternalStorageManager::getInstance()->getStack()是。【参考方案2】:

我没有在我的电脑上编译代码,但它应该暗示你需要什么:

     m_WorkerThread = new QThread();

             FooStack* pfooStack = InternalStorageManager::getInstance()->getStack();
             m_Worker = new Worker(pfooStack);
             bool done = connect(m_WorkerThread,
                                    SIGNAL(started()),
                                    m_Worker,
                                    SLOT(doWork())); 

             m_Worker->moveToThread(m_WorkerThread);          
             m_WorkerThread->start();




void Worker::doWork()

      //use stack here


class Worker : public QObject


    Q_OBJECT

    public :

        Worker(FooStack *& rp_urlsStack):stack(rp_urlsStack);
        ~Worker();
    public slots:
        void doWork();
    private:
        FooStack*& stack;

;

【讨论】:

这没问题,但我想避免保留 FooStack 成员【参考方案3】:

你不能那样做,你不能在connect中将当前变量作为槽方法参数传递,槽不能有比信号更多的参数。除了其他答案之外,您还可以使用 QSignalMapper 实现此目的,但如果您只有一个与插槽的连接,那似乎有点过头了。

如果您可以使用 Qt5 和 C++11,那么您可以将信号连接到 lambda 函数,而不仅仅是插槽,但我不确定这是否支持创建闭包(即使用lambda 函数,这里需要用到)。

【讨论】:

【参考方案4】:

我认为您需要更改信号和插槽签名。来自 QT 文档:

关于是否在 SIGNAL() 和 SLOT() 宏中包含参数的规则,如果参数具有默认值,则传递给 SIGNAL() 宏的签名的参数不得少于传递的签名到 SLOT() 宏。

【讨论】:

我想我需要使用一些 QSignalMapper 我认为更好的解决方案是重新考虑您的类设计,或者将 pFooStack 传递给构造函数并将其存储在内部(如 Ruby 建议的那样),或者每次在 doWork 时获取您的 InternalStorageManager。

以上是关于Qt Object::connect: No such slot Signal to Thread Slot的主要内容,如果未能解决你的问题,请参考以下文章

Qt4 现有插槽无法识别

安装zabbix之后登陆报错:Error connecting to database: No su

Ubuntu: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No su

Ubuntu: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No su

Ubuntu: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No su

如何在 CMake 文件中添加定义 QT_NO_DEBUG_OUTPUT?