如何重启我自己的qt应用程序?

时间:2011-02-26 21:13:21

标签: c++ qt qt4 application-restart

我只是问自己如何重启我自己的qt应用程序?

有人能告诉我一个例子吗?

9 个答案:

答案 0 :(得分:43)

要重新启动应用程序,请尝试:

#include <QApplication>
#include <QProcess>

...

// restart:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());

答案 1 :(得分:4)

我正在采取其他解决方案,但更好。不需要指针,但在;构造的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;
}

答案 2 :(得分:2)

假设 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);

答案 3 :(得分:1)

查看qtcentre.org上的How to restart an application主题,其中 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;
}

答案 4 :(得分:1)

在没有子类化的情况下进行实际的流程重启:

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);

代码中的某处。

答案 5 :(得分:1)

要重新启动正在运行的 Qt 应用程序(至少在 Qt 5.15.2 中),您可以执行以下操作:

#include <QApplication>
#include <QProcess>

//...

QString program = qApp->arguments()[0];
QStringList arguments = qApp->arguments().mid(1); // remove the 1st argument - the program name
qApp->quit();
QProcess::startDetached(program, arguments);

答案 6 :(得分:0)

我刚刚使用了上述方法,我注意到我的应用程序在重启时崩溃了。 ...然后我切换了以下几行代码:

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

为:

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

它表现良好。由于某种原因,必须首先删除窗口。 只是未来读者的一个注释。


编辑: ...对于那些想要真正重新启动流程的人来说,这是一种不同的方法:您可以在QApplication的子类中声明myApp :: Restart()方法。以下版本在MS-Windows和&amp; 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
}

答案 7 :(得分:0)

Rubenvb的想法的这种微小变化适用于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

答案 8 :(得分:0)

你可以使用我的开源库:

https://marketplace.qt.io/products/main-loop-wdt-for-qt-qml

这是主qt循环的看门狗定时器,但我有强制重启的功能,有不同的策略:startdetached + exit,Linux / macOS上的exec系统调用,延迟重启(例如,退出并在3后重启秒)