QT 版本 5.8 MSVC2015 64
首先下载地址:http://code.qt.io/cgit/qt-solutions/qt-solutions.git/
git一下:
那个qtsingleapplication就是了
继续参照 https://www.cnblogs.com/kevinzhwl/archive/2012/08/27/2658839.html
不过,目录改变了,C:\Qt\qt-solutions\qtsingleapplication\src\qtsingleapplication.pri
中间多了一个 src ,在 pro 文件中,增加这个目录。
include(C:\Qt\qt-solutions\qtsingleapplication\src\qtsingleapplication.pri)
每次打开pro会出现一个 config.pri 文件找不到的提示,好像没影响,继续。同时,右侧多了一个qtsingleapplication的
在main.cpp测试一下:
int ret=0;
QtSingleApplication singleApp(argc, argv);
if (singleApp.isRunning())
{
singleApp.sendMessage("raise_window_noop");
return EXIT_SUCCESS;
}
MainWindow w;
singleApp.setActivationWindow(&w);
QObject::connect(&singleApp,&QtSingleApplication::messageReceived,&singleApp,&QtSingleApplication::activateWindow);
w.show();
ret = singleApp.exec();
return ret;
不过,更好的方法是使用 bool sendMessage ( const QString & message, int timeout = 5000 )。这个更规范,具体自己看了。
这里面的关系是:
- 首先启动一个实例,假设是app0;注意Main.cpp里面,把MainWindow设为活动窗口。singleApp.setActivationWindow(&w);
- 启动第二个实例app2,此时app2发现已经有实例存在,sendMessage("raise_window_noop"); 后自行退出。这个文字,可作为消息在第一个messageReceived中获取。而新打开的是没有文字的,如果要有提示,则自己用MessageBox提示一下退出即可。
- 实例app0收到信号,messageReceived,调用默认槽函数&QtSingleApplication::activateWindow
- 这个Activating Window就是刚才步骤1 里面设置的setActivationWindow(&w),等于是实例2启动了初始实例。
参考资料:
官方:http://code.qt.io/cgit/qt-solutions/qt-solutions.git/
官方资料:http://doc.qt.io/archives/qtextended4.4/qtopiadesktop/qtsingleapplication.html#sendMessage
中文资料:https://www.cnblogs.com/kevinzhwl/archive/2012/08/27/2658839.html
https://blog.csdn.net/u010445843/article/details/49611455
https://blog.csdn.net/iamsujin/article/details/53257038