如何在qt中重启应用程序?

问题描述 投票:5回答:3

我这样做是为了重新启动我的游戏,但程序有错误。我想在用户丢失时显示QDialog。在这个QDilag我把两个pushbutton重试并退出。我还有一个QDialog开始游戏。我的错误是什么? (我读了类似的问题并按照这些做但但我有问题)

extern  int const EXIT_CODE_REBOOT;
mydialog_end::mydialog_end(QWidget *parent) :
QDialog(parent
{
  retry=new QPushButton(this);
  exit=new QPushButton(this);
  retry->setText("RETRY");
  exit->setText("EXIT");
  connect(retry,SIGNAL(clicked()),this,SLOT(on_retry_clicked()));
  connect(exit,SIGNAL(clicked()),this,SLOT(on_exit_clicked()));
 }
 void mydialog_end::on_retry_clicked()
 {
   qApp->exit(EXIT_CODE_REBOOT);
   accept();
  }
  void mydialog_end::on_exit_clicked()
  {
    //what do i do for end of game?
    reject();
  }
  //////////////in class myenemy///////
  public slots:
  void loss();
  void Myenemy1::loss()
  {
    if(this->collidesWithItem(_mario))
    {
      //do something....
      mydialog_end dialog;
      dialog.exec();
     }
    }
    //////////////in main////////////
 extern int const RESTART_CODE;
 int main(int argc, char *argv[])
{
  Mydialogstart dlg;//a dialog for beginning game
  int state= dlg.exec();
  int return_from_event_loop_code=0;
 do
{
    QApplication a(argc, argv);
    MainWindow w;
    if( state==QDialog::Accepted)
    {
        w.show();
        qDebug()<<"accepted";
    }
    else if(state==QDialog::Rejected)
    {
        qDebug()<<"rejected";
        dlg.close();
        return 0;
    }
    return_from_event_loop_code = a.exec();

} while(return_from_event_loop_code==RESTART_CODE);

  return return_from_event_loop_code;
}
c++ qt restart qdialog
3个回答
3
投票

您可以使用QProcess::startDetached在新进程中运行应用程序的实例并从中分离。之后你应该退出申请:

QProcess process;
process.startDetached("myApp",QStringList());

qApp->quit();

这里myApp是应用程序的可执行文件的名称。在Windows上它可以是myApp.exe


2
投票

在这一个,我会做一点开始...让我们说你的主要应用程序被称为A然后你应该在全球A应用程序中运行B。当A崩溃时,B投掷了QDialog。如果使用点击Retry然后杀死旧的A实例并开始一个新的实例。


1
投票

有一个Qt Wiki entry解释了你需要做的很多细节。

因为看起来你至少部分地从那里获得了灵感,但是从你在这里发布的内容来看,你似乎从来没有在你的代码示例中初始化EXIT_CODE_REBOOT和RESTART_CODE的值,或者至少将它们彼此链接(我期望它们)你想以某种方式做)

© www.soinside.com 2019 - 2024. All rights reserved.