connect (), кажется, префикс сигнала с неправильным пространством имен

Я пытаюсь использовать сигналы и слоты для передачи информации в поток 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);

0

Решение

Источник и цель соединения — один и тот же объект, 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).

1

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

Не передавайте указатели потоков в connect — передать указатели отправителю и получателю события (как это). Потому что вы даете это QThread вместо указателей, Qt ищет эти сигналы и слоты в QThreadгде они не существуют. Если вы даете это Visualizer вместо указателей, Qt будет искать эти функции в Visualizerгде они на самом деле, и все будет работать.

Надеюсь, это поможет!

2

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