8
// main.cpp

#include <QApplication>

#include "mainwindow.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MainWindow* window = new MainWindow();
    window->show();
    return app.exec();
}

// mainwindow.cpp

#include <QTimer>
#include <QMessageBox>
#include <iostream>

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setCentralWidget(new QWidget());
}

void MainWindow::mousePressEvent(QMouseEvent* event)
{
    this->hide();
    QTimer* timer = new QTimer();
    timer->setInterval(3*1000);
    timer->start();
    connect(timer, SIGNAL(timeout()), this, SLOT(showMessageBox()));
}

void MainWindow::showMessageBox()
{
    QMessageBox::information(this, "Hello,", "world!", QMessageBox::Ok);
}

MainWindow::~MainWindow()
{
    std::cerr << "Destructor called" << std::endl;
}

ウィンドウをクリックすると、ウィンドウが非表示になり、QMessageBox が表示されます。[OK] をクリックすると、アプリケーションが終了し、MainWindow のデストラクタは呼び出されません。アプリケーションが終了するのはなぜですか? 多分私は何かを逃しましたか?Qt 4.7.0、Linux。

... おっとっと!必要なものが見つかったようです。

a.setQuitOnLastWindowClosed(false);

必要に応じて、a.exit(0) を使用してアプリを終了します。しかし、私はまだ何が間違っていたのか理解していません。

うん!何が悪いのか理解できたようです。方法のご案内です

QApplication::quitOnLastWindowClosed(bool):

このプロパティは、最後のウィンドウが閉じられたときにアプリケーションが暗黙的に終了するかどうかを保持します。デフォルトは真です。このプロパティが true の場合、Qt::WA_QuitOnClose 属性が設定された最後の表示可能なプライマリウィンドウ(つまり、親のないウィンドウ) が閉じられると、アプリケーションは終了します。デフォルトでは、この属性はサブウィンドウを除くすべてのウィジェットに設定されています。Qt::Window オブジェクトの詳細なリストについては、Qt::WindowType を参照してください。

QMainWindow が非表示になると、ウィンドウは表示されなくなります。QMessageBox が閉じられると、アプリケーションは終了します。

4

3 に答える 3

3

よくわかりませんが、QMessageBoxが閉じたときに、親(メインウィンドウ)の魔女にフォーカスを戻そうとしていると思います。この操作は失敗し、システムは例外をスローします。

于 2011-02-25T14:11:11.660 に答える
3

この問題は次のように思われます: ダイアログ ボックスが閉じられると、アプリケーションは開いているウィンドウ (setQuitOnLastWindowClosed表示されているトップレベル ウィンドウを参照) がないと判断し、終了します。オブジェクトを削除しないため、ウィンドウのデストラクタは呼び出されません!

これにより、次のメッセージが出力されます。

int main(int argc, char* argv[])
{
  QApplication app(argc, argv);
  MainWindow* window = new MainWindow();
  window->show();
  int ret = app.exec();
  delete window;
  return ret;
}

または、アプリケーションをウィンドウの親として設定することもできます

于 2011-02-25T14:27:23.890 に答える