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

问题描述:

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

有人可以给我看一个例子吗?

+1

“重启”是什么意思? – 2011-02-26 21:16:15

+0

相关:[QT4:如何重新启动应用程序?重置设置?](http://*.com/questions/5127600/) – 2011-02-27 11:50:26

+0

@JeremiahWillcock在这种情况下可以解释“重启”的方式有多少? – 2014-07-29 22:15:58

看看How to restart an application线程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

1.你不应该在'delete'之前检查'NULL',2.你可以在循环中声明'QPointer's,那么你根本不需要删除它们(作为智能指针和全部), 3.你根本不需要指针,4.你有一个语法错误(检查我的答案)。 – rubenvb 2011-06-15 10:25:08

+0

当我声明main_window = new MainWindow时,此代码给出“退出代码-1073741819”错误;当声明main_window = new MainWindow(app)时,它会发出声明错误。 – abhishek 2012-04-23 19:10:22

+0

这是我引用的原始答案。看看'MainWindow'类的参数类型是什么,并记住'app'变量的类型是'QPointer '。 – 2012-04-23 19:23:29

我只是用上述方法,我注意到,在重新启动我的应用程序崩溃。 ...然后我切换下面的代码行:

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

到:

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

和它的行为确定。出于某种原因,窗口必须先删除。 只是为未来的读者一个笔记。


编辑: ...和谁想要一个真正的进程重启了不同的方法:你可以在你的QApplication的子类,声明对myApp ::重启()方法。以下版本工程确定在两个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 
} 
+0

删除nullptr;很好,不需要检查 – paulm 2013-03-12 21:07:51

+0

谢谢@oaulm,这是正确的(我只是基于我对上面Piotr Dobrogost发布的原始代码的评论) – 2013-03-13 12:01:11

我拿别人的答案的解决方案,但更好。不需要指针,但需要在do { ... } while(...);构造的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; 
} 
+4

+1,但也许你应该提及应用程序应该调用['QCoreApplication :: exit 1000)'](http://doc.qt.nokia.com/latest/qcoreapplication.html#exit)实际重新启动。 – Job 2011-08-02 09:53:07

+0

这不适用于PyQt。看到这个要点:https://gist.github.com/anonymous/5146031 – Eike 2013-03-12 19:39:10

+0

@Eike显然,代码(和问题)是C++ ... – rubenvb 2013-03-12 19:40:35

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

#include <QApplication> 
#include <QProcess> 

... 

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

像魅力一样工作,谢谢! – 2016-04-06 09:08:08

+0

除了冗余的第一个参数外,这很好用,所以我编辑了答案以从参数列表中删除程序名称。谢谢! – 2016-09-27 00:22:23

上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 

假设是你的重启代码:

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

下面是代码:

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

最后,你需要发送信号(in你的代码,你需要的部分),以这样的方式

actionReboot->trigger(); 

我做我的代码显示以下说明:How to make an application restartable - Qt Wiki

+0

尽管上述更改有效,但重新启动的应用程序有时会崩溃,webkitwidget在重新启动的应用程序中无法正常工作。由@deepmax建议的解决方案适合我。 – 2016-12-23 08:47:10

做一个真正的进程重启没有子:

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

在你的代码。