я пытаюсь вызвать слот в объекте потока, когда запускается, но получаю эту ошибку:
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, то вы можете подключить сигнал к лямбда-функциям, а не только к слотам, но я не совсем уверен, поддерживает ли это создание замыкания (то есть, используя локальную переменную в лямбда-функции, что вам нужно здесь).
Я думаю, что вам нужно изменить сигнал и подписи слотов. Из документации QT:
Правило о том, включать или не включать аргументы в макросы SIGNAL () и SLOT (), если аргументы имеют значения по умолчанию, заключается в том, что подпись, передаваемая в макрос SIGNAL (), не должна иметь меньше аргументов, чем подпись, передаваемая в SLOT. () макрос.