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


Автор: daemonaz 2.11.2012, 14:18
Вот такой вопрос, как перезапустить приложение по команде exit(int)?
Иначе говоря, по умолчанию QtCreator генерирует при создании приложении MainWindow
такой код в main.cpp

Код


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

       MainWindow w;
       w.show();
       result = app.exec();

      return result;


При вызове quit я так понимаю вызывается exit(0), таким образом app.exec выдает 0, однако мне бы хотелось зациклить эти строчки до сих пор пока не появится result = 1, я в mainwindow говорю об этом с помошью exit(1), однако при выходе ничего не происходит.

Автор: loneybibi 3.11.2012, 00:32
Как я понял надо что бы программа сама себя перезапускала.
Не знаю зачем такое надо,  я пробовал у меня получилось только вот что то вроде этого:
Код

#include <QApplication>
#include "mainwindow.h"

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

Этот код будет перезапускать программу до тех пор пока не будет вызван метод exit();

А вообще лучше перезапуск приложения сделать по другому. 
Перегрузить событие QCloseEvent у окна и на него повесить:
Код

QProcess::startDetached("app_name");

После чего программа при закрытии окна или вызове метода close() закроет текущую копию и запустит новую.

Автор: borisbn 3.11.2012, 08:49
loneybibi, первый вариант не рабочий
ISO C++ forbids taking address of function '::main'
Он будет работать только на студии.
А второй совершенно нормальный.

Автор: loneybibi 3.11.2012, 15:24
Цитата(borisbn @ 3.11.2012,  07:49)
loneybibi, первый вариант не рабочий
ISO C++ forbids taking address of function '::main'
Он будет работать только на студии.
А второй совершенно нормальный.

Не знаю у меня работает под mingw и g++  на ура smile 

Автор: borisbn 3.11.2012, 17:07
Цитата(loneybibi @  3.11.2012,  15:24 Найти цитируемый пост)
 у меня работает под mingw и g++  на ура

не должно. в стандарте сказано, что не должно.
http://liveworkspace.org/code/246000e0c6583543a9b2b96358116c65

Автор: loneybibi 3.11.2012, 17:26
Цитата(borisbn @ 3.11.2012,  16:07)
Цитата(loneybibi @  3.11.2012,  15:24 Найти цитируемый пост)
 у меня работает под mingw и g++  на ура

не должно. в стандарте сказано, что не должно.
http://liveworkspace.org/code/246000e0c6583543a9b2b96358116c65

Я понимаю что это вообще "велосепед" и работать может и не должен smile Но факт что у меня на Qt 4.8.1 и под windows х32 (mingw) и под Ubuntu x64 (g++\gcc-4.4.3) работает!
Еще я же указал что лучше использовать второй вариант ! smile 

Автор: daemonaz 14.11.2012, 15:49
Повесил startDetached на closeEvent, не сработало почему-то, что не так делаю?

Код


void MainWindow::closeEvent(QCloseEvent *)
{
 
    QProcess::startDetached(qApp->applicationName());
}


Автор: borisbn 14.11.2012, 16:49
Цитата(daemonaz @  14.11.2012,  15:49 Найти цитируемый пост)
что не так делаю?

applicationName - обычная строка, которая будет пустая, если ты её явно не установил (setApplicationName)
тебе нужен applicationFilePath

Автор: Snake174 15.11.2012, 13:56
В MainWindow.h объяви:
Код

static int const EXIT_CODE_REBOOT;

В MainWindow.cpp:
Код

int const MainWindow::EXIT_CODE_REBOOT = -123456789;

При закрытии приложения:
Код

qApp->exit( MainWindow::EXIT_CODE_REBOOT );

В main.cpp:
Код

int main( int argc, char *argv[] )
{
  int currentExitCode = 0;
 
  do
  {
    QApplication a( argc, argv );
    MainWindow w;
    w.show();
    currentExitCode = a.exec();
  }
  while (currentExitCode == MainWindow::EXIT_CODE_REBOOT);
 
  return currentExitCode;
}

Автор: daemonaz 15.11.2012, 14:38
Snake174, спасибо!

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