0

当线程启动但收到此错误时,我尝试在线程对象中调用 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 *&);

};
4

4 回答 4

3
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());
}
于 2012-10-26T07:33:08.577 回答
1

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

     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;

};
于 2012-10-26T07:38:36.603 回答
1

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

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

于 2012-10-26T07:56:08.730 回答
0

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

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

于 2012-10-26T07:34:44.150 回答