0

qApp->exit() を使用してアプリケーションを終了し、UI を閉じようとしました。しかし、qApp->exit() が実行された後も UI が残っていることに失敗しました。誰でも理由を理解するのを助けることができますか? どうもありがとう。

#include "clsDownloadUpdateList.h"
#include <QApplication>
#include <qtranslator.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load("en-CN_upgrader");
    qApp->installTranslator(&translator);
    clsDownloadUpdateList w;
    w.show();

    return a.exec();
}

clsDownloadUpdateList::clsDownloadUpdateList(QWidget *parent) :
    QMainWindow(parent),
    _state(STOP),
    ui(new Ui::clsDownloadUpdateList)
{
    ui->setupUi(this);
    this->setWindowTitle("GCS Upgrader");
// other code
// here comes the code to exit application
            qApp->exit();
// but the UI is still there.
}
4

3 に答える 3

2

@thugaは正しいです。あなたが抱えている問題は、あなたの間違ったコードによって引き起こされます:qApp->exit()あなたのアプリケーションがまだメッセージサイクルを開始していないコンストラクターの前に呼び出します (by a.exec())。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load("en-CN_upgrader");
    qApp->installTranslator(&translator);
    clsDownloadUpdateList w; // <- you call qApp->exit() right here, before a.exec();
    w.show();

    return a.exec();
}
于 2016-01-22T09:56:33.930 に答える
1

イベントループがまだ開始されていないため、コンストラクターでは役に立ちません。

このような場合、タイムアウトをゼロにして QTimer::singleShot() を使用できます。イベントループが開始されたときに必要なものを呼び出します。また、初期化メソッドを使用してメインで確認することをお勧めします。

Window w;
if ( !w.init() )
   return 1;
w.show();
return a.exec();
于 2016-01-22T09:59:38.873 に答える
0

作業コード:

#include <QMetaObject>
//...
QMetaObject::invokeMethod(qApp, "quit",
    Qt::QueuedConnection);

またはウィジェットの場合:

QMetaObject::invokeMethod(this, "close",
    Qt::QueuedConnection);
于 2016-01-22T10:21:06.233 に答える