注:环境为Linux
利用QT的API实现单例模式非常简单,只需要使用QT提供的QtSingleApplication,然后设置唯一ID,并发送信号即可:
main.cpp:
#include "mainwindow.h"
#include <QApplication>
#include <QtSingleApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QString id = QString("singleapp");
QtSingleApplication a(id, argc, argv);
if (a.isRunning()) {
int agr_length = QApplication::arguments().length();
a.sendMessage(QApplication::arguments().length() > 1 ? QApplication::arguments().at(agr_length-1) : a.applicationFilePath());
qDebug() << QObject::tr("singleapp is already running!");
return EXIT_SUCCESS;
} else {
MainWindow w;
w.show();
QObject::connect(&a, SIGNAL(messageReceived(const QString&)), &w, SLOT(sltMessageReceived(const QString&)));
return a.exec();
}
}
保持激活置顶:
void MainWindow::sltMessageReceived(const QString &msg) {
Q_UNUSED(msg);
KWindowSystem::forceActiveWindow(this->winId());
this->show();
}
这里尝试了不同的方法去激活窗口,发现使用KWindowSystem比较靠谱,其它的总是会出现无法激活的情况
需要添加这个库:
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets KWindowSystem
include(./qtsingleapplication/qtsingleapplication.pri)
QtSingleApplication以及工程完整地址: