2011-02-26 184 views
2

1.)我想重新启动我的QT4应用程序。只是正常关机并启动相同的应用程序。QT4:如何重新启动应用程序?重新设置?

2)为什么?那么我需要一个选项来“重置”一切。重新启动应用程序似乎是最简单的方法。问题是,有很多类和一切。我没有时间把他们的每一个设置恢复到标准,每个文本框,小工具清除...我知道应用程序重新启动不是最好的方式,你认为有什么其他方式?

谢谢

回答

1

你可以删除类和相同的QApplication

2

1)你可以运行一个脚本下的main()创建新的,日程操作系统后,开始您的应用程序。

2)写一个单独的类,它包含所有的应用程序设置。根据需要重置。

2

滑稽请求。只是预留“重新启动”退出代码,做类似的信息(未经测试):

int main(int argc, char **argv) 
{ 
QApplication app(argc, argv); 
... 
int ret = app.exec(); 
if (ret == EXIT_RESTART) { 
    ::execve(...); 
} 
return ret; 
} 

然后,你可以调用的QApplication ::出口(EXIT_RESTART)的任何地方,你应该是好去。或者使用包装脚本来做同样的事情。 (在你处理命令行参数令人满意,如果你的应用程序需要的任何两种情况下确保。)

一个清洁的方法是将所有需要被重置为同一信号的东西连接。

+0

您也可以在这里使用“try-catch”而不是返回码。当你认为是时候重新启动时,抛出一个已知的异常。它有一个好处,即使在碰撞条件下也可以重新启动。 – j4x 2011-03-04 13:18:57

+0

在一般情况下,Qt与例外不兼容。一些用法是安全的,但据我所知,并不推荐。请参阅[Qt例外安全](http://doc.qt.nokia.com/4.6/exceptionsafety.html)。 – Mat 2011-03-04 15:03:08

1

理智的事情在这种情况下做的是把创建/初始化窗口小部件,等所有的东西,在一个单一的功能(当然,它可以调用子功能)。当您需要重置所有内容时,只需调用它即可。根据确切的实现,您可能需要先删除/取消初始化。

4

对于重新启动,你可以在quiting这个进程后使用startDetached的应用程序:

#include <QApplication> 
#include <QProcess> 

... 

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

此解决方案不适用于设备,它只适用于仿真器,但不能在诺基亚E7上重新启动 – abhishek 2012-04-21 11:56:13

+1

我真的不知道各种设备,但我在Windows上测试过它,它工作正常 – deepmax 2012-04-25 18:06:59

0

这种方法适用于PyQt的。我编写它用于清除所有设置并使用干净设置重新启动应用程序。 application_main是主要方法,和clearSettings是清除设置的插槽。

class GuiMain 

    #Most of implementation missing 

    def clearSettings(self): 
     """Deletes all settings, and restarts the application""" 
     #TODO: save changes 
     setting_store = QSettings() 
     setting_store.clear() 
     setting_store.sync() 
     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