实现方法有多种ex:dbus消息、gsetting、qtsingleappliciation等方法。时间限制只做比较简便的方法——qtsingleapplicaiton方式实现。
qtsingleappliciaiton git repo,clone下来。
实例化一个qtsingleappliciation程序(qtsingleappliciation继承自QAppliciation)
#include “qtsingleappliciation"QtSingleAppliciation a;
实现单例:使用该类自带的
isRunning方法。非running状态再实例化窗口,在running就退出。if(a.isRunning()){qDebug()<<"Already running!";return EXIT_SUCCESS;}else {MainWindow w;w.show();return a.exec();}
将已经实例化的窗口传入自带的setActiveWindow中做初始化(可能需要在qtsingleappliciation中修改一下传入窗口的类型。原代码中的传入参数类型是QWidget。)
用户感知中的拉起可拆分为三步
- 窗口重新获得焦点
- 恢复被最小化的窗口
- 将拉起的窗口置于各种窗口的最顶层
做一次消息的联结,当重复运行这个单例的时候就触发这个消息。这个消息会触发两个槽,一个是setActiveWindow中联结的槽函数,一个是自己定义的槽函数。
if(a.isRunning()){a.sendMessage(QApplication::arguments().length() > 1 ? QApplication::arguments().at(0):a.applicationFilePath());qDebug()<<"#### kylin-usb-creator is already running";return EXIT_SUCCESS;}else {MainWindow w;a.setActiveWindow(&w);w.show();QObject::connect(&a,SIGNAL(messageReceived(const QString&)),&w,SLOT(handleIconClickedSub()));return a.exec();}
