2012-11-17 3 views
0

다른 스레드에서 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); 

답변

1

소스와의 연결 대상이 동일한 개체 this되어 있으므로 connect 호출 같아야 신호가 하나 Visualizer 아닌 다른 스레드로부터 방출되기 때문에

connect(this, SIGNAL(image_change(std::string)), this, SLOT(update_image(std::string))); 

친 화성을 갖는다 와 함께 (QObject::moveToThread() 참조) 슬롯과의 연결이 자동으로 큐에 대기되고 슬롯이 올바른 스레드에 의해 실행됩니다.

그러나 대기 연결이 작동하려면 Qt가 실제로 슬롯을 호출 할 때까지 매개 변수를 임시 저장해야합니다.이 매개 변수는 QVariant으로 변환 한 후 어딘가에 저장 한 다음 수신 할 때 실제 유형으로 다시 변환합니다 스레드가 슬롯을 실행할 준비가되었습니다.

그래서 당신은 Q_DECLARE_METATYPE와 Qt의 메타 타입 시스템에 std::string을 등록하거나 이미 등록되어 하나 (같은 QString 또는 QByteArray)에 신호와 슬롯 매개 변수 유형을 변경해야합니다.

2

connect로 스레드 포인터를 전달하지 않습니다 - 패스 포인터를 보낸 사람에게 및 이벤트 수신자 (like this). 대신 QThread 포인터를주고 있기 때문에, Qt는 그 신호와 슬롯이 존재하지 않는 QThread을 찾고 있습니다. 대신 Visualizer 포인터를 주면 Qt는 Visualizer에있는 함수를 찾게됩니다.이 함수는 실제로 존재하며 모든 것이 작동합니다.

희망 하시겠습니까?

+0

그래서 connect()의 첫 번째 매개 변수를 설정하여 QtConcurrent :: run() 스레드의 신호인지 확인합니다. – dutchgold92

+0

@ dutchgold92 - 음 ... 글쎄, Qt 멀티 스레딩에 대한 전문가는 아니지만, Qt가이 모든 것을 자체적으로 처리하고 신호가 올바른 스레드로 자동 이동한다고 믿습니다. –

+0

하지만 당신이 말하는 것을 기반으로 매개 변수를 설정하는 방법을 모르겠습니다. 예를 들어, 내가 이것을 이렇게 설정하면, connect (this, SIGNAL (image_change (std :: string)), this, SLOT (update_image (std :: string)), Qt :: QueuedConnection); – dutchgold92

관련 문제