1

QtCreatorとそれに付随するGUIツールを使用して開発されたQtアプリケーションがあります。メインスレッドTheGuiと、メインスレッドによって作成されるワーカースレッドWorkerThread(と呼ばれるthread)があります。

私が抱えている問題は、GUIでスロットを作成するときに使用することです

public slot:
  void updateTable(string str);

GUIのヘッダーファイル内およびvoid sendList(string str);ワーカースレッドのヘッダーファイル内のシグナル内では、スロットが呼び出されることはありません。私は2つを使用して接続しました

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

GUIcppファイルのコンストラクター内。ワーカースレッドのスロットとGUIからのシグナルを除いて、同様のことを行いましたが、正常に機能しました。デバッガーを使用して、シグナルsendListが実際に呼び出されていることを知っていますが、それは決して呼び出されません。

何かご意見は?

4

2 に答える 2

4
  1. 信号とスロットは別個のスレッド上にあるため、それらの間の接続にはQt::QueuedConnectionタイプがあります。また、キューに入れられた接続の場合、Qtは信号パラメータのコピーを保存して、後でスロットに渡すことができる必要があります。
    したがって、タイプがコピー可能であることをQtに通知するには、次のようにQtのメタオブジェクトシステム(QMetaTypeを参照)に登録する必要があります。

    // 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。また、型名は、渡したものとまったく同じである必要がありますQ_DECLARE_METATYPE

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

これらの関数はスロットとシグナルであり、Qt固有であるため、の代わりに、すでに登録されているQStringまたはを使用することもできます。QByteArraystd::string

于 2011-10-24T21:36:47.203 に答える
1

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

次に、タイプミスがあると思います。コードから接続呼び出しをコピーした場合は、SIGNALの前後に括弧がないことを知ってください。

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

第三に、シグナル/スロットパラメータとして何を渡していますか?std :: stringですか?スレッド間の接続は、キューに入れられた接続である必要があります。キューに入れられた接続は、Q_DECLARE_METATYPEマクロで宣言され、qRegisterMetaTypeで登録されたタイプのみをパラメーターとして使用できます。私の知る限り、Qtはデフォルトではstd::string、を優先するため、それらを宣言しませんQString。それらをコードに追加しなかった場合は、失敗の原因である可能性があります。

于 2011-10-24T21:25:21.450 に答える