首页| 论坛| 消息
主题:Qt单实例运行
spygg发表于 2019-06-25 23:46
在用Qt写程序时候可能遇到避免程序重复启动(再次启动时直接把已有界面的拉倒前台),我们知道用MFC时有个FindWindow函数可以进行窗口查找于是想Qt能否实现呢,经过一番摸索和折腾终于搞定(测试环境为Win7和Ubuntu)

详情见我的博客

代码主要是Qt学习一二三中的一篇,膜拜之.......

#ifndef SINGLEAPPLICATION_H
#define SINGLEAPPLICATION_H
#include
#include
class QLocalServer;
class QWidget;
class SingleApplication : public QApplication
{
Q_OBJECT
public:
SingleApplication(int &argc, char **argv);
~SingleApplication();
public:
bool isRunning();
//保存主窗口指针
void setSingleMainWindow(QWidget* w);
private slots:
void newLocalConnection();
private:
bool m_bRunning;
QLocalServer *m_pServer;
QWidget *m_widget;
};
#endif // SINGLEAPPLICATION_H#include "singleapplication.h"
#include
#include
#include
#include
#include
#include
static const char *ApplicationName = "myApp";
SingleApplication::SingleApplication(int &argc, char **argv):
QApplication(argc, argv),
m_mousePoint(0, 0),
m_mousePressed(false),
m_bRunning(false),
m_pServer(Q_NULLPTR),
m_widget(Q_NULLPTR)
{
setOrganizationName(QStringLiteral("MyProject"));
setApplicationName(QLatin1String(ApplicationName));
#if !defined(Q_OS_OSX)
setWindowIcon(QIcon(QStringLiteral(":/image/calcapp.png")));
#endif
QString strServerName = QString("%1%2")
.arg(QCoreApplication::organizationName())
.arg(QCoreApplication::applicationName());
QLocalSocket socket;
socket.connectToServer(strServerName);
if (socket.waitForConnected(500)){
QTextStream stream(&socket);
QStringList args = QCoreApplication::arguments();
QString strArg = (args.count() > 1) ? args.last() : "";
stream serverError() == QAbstractSocket::AddressInUseError)
&& QFile::exists(m_pServer->serverName())){
QFile::remove(m_pServer->serverName());
m_pServer->listen(strServerName);
}
}
}
}
SingleApplication::~SingleApplication()
{
}
bool SingleApplication::isRunning()
{
return m_bRunning;
}

void SingleApplication::setSingleMainWindow(QWidget *w)
{
m_widget = w;
}

void SingleApplication::newLocalConnection()
{
QLocalSocket *pSocket = m_pServer->nextPendingConnection();
if (pSocket != Q_NULLPTR){
pSocket->waitForReadyRead(1000);
QTextStream in(pSocket);
QString strValue;
in >> strValue;
delete pSocket;
pSocket = Q_NULLPTR;
//如果窗口不为空,则前端显示
//核心代码
if(m_widget){
m_widget->showMaximized();
m_widget->activateWindow();
m_widget->raise();
}
}
}
使用
#include "singleapplication.h"
#include
int main(int argc, char *argv[])
{
SingleApplication a(argc, argv);
if (a.isRunning()){
return 0;
}
QDialog w;
w.show();
//保存指针用于显示
a.setSingleMainWindow(&w);
return a.exec();
}
下一页 (1/2)
回帖(7):
7楼:赞,给好评!激动窗口是正道。楼主收集的内容很多啊?有没有计划PDF文档分享一下
6楼:kaon:https://stackoverflow.com/questions/5006547/qt-best-practice-for-a-single-instance-ap ..
5楼:https://stackoverflow.com/questions/5006547/qt-best-practice-for-a-single-instance-app-pro ..

全部回帖(7)»
最新回帖
收藏本帖
发新帖