实现方法有多种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();
}