我尝试在线程对象启动时调用线程对象中的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 *&);
};
答案 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()宏。