다른 스레드에서 pixmap을 수정할 수 없으므로 신호와 슬롯을 사용하여 다른 스레드에서 GUI 스레드로 정보를 전달하려고합니다. 내가 틀릴 수도 있지만, 그것이 실제로 Visualiser::image_change()
에 정의되어 신호가 잘못된 네임 스페이스에 검색되는 것처럼 보이는,connect()는 잘못된 네임 스페이스로 신호 접두사를 나타냅니다.
Object::connect: No such signal QThread::image_change(std::string) in visualiser.cpp:33
이에서 판단 : 나는 런타임 오류가 발생하고 있습니다.
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);
그래서 connect()의 첫 번째 매개 변수를 설정하여 QtConcurrent :: run() 스레드의 신호인지 확인합니다. – dutchgold92
@ dutchgold92 - 음 ... 글쎄, Qt 멀티 스레딩에 대한 전문가는 아니지만, Qt가이 모든 것을 자체적으로 처리하고 신호가 올바른 스레드로 자동 이동한다고 믿습니다. –
하지만 당신이 말하는 것을 기반으로 매개 변수를 설정하는 방법을 모르겠습니다. 예를 들어, 내가 이것을 이렇게 설정하면, connect (this, SIGNAL (image_change (std :: string)), this, SLOT (update_image (std :: string)), Qt :: QueuedConnection); – dutchgold92