0

QDialog ベースのクラスによってスロットが呼び出されたとします。

他の場所でダイアログを作成します。

 MyDialog *dlg = new MyDialog (this);
 connect (dlg , SIGNAL(valueSet(QString)) , SLOT(slotGetValue(QString)));
 dlg->exec ();

そして、スロットで、QObject である「最も深い」親クラスの削除を使用して、オブジェクトを削除します。

 void slotGetValue (const QString & key)
 {
    // process the value we retrieved
    // now delete the dialog created
    sender()->deletLater ();
 }

それはこれを行う正しい方法ですか?それは安全ですか?

4

1 に答える 1

1

モーダルなダイアログを削除する理由はありません。QDialog::exec() はブロックするので、ダイアログは戻った直後に安全に削除できます。

MyDialog *dlg = new MyDialog (this);
connect (dlg , SIGNAL(valueSet(QString)) , SLOT(slotGetValue(QString)));
dlg->exec ();
delete (dlg);

このことから、おそらく new と delete を使用する必要はないと推測できます。スタックに置くだけで、スコープを離れると破壊されます。このような:

MyDialog dlg(this);
connect(&dlg, SIGNAL(valueSet(QString)) , SLOT(slotGetValue(QString)));
dlg.exec();

また、MyDialog コンストラクターで this ポインターが必要でない限り、渡す必要はありません。

于 2012-05-03T14:53:21.047 に答える