现在,我有一个应用程序,但我不想打开应用程序两次,因此我在打开两次时使用QShareMemory
来检测应用程序。
我的问题是:当用户打开第二个应用程序时,我如何在屏幕上显示当前应用程序?
int main(int argc, char *argv[]) {
Application a(argc, argv);
/*Make sure only one instance of application can run on host system at a time*/
QSharedMemory sharedMemory;
sharedMemory.setKey ("Application");
if (!sharedMemory.create(1))
{
qDebug() << "123123Exit already a process running";
return 0;
}
/**/
return a.exec();
}
感谢。
答案 0 :(得分:4)
这是纯Qt方式的另一种方法:
使用QLocalServer
和QLocalSocket
检查应用程序是否存在,然后使用信号槽机制通知现有应用程序。
#include "widget.h"
#include <QApplication>
#include <QObject>
#include <QLocalSocket>
#include <QLocalServer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const QString appKey = "applicationKey";
QLocalSocket *socket = new QLocalSocket();
socket->connectToServer(appKey);
if (socket->isOpen()) {
socket->close();
socket->deleteLater();
return 0;
}
socket->deleteLater();
Widget w;
QLocalServer server;
QObject::connect(&server,
&QLocalServer::newConnection,
[&w] () {
/*Set the window on the top level.*/
w.setWindowFlags(w.windowFlags() |
Qt::WindowStaysOnTopHint);
w.showNormal();
w.setWindowFlags(w.windowFlags() &
~Qt::WindowStaysOnTopHint
);
w.showNormal();
w.activateWindow();
});
server.listen(appKey);
w.show();
return a.exec();
}
但如果您在Windows上使用Qt 5.3,则QWidget::setWindowFlags
和Qt::WindowStaysOnTopHint
存在错误,请参阅https://bugreports.qt.io/browse/QTBUG-30359。
答案 1 :(得分:0)
只需使用QSingleApplication
类而不是QApplication
:
http://doc.qt.digia.com/solutions/4/qtsingleapplication/qtsingleapplication.html
int main(int argc, char **argv)
{
QtSingleApplication app(argc, argv);
if (app.isRunning())
return 0;
MyMainWidget mmw;
app.setActivationWindow(&mmw);
mmw.show();
return app.exec();
}
它是Qt Solutions的一部分:https://github.com/qtproject/qt-solutions