实现方法有多种ex:dbus消息、gsetting、qtsingleappliciation等方法。时间限制只做比较简便的方法——qtsingleapplicaiton方式实现。

    qtsingleappliciaiton git repo,clone下来。

    1. 实例化一个qtsingleappliciation程序(qtsingleappliciation继承自QAppliciation)

      1. #include qtsingleappliciation"
      2. QtSingleAppliciation a;
    2. 实现单例:使用该类自带的 isRunning 方法。非running状态再实例化窗口,在running就退出。

      1. if(a.isRunning()){
      2. qDebug()<<"Already running!";
      3. return EXIT_SUCCESS;
      4. }else {
      5. MainWindow w;
      6. w.show();
      7. return a.exec();
      8. }
    3. 将已经实例化的窗口传入自带的setActiveWindow中做初始化(可能需要在qtsingleappliciation中修改一下传入窗口的类型。原代码中的传入参数类型是QWidget。)

      用户感知中的拉起可拆分为三步

      • 窗口重新获得焦点
      • 恢复被最小化的窗口
      • 将拉起的窗口置于各种窗口的最顶层
    4. 做一次消息的联结,当重复运行这个单例的时候就触发这个消息。这个消息会触发两个槽,一个是setActiveWindow中联结的槽函数,一个是自己定义的槽函数。

      1. if(a.isRunning()){
      2. a.sendMessage(QApplication::arguments().length() > 1 ? QApplication::arguments().at(0):a.applicationFilePath());
      3. qDebug()<<"#### kylin-usb-creator is already running";
      4. return EXIT_SUCCESS;
      5. }else {
      6. MainWindow w;
      7. a.setActiveWindow(&w);
      8. w.show();
      9. QObject::connect(&a,SIGNAL(messageReceived(const QString&)),&w,SLOT(handleIconClickedSub()));
      10. return a.exec();
      11. }