#cpp #qt
Стоит задача из отдельного потока вызвать слот другого класса. пытаюсь сделать так: MakePost *SendPost = new MakePost (); QThread *PostThread = new QThread; SendPost->moveToThread(PostThread); connect(PostThread, SIGNAL(started()), MakePost, SLOT(MakePostSignal ("GetSett", "/test.php", "test=1"))); PostThread->start(); и получаю ошибку: QObject::connect: No such slot MakePost::MakePostSignal ("GetSett", "/test.php", "test=1") , хотя в MakePost.h есть public slots: void MakePostSignal(QString, QString, QByteArray); Подскажите, что делаю не так, как передать значения в слот?.... Заранее спасибо
Ответы
Ответ 1
Если у Вас Qt5, то можно сделать следующим образом: MakePost *SendPost = new MakePost (); QThread *PostThread = new QThread; SendPost->moveToThread(PostThread); connect(PostThread, &QThread::started, MakePost, [MakePost] { MakePost->MakePostSignal("GetSett", "/test.php", "test=1"); }); PostThread->start();Ответ 2
В коннекте передать данные нельзя. Нужно сделать что-то типа такого: class MyClass : public QObject{ Q_OBJECT //... void foo(){ MakePost *sendPost = new MakePost (); QThread *postThread = new QThread; sendPost->moveToThread(postThread); connect(postThread, SIGNAL(started()), this, SLOT(_start())); connect(this, SIGNAL(start(QString, QString, QByteArray)), sendPost, SLOT(MakePostSignal(QString, QString, QByteArray))); PostThread->start(); } signals: void start(QString str1, QString str2, QByteArray arr); private slots: void _start(){ emit("GetSett", "/test.php", "test=1"); } }; this принимает сигнал потока started и шлет сигнал start, который принимает объект sendPost UPD: Или было бы лучше передавать нужные данные сразу в MakePost class MyClass : public QObject{ Q_OBJECT //... void foo(){ MakePost *sendPost = new MakePost("GetSett", "/test.php", "test=1"); QThread *postThread = new QThread; sendPost->moveToThread(postThread); connect(postThread, SIGNAL(started()), sendPost, SLOT(MakePostSignal())); PostThread->start(); } }; PS: В этом коде я никак не заботился об утечках памяти. Но вам следует это сделать. Можно это сделать так: connect(sendPost, SIGNAL(finished()), postThread, SLOT(deleteLater())); connect(sendPost, SIGNAL(finished()), sendPost, SLOT(deleteLater())); естественно для этого нужно добавить в MakePost сигнал finished PPS: Посмотрите в сторону QThreadPool + QRunnable или QtConcurrent::run(). В ряде случаев они куда удобнее QThread
Комментариев нет:
Отправить комментарий