2016-10-15 11 views
0

私はUbuntu 14.04でQt 4.8を使用しています。Qt:このコードのシグナル引数を正しく定義する方法は?

signals: 
    void newMessage(const QByteArray & newData); 

か::(ヘッダファイル内)newMessage信号を定義するための適切な方法だろう何
-

void MyServer::processMessage() 
{ 
    QByteArray data; 
    ... 

    ... 
    emit newMessage(data); 
} 


現在、私は次のコードを持っています

signals: 
    void newMessage(QByteArray newData); 

上記のように、シグナルはを出る直前に放出されます関数であるため、シグナルを放出した直後にはQByteArray dataはもう存在しません...
シグナルを定義する最初の方法についての心配は、それが引数としてオブジェクト(インスタンス)への参照を渡すことですnewMessageが放出された後はもう存在しません。

あなたの時間と忍耐力に感謝します!
ところで:私のアプリはシングルスレッドです。
PS:アプリがマルチスレッドであれば、状況は変わりますか?

答えて

2

最も一般的なバージョンが

signals: 
    void newMessage(const QByteArray &newData); 

だろうけれども、どちらも、OKですあなたの最初のオプションについての心配について:参照を渡すことはでのみ行うことができます他のものは信号引数がQVariantに格納可能であり、参照はそうでないことを要求するので、10(これは基本的にシングルスレッド信号/スロット接続の結果となります)。

このようなQt::DirectConnectionを使用すると、信号に接続されているすべてのスロットが実行されたときに、放射が返されます。 この時点でもう誰もdataオブジェクトを必要としません。

1

前の回答 'how to pass qobject as argument from signal to slot in qt connect'で説明したように、Objectをポインタとして渡すことをお勧めします。

ので、信号の宣言は次のとおりです。

signals: 
    void newMessage(QByteArray* newData); 

、信号の放出は、次のとおりです。

void MyServer::processMessage() 
{ 
    QByteArray data; 
    ... 

    ... 
    emit newMessage(&data); 
} 
+0

私が正しく覚えていれば、QObjectはコピーできないので、値渡しすることはできません。今QObjectについて言及しました。 –

+0

とにかく、ポインタまたは参照 - それはあまりにも重要ではありません値でデータオブジェクトを渡す必要はありません)。結局のところ、リファレンスは、自動間接指定を持つ定数ポインタ(コンパイラが*演算子を置く)として見ることができます。 –

+1

しないでください。これはOPが心配していた問題(接続タイプが 'Qt :: QueuedConnection'だった場合)になります。 'QObject'は、通常はポインタ値によって渡されます。なぜなら、それらは値渡しできないからです(コピー可能ではありません)。 'QByteArray'は' QObject'ではなく、コピー可能であり、ポインタによって渡される理由はありません。 – Mike

関連する問題