2

私のアプリケーションにはトレイ アイコンがあるので、closeEvent をオーバーライドして、特定のことが発生したときにアプリケーションが「最小化」されるようにしました。ただし、終了を押すと、アプリケーションが完全に終了することを期待しています。ただし、closeEvent をオーバーライドして関数 quit() を呼び出した後、いくつかのコードがある MainWindow デストラクタをバイパスしているようです。closeEvent がオーバーライドされていない場合のように、MainWindow のデストラクタが呼び出されるようにアプリケーションを適切に閉じるには、closeEvent に何が欠けていますか?

使ってみました

 QMainWindow::closeEvent(event);

他にもいくつかありますが、デストラクタは呼び出されません。

私のcloseイベントの実装は次のとおりです。

void MainWindow::closeEvent(QCloseEvent * event)
{
    if(m_closeCompletely == false)
    {
        if (trayIcon->isVisible())
        {
            QMessageBox::information(this, tr("Hello"),
                                     tr("The program will keep running in the "
                                        "system tray. To terminate the program, "
                                        "choose <b>Quit</b> in the context menu "
                                        "of the system tray entry."));
        }
    }
    else
    {
        event->accept();
    }
}
4

4 に答える 4

4

WA_DeleteOnClose 属性は、閉じるイベントでデストラクタを呼び出すように設定する必要があります。そうしないと、ウィジェットまたはウィンドウが非表示になります。以下をクラス コンストラクターに追加します。

this->setAttribute(Qt::WA_DeleteOnClose);

これにより、閉じるイベントでデストラクタが呼び出されます。

于 2015-07-28T13:22:13.987 に答える
2

それはすべて、使用しているオブジェクトをどこにどのように割り当てたかによって異なります。QApplicationヒープ上にandを作成するとQMainWindow、OS がメモリをクリーンアップするまでそれらは潜んでいます。(and is one)close()に a を送信すると、ユーザーから視覚的に非表示になります。後で破壊することはできません。QWidgetQMainWindowcloseshow()close()

次のようなものを使用できます。

int main(int argc, char* argv[]) {

   QApplication app(argc, argv);

   MyMainWindow mw;
   mw.show();

   int rc = app.exec();

   // optional: do_cleanup();

   return rc;
}

appスタック上mwに構築されます。appが呼び出しから戻ったexec()とき (通常は に送信quit()したとき) 、それらは逆の順序で破棄されますQCoreApplication::instance()。単純なクリーンアップ関数を提供することもできます。UI のデストラクタに何かを入れる必要はありません。

于 2012-12-21T07:36:26.473 に答える
0

すべてのアプリケーション リソースQApplicationは;によって保持されることに注意してください。

あなたMainWindowが閉じられると、それは単にclose画面から非表示になります。

なぜあなたはあなたの をデストラクタしたいのだろうか、あなたはシステムトレイMainWindowエントリを作成したようです.MainWindowMainWindow

お役に立てれば幸いです。: )

于 2012-12-21T09:36:35.420 に答える
0

これと同じ問題に遭遇したのは、アプリケーションを閉じることができない無限ループを実行していたためです。

forever
{
    _runGameLoop();
}

MainWindow閉じたときにループを終了する必要がありました

while(!M->isClosed())
{
    _runGameLoop();
}

そしてもちろん、私は実装しなければなりませんでしたisClosed()

bool MainWindow::isClosed()
{
    return _isClosed;
}

void MainWindow::closeEvent(QCloseEvent*)
{
    _isClosed = true;
}
于 2013-10-09T22:48:23.377 に答える