Я пытаюсь использовать сигналы и слоты для передачи информации в поток GUI из другого потока, так как я не могу изменить растровое изображение из любого другого потока. Я сталкиваюсь с ошибкой во время выполнения:
Object::connect: No such signal QThread::image_change(std::string) in visualiser.cpp:33
Исходя из этого, хотя я могу ошибаться, похоже, что сигнал ищется в неправильном пространстве имен, как это на самом деле определяется в Visualiser::image_change()
,
Мой код выглядит следующим образом:
Visualiser.cpp:
QFutureWatcher<void> watcher;
connect(watcher.thread(), SIGNAL(image_change(std::string)), QCoreApplication::instance()->thread(), SLOT(update_image(std::string)), Qt::QueuedConnection);
QFuture<void> update_thread = QtConcurrent::run(this, &Visualiser::update_state);
watcher.setFuture(update_thread);
...
emit(image_change(imageSrc));
...
void Visualiser::update_image(std::string src)
{
QImage image;
image.load(src.c_str());
ui->visualContainer->setPixmap(QPixmap::fromImage(image));
}
visualiser.h:
signals:
void image_change(std::string src);
public slots:
void update_image(std::string src);
Источник и цель соединения — один и тот же объект, this
, Итак connect
звонок должен быть:
connect(this, SIGNAL(image_change(std::string)), this, SLOT(update_image(std::string)));
Так как сигнал будет излучаться из другого потока, чем тот, который Visualizer
имеет сходство с (см. QObject :: moveToThread ()), соединение со слотом будет автоматически поставлено в очередь, и слот будет выполнен правильным потоком.
Но для работы с очередями Qt должен временно сохранить параметр, пока он не сможет фактически вызвать слот, что делается путем преобразования его в QVariant
сохраняя его где-то, а затем снова преобразовывая в фактический тип, когда принимающий поток готов выполнить слот.
Так что вам нужно зарегистрироваться std::string
в систему метатипов Qt с Q_DECLARE_METATYPE
или измените тип параметра сигнала и слота на тот, который уже зарегистрирован (например, QString
или же QByteArray
).
Не передавайте указатели потоков в connect
— передать указатели отправителю и получателю события (как это). Потому что вы даете это QThread
вместо указателей, Qt ищет эти сигналы и слоты в QThread
где они не существуют. Если вы даете это Visualizer
вместо указателей, Qt будет искать эти функции в Visualizer
где они на самом деле, и все будет работать.
Надеюсь, это поможет!