QT实现应用程序重启

简介:

示例程序


这里写图片描述

代码上传至https://github.com/gatieme/AderXCoding/tree/master/qt/restart

问题描述


有时候写的程序在运行中有时候出现问题,期望能够通过重启来解决,但是在我们的Qt中并没有内置实现这样功能的接口,这就不得不需要自己实现。

重启,无非就是关闭当前应用程序,然后再启动一个新的进程执行当前应用程序

实现重启的方法


目前常用的有两种方式实现重启

方法 描述
进程控制 退出当前进程,再通过QProcess启动一个新的进程
事件循环 退出应用程序,然后通过Application事件循环控制程序启动

使用进程控制实现重启


首先来看qt程序如何退出

Qt程序退出

Qt程序的一般结构如下:

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Widget w;
    w.show()
    return app.exec();
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

最后一句启动了主线程的事件循环。而要退出程序,就是要退出这个事件循环,使main函数返回。

因此退出应用程序就需要退出应用程序QApplication

exit && quit

退出的方法简单来说有两种,我们分别来说
一般来说,正确的退出方式如下

QCoreApplication::exit(int);

 
 
  • 1
  • 1

还有另外一个马甲

QCoreApplication::quit(); <==> exit(0);

 
 
  • 1
  • 1

我们可以很容易在官方的帮助文档中,找到quit和exit之间的区别和联系

这里写图片描述

closeAllWindows

对于QApplication来说,它有一个常用的属性quitOnLastWindowClosed 默认是true,所以,当最后一个窗口关闭时,它可以自动调用前面的exit()

这里写图片描述

因此关闭程序我们只需要关闭所有程序,并且保证quitOnLastWindowClosed = true即可.

因此我们还可以使用

QApplication::closeAllWindows()

 
 
  • 1
  • 1

注:一般来说,对于多个窗口的程序,调用这个会比直接调用quit要好。因为这样窗口可以接受到Close事件。

重新启动一个进程


在Qt中, 可以使用QProcess::startDetached开启一个新的进程
要启动当前程序的另一个进程,有要使二者没有”父子”关系就可以使用QProcess

QProcess类的作用是启动一个外部的程序并与之交互。

QProcess::startDetached(qApp->applicationFilePath(), QStringList());

 
 
  • 1
  • 1

可是,为什么不写成下面这样?

QProcess::startDetached(qApp->applicationFilePath());

 
 
  • 1
  • 1

当然,如果路径中不包含空格,这个也可以工作。

通过进程控制实现重启


///  使用进程控制实现重启
/// 执行如下操作
/// ①  退出当前程序  (QT下有6种方式实现)
/// ②  开启新的进程启动当前程序  (使用QProcess::startDetached)
///
/// ①  种方式实现退出
///
//  方式一: QCoreApplication::exit(0);0是状态还可以是其他的值。
//         QCoreApplication::quit();
//         QApplication::exit(0);
//         QApplication是继承QCoreApplication的。
//         QApplication::quit();
//  方式二: close();QApplicatio有个常用属性qApp->quitOnLastWindowClosed(true);当最后一个窗口关闭时自动调用前面的exit()。
//         QApplication::closeAllWindows();关闭多个窗口,比调用quit好,因为窗口可以接受到close事件。
///
/// ②  开启新的进程启动当前程序
///
//  在Qt中, 可以使用QProcess::startDetached开启一个新的进程
//  要启动当前程序的另一个进程,有要使二者没有"父子"关系
//  使用QProcess::startDetached(qApp->applicationFilePath(), QStringList());
//  其中QStringList()为参数列表
//  特别的, 如果程序的路径中没有空格也可以使用QProcess::startDetached(qApp->applicationFilePath());
void RestartWidget::slotProceeRestart()
{
    qApp->closeAllWindows();
    //qApp->quit();

    //  如果是在嵌入式arm板子上,需要加入 -qws 的参数
    //QStringList args;
    //args.append("-qws");        //  参数信息
    //args.append("&");           //  后台运行
    QProcess::startDetached(qApp->applicationFilePath(), QStringList());
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

使用事件循环


自己观察前面的qt主函数,我们看到最后一行a.exec();

exec

这个函数使qt的gui进入了事件循环,并且返回了程序exit的值,
因此我们可以在这个地方做些手脚。

最简单的办法,就是创建一个循环,当函数正常退出时,不做处理,而程序期望程序时,返回一个我们可以识别的EXIT_CODE,并且不真正退出,而是重新启动一个新的窗体进入事件循环
尽管没什么好处,但有时候,我似乎更喜欢这样写:

///  使用事件循环进行重启
void RestartWidget::soltExitRestart()
{
    //  773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t'
    //  ==>restart
    //#define EXIT_RESTART  773
    qApp->exit(773);

}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后main函数改成

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    int ret = -1;
    do
    {
        RestartWidget w;
        w.show();

        ret = a.exec();

    }while(ret != 0);

    return ret;
}


转载:http://blog.csdn.net/gatieme/article/details/50374563

目录
相关文章
|
6月前
|
安全 网络协议 数据安全/隐私保护
掌握Qt和C++:构建你的第一个P2P应用程序
掌握Qt和C++:构建你的第一个P2P应用程序
244 3
|
6月前
|
Web App开发 存储 Linux
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
Linux(33)Rockchip RK3568 Ubuntu22.04上通过SSH运行Qt程序和关闭Chrome的密钥提示
432 0
|
6月前
|
C语言 Windows
Qt 应用程序打包成安装文件
Qt 应用程序打包成安装文件
104 0
|
6月前
【QT】读写.ini配置文件的程序实现
【QT】读写.ini配置文件的程序实现
106 0
|
4月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
443 3
|
2月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
6月前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
4月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
|
4月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
151 6
下一篇
无影云桌面