1

私はWA_DeleteOnClose必要なものを正確に実装する属性を試しています。同じことを手動で行うよりもはるかにきれいです。ただし、問題があります。親なしで適用される myQMainWindowを作成WA_DeleteOnCloseすると、閉じるときに削除されません。また、親 (QMainWindowアプリケーションのメイン) を設定すると、問題のセカンダリQMainWindowはタスクバー ボタンを失いますが、これは受け入れられません。このジレンマをどのように解決できますか?

4

1 に答える 1

1

これWA_DeleteOnCloseは、トップレベルのウィジェットで機能するはずです。そうでない場合、それはバグであるか、ネストされたイベント ループを実行するなど、別のことをしている可能性があります。ウィンドウが削除されるかどうかの簡単なテストは次のようになります。

QObject::connect(widget, &QObject::destroyed, [](QObject * obj){
  qDebug() << obj << "was destroyed";
});

WA_DeleteOnClose は親なしで適用され、削除されません

WA_DeleteOnClose親を持つウィジェットによって影響を受ける動作の実装には、コードはありません。ウィジェットが -a である限り、Qt::Window削除されます。を参照してくださいcloseHelper

問題のセカンダリ QMainWindow は、受け入れられないタスクバー ボタンを失います。

これはおそらくQWidgetだけでなく、すべてに当てはまりますQMainWindow

確認のために、このテスト ケースは役に立ちませんか? アプリケーションの出力が何を示しているかお知らせください。

#include <QLabel>
#include <QPointer>
#include <QApplication>

int main(int argc, char ** argv) {
  QApplication app(argc, argv);
  QPointer<QLabel> label = new QLabel("Hello, world");
  label->setAttribute(Qt::WA_DeleteOnClose);
  label->setAttribute(Qt::WA_QuitOnClose);
  label->show();
  app.exec();
  qDebug() << qVersion() << label; // will be null if label was deleted
  return 0;
}
于 2015-07-16T20:10:22.960 に答える