Qt Object :: connect:没有这样的插槽信号到线程插槽

时间:2012-10-26 07:26:29

标签: c++ qt signals-slots

我尝试在线程对象启动时调用线程对象中的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 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分: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;

};

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

  

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