LINUX.ORG.RU

[Qt][Console] Сигнал завершения программы

 ,


0

1

Создал консольный проект в qtcreator'e

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    out << "test"  << endl;
//    a.exec();
    return 1;
}
Если раскомментировать a.exec(), то после запуска прога выводит test и ждет чего-то, не завершается.

Этот exec() я так понял нужен для того, чтобы работал механизм сигналов/слотов, так что он мне нужен.

В поиске нашел это: Qt: Console

Там все говорят, что после запуска exec() нужно потом убивать приложение QCoreApplication. Пробовал так

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    out << "test"  << endl;
    a.exec();
    QCoreApplication::exit();
    //QCoreApplication::quit();
    return 1;
}
- все равно виснет.

Потом думал, что он ждет каких-то сигналов наверно, и в одном из этих сигналов наверно надо посылать этот QCoreApplication::exit();

Создал класс

class Test : public QObject
{
Q_OBJECT
public:
    Test(QObject *parent = 0);

signals:

public slots:
    QString Run();
};

QString SvyaznoiExchange::Run()
{
    QCoreApplication::exit();
    return "XpeH BaM";
}
Попробовал запускать этот слот вот так:
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    out << "test"  << endl;
    Test* t = new Test(this);
    a.exec();
    t->Run();
    return 1;
}
Все равно не завершается само.

Что я делаю не так?


>Что я делаю не так?

выполняешь действия после a.exec(). А нужно до, потому что a.exec() как раз таки представляет собой бесконечный цикл обработки событий.
Сигналы и слоты и без него работают.

nu11 ★★★★★
()

Все. Идем читаем

exec - это запустить бесконечный цикл обработки событий (qevent)

значит, чтоб из него выйти, его надо как-то прервать

учим С++ нормально, потом читаем о Qt

namezys ★★★★
()

>Что я делаю не так? Пытаешься программировать, не изучив документацию.

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

ДА. что-то я сразу не сообразил прочитать в ассистенте про QCoreApplication...

Enters the main event loop and waits until exit() is called. Returns the value that was set to exit() (which is 0 if exit() is called via quit()).

It is necessary to call this function to start event handling. The main event loop receives events from the window system and dispatches these to the application widgets.

To make your application perform idle processing (i.e. executing a special function whenever there are no pending events), use a QTimer with 0 timeout. More advanced idle processing schemes can be achieved using processEvents().
Получается, этот цикл мне нужен только если я хочу получать в своей программе какие-то внешние сигналы, как-то на них реагировать и затем посылать quit() когда закончу?

Сигналы и слоты и без него работают.

Отлично. получается моя проблема вообще надумана..

Спасибо за ответы

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