Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как передать аргументы в слот, которых нет в сигнале?

#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

Комментариев нет:

Отправить комментарий