から
delete ui;
であると述べました。これを行う必要がある時間はほとんどなく、常に抽象化する必要があります。このような呼び出しは、低レベルのリソース管理クラスにのみ属します。 QObject
またはQWidget
のサブクラスでこれを行うと考えている場合は、ほとんどありません。
ウィンドウを閉じる場合は、QWidget::close()
を使用してください。しかし、ウィジェットインスタンスを破棄して、ウィジェットインスタンスが使用するリソースを解放したい場合もあります。それから読んでください。
のはAuthentication
は、認証がそれぞれ、成功または失敗したときに、必要に応じてaccepted()
とrejected()
信号を発する適切なダイアログであると仮定しよう:
class Authentication : public QDialog {
...
};
、このようなダイアログから手続のいくつかの方法があるかもしれない:
ダイアログがスコープのローカル変数として定義され、ダイアログがアクティブである限りイベントループを実行し、スコープから離します。
int main(int argc, char ** argv) {
QApplication app{argc, argv};
{
Authentication auth;
auto result = auth.exec();
if (result == QDialog::Rejected) return 1;
} // here auth has been destructed
MainWindow window;
window.show();
return app.exec();
}
ダイアログを動的に割り当て、閉じたときに自動的に削除されます。万が一のQObjectから
int main(int argc, char ** argv) {
QApplication app{argc, argv};
auto auth = new Authentication;
auth->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(auth, &QDialog::accepted, []{
auto win = new MainWindow;
win->setAttribute(Qt::WA_DeleteOnClose);
win->show();
});
auth->show();
return app.exec();
}
ん真偽inehrit?また、技術的に可能な限りクラス内からデストラクタを呼び出すのは、somethnigが間違っていたらデバッグするのが難しいです(後で触れないことを保証する必要があります)。認証がQObjectの場合は、this-> deleteLater();を使用することをお勧めします。さらに、MainWindowに親を渡さないで、今破壊されたクラスでnewを呼び出すので、削除するポインタを取得できない可能性があるため、メモリがリークします。あなたがその呼び出しの後にそれを表示し、それを削除すると...あなたはまだ破壊されたクラスで動作しています。非常に悪いデザインの決定のように見えます。 – Resurrection
デストラクタを明示的に呼び出さないでください。まれなケースである「配置の新しさ」を除いて。 – ilotXXI
はい認証はQObjectのQWidgetとinehritです。問題は私がthis->〜Authentification();と呼んだときです。認証クラスは完全に閉じられていません。メインウィンドウを閉じると、もう一度〜Authentification()を呼び出します。 – Dababi