9

非常に簡単な例として、ボタンを押したときに Qt でダイアログを表示したいとします。これの通常のパターン (私が現在取り組んでいるアプリケーションで) は次のようです。

class MainWindow {
  ...
private slots:
  buttonClicked();
  ...
private:
  ChildWindow * childWindow;
}

MainWindow::MainWindow(QWidget * parent) : QWidget(parent) {
  ...
  childWindow = new ChildWindow(this);
  ...
}

MainWindow::buttonClicked() {
  childWindow.show();
}

.NET および Windows フォームから来ている (そして、クラスの他の場所からそのオブジェクトにアクセスする必要がないため) 次のパターンは、私にとってより馴染み深いものです。

button1_Clicked(object sender, EventArgs e) {
  ChildWindow f = new ChildWindow();
  f.Show();
}

ローカル変数は、別のインスタンス フィールドがないこと、およびウィンドウが必要以上に長くメモリ内に留まらないことを意味します。それを C++ に直接変換すると、後から誰も解決しないので、少し見苦しくなります。私は次のことを試しました:

  1. shared_ptr. うまくいきませんdelete。メソッドが終了するとすぐにウィンドウが削除されます。つまり、新しいウィンドウが一瞬表示され、再び消えます。あまり良くない。

  2. exec()の代わりにshow()。これはモーダル ダイアログでは機能しますが、ドキュメントでは、イベント ループも停止し、QApplication::processEvents()更新が必要な場合は定期的に呼び出す必要があることを暗示しているようです。私はここでほとんど理解していませんが、あまりにも良くないと思います.

  3. deleteLater(). 悲しいことに、ウィンドウを表示するだけではブロックされないdeleteLaterため、表示されるとすぐに消えてしまいます。

ウィンドウを閉じるときにウィンドウをクリーンアップする良いオプションはありますか?

4

2 に答える 2

18
childWindow->setAttribute( Qt::WA_DeleteOnClose );

また、呼び出しexec()は呼び出しイベント ループの実行をブロックしますが、独自のイベント ループを生成するため、呼び出しはprocessEvents()必要ないことに注意してください。

于 2013-04-04T14:58:00.913 に答える