如何重新启动我自己的qt应用程序?
看看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;
}
1.你不应该在'delete'之前检查'NULL',2.你可以在循环中声明'QPointer's,那么你根本不需要删除它们(作为智能指针和全部), 3.你根本不需要指针,4.你有一个语法错误(检查我的答案)。 – rubenvb 2011-06-15 10:25:08
当我声明main_window = new MainWindow时,此代码给出“退出代码-1073741819”错误;当声明main_window = new MainWindow(app)时,它会发出声明错误。 – abhishek 2012-04-23 19:10:22
这是我引用的原始答案。看看'MainWindow'类的参数类型是什么,并记住'app'变量的类型是'QPointer
我只是用上述方法,我注意到,在重新启动我的应用程序崩溃。 ...然后我切换下面的代码行:
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
}
删除nullptr;很好,不需要检查 – paulm 2013-03-12 21:07:51
谢谢@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;
}
要重新启动应用程序,请尝试:
#include <QApplication>
#include <QProcess>
...
// restart:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
像魅力一样工作,谢谢! – 2016-04-06 09:08:08
除了冗余的第一个参数外,这很好用,所以我编辑了答案以从参数列表中删除程序名称。谢谢! – 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
尽管上述更改有效,但重新启动的应用程序有时会崩溃,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);
在你的代码。
“重启”是什么意思? – 2011-02-26 21:16:15
相关:[QT4:如何重新启动应用程序?重置设置?](http://*.com/questions/5127600/) – 2011-02-27 11:50:26
@JeremiahWillcock在这种情况下可以解释“重启”的方式有多少? – 2014-07-29 22:15:58