QT对象::连接:没有此类插槽信号到线程插槽

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

本文关键字:插槽 信号 线程 对象 连接 QT      更新时间:2023-10-16

我尝试在开始时尝试在线程对象中调用插槽,但是得到此错误:

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 *&);
};
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());
}

我尚未在计算机上编译代码,但这应该暗示您需要的内容:

     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;
};

您不能那样做,您不能将当前变量作为连接中的插槽方法参数传递,并且插槽的参数不能超过信号。除其他答案外,您还可以使用QSignalMapper实现此目标,但是如果您与插槽有一个连接,那似乎是一个过大的杀伤力。

如果您可以使用QT5和C 11,则可以将信号连接到lambda功能,而不仅仅是插槽,但我不确定是否支持创建闭合(也就是说,使用该闭合lambda函数,您需要在这里)。

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

关于是否在信号()和slot()宏中包含参数的规则,如果参数为默认值,则传递给信号()宏的签名不得比传递的签名的参数更少。到插槽()宏。