2011-10-24 5 views
1

Qt Creatorとそれに付随するGUIツールを使用して開発されたQtアプリケーションがあります。私はメインスレッドTheGuiとメインスレッドWorkerThreadthreadと呼ばれる)によって作成されたワーカースレッドを持っています。Qt Q信号/スロットを使用して作業員からguiに行く際に問題が発生する

Iは、ワーカースレッドのヘッダファイル内のGUIと信号void sendList(string str);のヘッダファイル内

public slot: 
    void updateTable(string str); 

を使用してGUIのスロットを作成するときに、私が抱えている問題は、スロット決して呼び出される。 GUI cppファイルのコンストラクタ内で

connect(&thread, SIGNAL(sendList(string str), 
     this, SLOT(updateTable(string str))); 

を使用して2つを接続しました。私は、ワーカースレッドのスロットとGUIからの信号を除いて、何か似たようなことをしました。私は信号sendListが実際に呼び出されていることをデバッガを使用することから知っています。

どのような考えですか?

+0

参照http://stackoverflow.com/questions/4927860/how-to-pass-variables-to-slot-methods-in-qt –

答えて

4
  1. 信号とスロットが異なるスレッドであるため、それらの間の接続はQt::QueuedConnectionタイプを有しています。キューに入れられた接続の場合、Qtは信号パラメータのコピーを保存して、あとでスロットに渡す必要があります。

    // This macro call should be put in one of your .h files 
    Q_DECLARE_METATYPE(std::string) 
    
    // You should call this function before any (queued) 
    // signal/slot connection involving the type 
    qRegisterMetaType<std::string>(); 
    
  2. パラメータ名はQObject::connectに含めるべきではありません。このようなので、
    、タイプがコピー可能であることはQtを知らせるために、あなたはQtのメタオブジェクトシステムに登録する必要があります(QMetaTypeを参照してください)呼び出して、型の名前は、あなたがQ_DECLARE_METATYPEに渡されたものとまったく同じでなければなりません:

    ます。またQStringまたはQByteArrayを使用することができます
    connect(&thread, SIGNAL(sendList(std::string), this, SLOT(updateTable(std::string))); 
    

std::stringの代わりにすでに登録されているものです。これらの機能はスロットと信号であり、既にQt固有のものです。

+0

応答ありがとうございます!私は実際にポインタを使用して、これを一時的に回避しました。 qRegisterMetaTypeはどこで呼び出されますか? StringVectorが宣言しようとしているものがint QMetaTypeId(T *)[T = StringVector]で 'インスタンス化されたエラーが発生しています。 –

+0

@ Kyleおそらく、qRegisterMetaTypeを呼び出した.cppファイルにQ_DECLARE_METATYPEを使用したヘッダーファイルが含まれていない可能性があります。 – alexisdm

+0

ヘッダに必要な場所がありますか? Q_OBJECTの下に?また、私はQVector を使用し、それをスロットを使って渡しました。私が見てきたドキュメントに基づいて、これは自動的に登録されませんか? –

1

実際に接続されていますか?接続呼び出しに問題がある場合は、通常、cerrにデバッグ出力があります。

は第二に、私はあなたがタイプミスがあると思う - あなたのコードからの接続コールをコピーした場合、その後、あなたはSIGNAL周り行方不明括弧を持っていることを知っている -

connect(&thread, SIGNAL(sendList(string)), this, SLOT(updateTable(string))); 

する必要があります第三に、とあなたが渡しているということです信号/スロットパラメータ?それはstd :: stringですか?スレッド間の接続は、キューに入れられた接続でなければなりません。待ち接続は、Q_DECLARE_METATYPEマクロで宣言されたタイプのみのパラメータとして使用でき、qRegisterMetaTypeで登録されています。私が知る限り、Qtはデフォルトでstd::stringのものを宣言していません。QStringが好きです。あなたのコードにそれらを追加しなかった場合、それが失敗の理由かもしれません。

関連する問題