Qt Object :: connect: такого слота нет. Сигнал к слоту нити

я пытаюсь вызвать слот в объекте потока, когда запускается, но получаю эту ошибку:

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

Решение

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());
}
3

Другие решения

Я не скомпилировал код на своем компьютере, но он должен подразумевать то, что вам нужно:

     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;

};
1

Вы не можете сделать это таким образом, вы не можете передать текущие переменные в качестве параметров метода слота в соединении, и слот не может иметь больше параметров, чем сигнал. В дополнение к другим ответам, вы можете достичь этого с QSignalMapper, но если у вас есть только одно соединение со слотом, это кажется излишним.

Если вы можете использовать Qt5 и C ++ 11, то вы можете подключить сигнал к лямбда-функциям, а не только к слотам, но я не совсем уверен, поддерживает ли это создание замыкания (то есть, используя локальную переменную в лямбда-функции, что вам нужно здесь).

1

Я думаю, что вам нужно изменить сигнал и подписи слотов. Из документации QT:

Правило о том, включать или не включать аргументы в макросы SIGNAL () и SLOT (), если аргументы имеют значения по умолчанию, заключается в том, что подпись, передаваемая в макрос SIGNAL (), не должна иметь меньше аргументов, чем подпись, передаваемая в SLOT. () макрос.

0
По вопросам рекламы [email protected]