[英]Qt Object::connect: No such slot Signal to Thread Slot
我尝试在威胁开始时在线程对象中调用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 *&);
};
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文档中:
如果参数具有默认值,则是否在SIGNAL()和SLOT()宏中包含参数的规则是,传递给SIGNAL()宏的签名不得少于传递给SLOT的签名。 ()宏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.