Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Как закрыть приложение из конструктора формы


Автор: borisbn 10.3.2010, 18:13
Какой способ закрыть приложение из конструктора основной формы самый "правильный" ?
Делаю так (упрощённо)
Код

// main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();
    return a.exec();
}

// my_widget.cpp
MyWidget::MyWidget()
{
    ...
    if ( былаОшибка )
    {
        qApp->quit(); // Не работает, т.к. a.exec() ещё не запущен
        return;
    }
}

Затевать что-то с таймером, по которому проверять "былаОшибка" и вызывать qApp->quit() - как-то некрасиво.
Закрывать приложение каким-нибудь exit( кодОшибки ) - тоже не хочется
Подскажите, есть ли способ из конструктора основной формы корректно закрыть приложение.

Автор: JackYF 10.3.2010, 18:24
borisbn, попробуй сделать

Код

QTimer::singleShot(0, &app, SLOT(quit()));

Автор: SABROG 10.3.2010, 18:34
Код

class MyWidget
{
...
public:
    inline bool isValid() const {return valid;}
private:
    bool valid;
};
...
MyWidget::MyWidget(QObject* parent) : QWidget(parent), valid(false)
{
    if ( былаОшибка )
    {
        return;
    }
    valid = true;
}
...
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    if (w.isValid()) {
        w.show();
        return a.exec();
    }
    return -1;
}

Автор: borisbn 10.3.2010, 18:59
SABROG, спасибо. Я между первой записью и этой покумекал и сделал именно так (по сути, а не по коду) smile
Код

class MyWidget
{
public:
    inline bool doQuit() const { return m_doQuit; }
...
}

MyWidget::MyWidget( QWidget *parent, Qt::WFlags flags )
    : QWidget(parent, flags)
    , m_doQuit( false )
{
    if ( былаОшибка )
    {
        m_doQuit = true;
        return;
    }
}

...
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    if ( w.doQuit() )
    {
        return -1;
    }
    w.show();
    return a.exec();
}


smile 

тему закрываю.

Автор: AlexS25 14.10.2010, 10:29
Всем спасибо! Все работает! =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)