Как перезапустить мое собственное приложение QT? - PullRequest
23 голосов
/ 27 февраля 2011

Я просто спрашиваю себя, как перезапустить свое собственное приложение qt?

Может кто-нибудь показать мне пример?

Ответы [ 8 ]

44 голосов
/ 31 октября 2011

Чтобы перезапустить приложение, попробуйте:

#include <QApplication>
#include <QProcess>

...

// restart:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
5 голосов
/ 15 июня 2011

Я беру другие ответы на решения, но лучше. Указатели не нужны, но есть необходимость в ; после оператора while конструкции do { ... } while( ... );.

int main(int argc, char *argv[])
{
    const int RESTART_CODE = 1000;

    do
    {
        QApplication app(argc, argv);
        MainWindow main_window(app);
    } while( app.exec() == RESTART_CODE);

    return return_from_event_loop_code;
}
3 голосов
/ 30 апреля 2014

При условии, что 1337 - ваш код перезапуска:

main.cxx

int main(int argc, char * argv[])
{  
  int result = 0;

  do
  {
     QCoreApplication coreapp(argc, argv);
     MyClass myObj;
     result = coreapp.exec();
  } while( result == 1337 );

  return result;
}

myClass.cxx

qApp->exit(1337);
1 голос
/ 10 ноября 2015

Реальный перезапуск процесса без создания подклассов:

QCoreApplication a(argc, argv);
int returncode = a.exec();
if (returncode == -1)
{
  QProcess* proc = new QProcess();
  proc->start(QCoreApplication::applicationFilePath());
}
return returncode;

Редактирование для Mac OS, как в предыдущем примере.

Для перезапуска вызова

QCoreApplication::exit(-1);

где-то в вашем коде.

1 голос
/ 27 февраля 2011

Посмотрите на Как перезапустить приложение поток на qtcentre.org, где muisei дает этот код

#define RESTART_CODE 1000
int main(int argc, char *argv[])
{
  int return_from_event_loop_code;
  QPointer<QApplication> app;
  QPointer<MainWindow> main_window;
  do
  {
    if(app) delete app;
    if(main_window) delete main_window;

    app = new QApplication(argc, argv);
    main_window = new MainWindow(app);
    return_from_event_loop_code = app->exec();
  }
  while(return_from_event_loop_code==RESTART_CODE)

  return return_from_event_loop_code;
}
0 голосов
/ 14 августа 2015

Вот код:

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;

}

mainwindow.h

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        static int const EXIT_CODE_REBOOT;//THIS IS THE IMPORTANT THING TO ADD TO YOUR CODE
        ~MainWindow();
    private slots:
        void slotReboot();//AND THIS ALSO

    //ALL THE OTHER VARIABLES
    }

slotReboot() - это слот для приема сигнала QAction, который я собираюсь показать в mainwindow.cpp

mainwindow.cpp

Сначала инициализируйте EXIT_CODE_REBOOT:

int const MainWindow::EXIT_CODE_REBOOT = -123456789;

и объявите указатель QAction:

QAction* actionReboot;

, затем в конструкторе MainWindow:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

     actionReboot = new QAction( this );
     actionReboot->setText( tr("Restart") );
     actionReboot->setStatusTip( tr("Restarts the application") );
     connect( actionReboot, SIGNAL (triggered()),this, SLOT (slotReboot()));
}

Инаконец, вам нужно отправить сигнал (в той части кода, которая вам нужна) следующим образом:

actionReboot->trigger();

Я сделал код, который показал, следуя этим инструкциям: Как сделать приложение перезагружаемым- Qt Wiki

0 голосов
/ 13 марта 2013

Эта небольшая вариация идеи Рубенва работает с PyQt. clearSettings - метод, запускающий перезапуск.

class GuiMain

    #Most of implementation missing

    def clearSettings(self):
        #Clearing the settings missing
        QApplication.exit(GuiMain.restart_code)

    restart_code = 1000

    @staticmethod
    def application_main():
        """
        The application's main function. 
        Create application and main window and run them.
        """
        while True:
            app = QApplication(sys.argv)
            window = GuiMain()
            window.show()
            ret = app.exec_()
            if ret != GuiMain.restart_code:
                break
            del window
            del app
0 голосов
/ 15 июня 2011

Я просто использовал метод, описанный выше, и заметил, что мое приложение вылетает при перезапуске.... затем я переключил следующие строки кода:

if(app) delete app;
if(main_window) delete main_window;

на:

if(main_window) delete main_window;
if(app) delete app;

, и он ведет себя нормально.По какой-то причине окно должно быть удалено первым.Просто примечание для будущих читателей.


EDIT: ... и другой подход для тех, кто хочет реальный перезапуск процесса: Вы можете объявить myApp :: Restart () метод в вашем подклассе QApplication.Следующая версия работает нормально для MS-Windows и MacOS:

// Restart Application
void myApp::Restart(bool Abort)
{
    // Spawn a new instance of myApplication:
    QProcess proc;
#ifdef Q_OS_WIN
    proc.start(this->applicationFilePath());
#endif    

#ifdef Q_OS_MAC
    // In Mac OS the full path of aplication binary is:
    //    <base-path>/myApp.app/Contents/MacOS/myApp
    QStringList args;
    args << (this->applicationDirPath() + "/../../../myApp.app");
    proc.start("open", args);
#endif

    // Terminate current instance:
    if (Abort) // Abort Application process (exit immediattely)
        ::exit(0);
    else
        this->exit(0); // Exit gracefully by terminating the myApp instance
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...