LINUX.ORG.RU

Как программно завершить Qt4 приложение?


0

0

Есть класс: #include <QApplication> #include <QMainWindow>

class MyClass : public QMainWindow { public: MyClass() { close(); } };

int main(int argc, char **argv) { QApplication app(argc, argv); MyClass * m = new MyClass(); m->show(); return app.exec(); }

Как правильно сделать (close() не срабатывает в данных условиях), чтобы app.exec() сразу же вышел, ничего не показывая и не оставив ничего в процессах?

anonymous

Ответ на: комментарий от rjaan

class MyClass : public QMainWindow { public: MyClass() { qApp->quit(); } };

Так, что ли? Аналогично не срабатывает, т.к. конструктор вызывается до запуска exec. И если перекрыть слот show и вызывать оттуда - тоже не поможет. Вообще подумал, здесь нужно прибиндить обработчик к какому-то сигналу, который вызывается после запуска цикла обработки сообщений, если такой вообще посылается, в справке что-то ничего подходящего не нашел.

anonymous
()
Ответ на: комментарий от ero-sennin

Да, именно этого я и хочу. Причем изменяя только сам класс, а не вызывающую программу. Нафига - ну, скажем при одних обстоятельствах показываю прогу, а если обстоятельства другие (ошибка или еще чего) - сразу же выхожу, не показывая виджет.

anonymous
()
Ответ на: комментарий от ero-sennin

Вообще-то мне надо чтобы приложение вышло как только оно запустит цикл сообщений. В принципе exit(-1) решает проблему, но можно ли как нить: ...

app.exec(); <- эта функция сразу должна сразу выйти и вернуть -1

somecode(); <- и потом еще выполнилось вот это, а не прибивалось все приложение?

return -1;

}

>> SIGKILL бугога Поподробней можно?

anonymous
()
Ответ на: комментарий от kitov

> Не выполняй QWidget::show .

А вы после этого ничего подозрительно в процессах не видите? Типа работающего приложения без главного окна? И которое из цикла выходить не собирается, пока его не снимут? Кроме того, я не могу менять вызывающую программу (она всегда будет вызывать конструктор и show), а только сам класс (перекрытие слота show c мгновенным оттуда возвратом дает аналогичный результат - ничего не видно, но приложение продолжает работать).

anonymous
()

1) в конструкторе поставь single-shot timer с задержкой 0, укажи ему слот.
2) в слоте уже проверяй условия и делай close(), когда надо.
   Иначе делай show() и продолжай работу программы.

Таймер отработает, когда запустится event loop, если сделаешь cllose(), ты сможешь попасть в блок кода,
следующий за app.exec();

Вот пример на Qt3. Запускать из ком.строки

# ./q 1
или
# ./q 0

-------------------------------------------------------

#include <qapplication.h>
#include <qwidget.h>
#include <qtimer.h>

#include <cstdio>

class S : public QWidget
{
    Q_OBJECT

    public:
        S(const char *s) : QWidget()
        {
            a = *s;

            QTimer::singleShot(0, this, SLOT(slotT()));
        }

        ~S()
        {}

    private:
        char a;

    private slots:
        void slotT()
        {
            if(a == '1')
                show();
            else
                close();
        }
};

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    S d(argc >= 2 ? argv[1]:"1");

    app.setMainWidget(&d);

    int res = app.exec();

    printf("After event loop!\n");

    return res;
}

#include "main.moc"

----------------------------------------------------

alex_custov ★★★★★
()
Ответ на: комментарий от anonymous

>>>> SIGKILL бугога >>Поподробней можно?

Это он пошутил.

alex_custov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.