5

そのQStringがローカルである場合、QStringでシグナルを送信する正しい方法は何ですか? 私はwiddetAでこのような機能を持っていることを意味します

void wigdetA::something()
{

//
//e.g
//
QTreeWidgetItem *it = this->treeWidget->currentItem();
if (it == 0)
    return;

QString s = it->text(1);

emit passToMainWindow(s);
}

このような接続を作成する必要があります (const QString のみ):

 connect(wigdetA, SIGNAL(passToMainWindow(const QString)), this, SLOT(passToMainWindow(const QString)));

または const 参照を使用できますか

connect(wigdetA, SIGNAL(passToMainWindow(const QString&)), this, SLOT(passToMainWindow(const QString&)));

どちらの方法でも機能しますが、 QString s がローカルであり、関数 something() が終了すると破棄されるため、2 番目の const& によってアプリケーションがクラッシュします。

または私は何かが欠けていますか?

4

3 に答える 3

2

送信オブジェクトと受信オブジェクトは両方ともメインスレッドにあるため、Qtは直接接続を使用します(送信するとすぐにスロットが呼び出されます)。この場合、ローカル文字列はまだスタック上にあります。

ただし、特に異なるスレッドに存在するオブジェクト間で接続が行われる場合は、値で渡す方が常に適切です。QStringは暗黙的な共有(別名コピーオンライト)を使用するため、値で渡すのにそれほどコストはかかりません。

于 2013-01-08T14:17:55.760 に答える
0

放出されると、メインウィンドウのemit passToMainWindow(s)スロットが呼び出されます。だから大したことではないでしょう。彼らが主に使用するqtスロットを扱うときconst QString&、フレームワークは、スロットによって使用される前に文字列が削除されないように注意するだろうと思います。

于 2013-01-08T14:18:04.993 に答える