Закрытие QMainWindow на запуске?

У меня есть спокойное приложение, которое использует a QMainWindow- производный класс для основного UI. На запуске я хочу сделать некоторые проверки безопасности и, если они приводят к сбою, отображают сообщение пользователю и закрывают главное окно. В настоящее время я делаю эти регистрации QMainWindow конструктор, но если я звоню close метод, ничего не происходит, и приложение продолжает работать. Например:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    setupUi(this);
    ...
    if (checkFails())
    {
        QMessageBox::warning(this, tr("Error"), tr("You cannot run this app"));
        // This has no effect
        close();
    }
}

Кроме того, я мог сделать регистрации основной функции, но тогда я теряю способность отобразить определенное для языка окно сообщения ( tr макрос только работает в a QObject- производный класс видами вещей.)

Любые идеи о том, как закрыть главное окно на запуске или сделать tr макро-работа за пределами a QObject производный класс?

11
задан Rob 1 March 2010 в 15:20
поделиться

3 ответа

Цикл событий должен быть запущен до того, как вы сможете успешно закрыть главное окно. Поскольку вы, вероятно, сначала создаете окно, а затем запускаете цикл событий, вызов close() не имеет никакого эффекта. Попробуйте вместо этого следующее решение:

QTimer::singleShot(0, this, SLOT(close()));

Вызов QTimer::singleShot() сработает, как только будет запущен цикл событий, а затем вызовет метод close() на главном окне вашего приложения.

Приведенное выше решение, вероятно, приведет к тому, что главное окно вашего приложения будет видно в течение короткого периода времени, вызывая нежелательное мерцание.

Более чистое решение должно выполнять проверку безопасности до создания главного окна. Поскольку tr() также доступен как статический метод на QObject, это можно сделать из функции main.

26
ответ дан 3 December 2019 в 02:40
поделиться

Пробовали ли вы сначала скрыть()окно (это должно произойти в любом случае при вызове close()), чтобы посмотреть, позволит ли это close() уничтожить окно.

Если это не сработает, вы всегда можете попробовать уничтожить окно с помощью destroy(true, true)ing вместе с любыми вложенными окнами.

0
ответ дан 3 December 2019 в 02:40
поделиться

tr является общедоступным статическим членом QObject. Вы должны иметь возможность вызвать QObject :: tr ("Error") в своей основной функции.

2
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: