一、达到期望结果:
qt应用实现程序单例化执行
我用的环境:
系统:麒麟v10.1
qt版本:5.12.8
二、单例模式前后效果对比:
1)未加单例模式之前,每次点击运行后,都会弹出一个对话框,点击三次后效果如下
图1
2)加单例模式之后,每次点击运行,不会再重复弹窗,保证程序只执行一次
原理:用的QLocalServer/QLocalSocket建立本地socket来判断实例是否存在
三、实现过程
1、新建一个Qt Widgets Application的项目
其余的名称、路径,按自己需要选择即可,然后一直点击【下一步】,就可创建一个简单项目;
此时点击运行,出现的就是使用单例模式前的效果图(图1);
2、添加单例模式所需文件和代码
下载单例模式所需文件,我放在下载资源里了(不需要积分和C币哈),将文件下载好后,解压到项目里;
1)下载资源文件并放入项目中:
下载地址:
https://download.csdn.net/download/qq_41539778/20816781
解压后是一个叫【qt-solutions】的文件夹
将【qt-solutions】文件夹放在项目中,与main.cpp同级
2)在qt中将资源文件导入至项目
右键点击项目名--添加现有文件
在项目路径中找到qt-solutions文件夹--qtsingleaoolication--找到以下四个文件选择打开;
qtlocalpeeer.cpp qtlocalpeer.h qtsingleapplication.cpp qtsingleapplication.h
注意:此处不需要导入全部文件,当然,如果你想全导入,也没有影响哈,就是qt项目里文件太多了;
选择【打开】后,会发现项目中多了两个文件夹
3)修改 .pro代码
在项目.pro文件中加一行 【很重要!!!不加不行】
QT += network
4)修改main.cpp代码
加include
#include "qt-solutions/qtsingleapplication/qtsingleapplication.h"
修改前
int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
修改后
int main(int argc, char *argv[]) { QtSingleApplication a(argc, argv); if (a.isRunning()) { a.sendMessage("raise_window_noop"); return EXIT_SUCCESS; } MainWindow w; w.show(); return a.exec(); }
5)构建运行
将项目重新构建--点击运行
会发现只能运行一次,只能开一个应用
完成!