0

他のスレッドからピックスマップを変更できないため、シグナルとスロットを使用して、別のスレッドから GUI スレッドに情報を渡そうとしています。実行時エラーが発生しました:

Object::connect: No such signal QThread::image_change(std::string) in visualiser.cpp:33

このことから判断すると、私が間違っているかもしれませんが、シグナルは実際には で定義されているため、間違った名前空間で検索されているようですVisualiser::image_change()

私のコードは次のとおりです。

ビジュアライザー.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));
}

ビジュアライザー.h:

    signals:
    void image_change(std::string src);

public slots:
    void update_image(std::string src);
4

2 に答える 2

2

スレッドポインタをに渡さないでくださいconnect-イベントの送信者と受信者にポインタを渡します(このように)。代わりにポインタを与えているので、Qtはそれらが存在しないでQThreadそれらの信号とスロットを探しています。QThread代わりにVisualizerポインタを指定すると、QtはVisualizer実際に存在するでそれらの関数を検索し、すべてが機能します。

お役に立てば幸いです。

于 2012-11-17T13:23:31.243 に答える
1

接続のソースとターゲットは同じオブジェクト で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) に変更する必要があります。

于 2012-11-17T19:02:44.373 に答える