导航:首页 > 编程语言 > 使qt程序只运行一个实例

使qt程序只运行一个实例

发布时间:2024-07-10 18:14:18

⑴ 如何让Qt应用程序只有一个实例

这就要用到Qt的QLocalSocket,QLocalServer类了,这两个类从接口上看和网络通信socket没有区别,但是它并不是真正的网络API,只是模仿了而已。这两个类在Unix/Linux系统上采用Unix域socket实现,而在Windows上则采用有名管道(named pipe)来实现。
既然是网络API,那么思路就很简单了,应用程序启动时首先会去连一个服务器(这里通过应用程序的名字来标识,就像网络端口一样),如果连接失败,那么则自己是第一个实例,就创建这么一个服务器,否则将启动参数发送到服务器,然后自动退出,而服务器会在收到通知以后进行处理。
这些动作我想最好是放在创建Application实例后,因为Qt本身有很多操作没有Application实例是无法进行操作的(至少事件循环是在创立Application以后才能启动吧),因此最好的位置就是通过继承QApplicaiton或者QCoreApplication自定义一个YourOwnApplication,然后在构造函数中进行,下面是一个示意。
首先是YourOwnApplication构造函数:

QString serverName = QCoreApplication::applicationName();
QLocalSocket socket;
socket.connectToServer(serverName);
if (socket.waitForConnected(500)) { //如果能够连接得上的话,将参数发送到服务器,然后退出
QTextStream stream(&socket);
QStringList args = QCoreApplication::arguments();
if (args.count() > 1)
stream << args.last();
else
stream << QString();
stream.flush();
socket.waitForBytesWritten();
qApp->quit();
return;
}
//运行到这里,说明没有实例在运行,那么创建服务器。
m_localServer = new QLocalServer(this);
connect(m_localServer, SIGNAL(newConnection()),
this, SLOT(newLocalSocketConnection())); //监听新到来的连接
if (!m_localServer->listen(serverName)) {
if (m_localServer->serverError() == QAbstractSocket::AddressInUseError
&& QFile::exists(m_localServer->serverName())) { //确保能够监听成功
QFile::remove(m_localServer->serverName());
m_localServer->listen(serverName);
}
}

这样就保证了新启动的程序在检测到有其他实例在运行时就会自动退出,但是它发出的请求还没有被处理,下面看一下处理函数,也就是前段代码中的newLocalSocketConnection()。
QLocalSocket *socket = m_localServer->nextPendingConnection();
if (!socket)
return;
socket->waitForReadyRead(1000);
QTextStream stream(socket);
… … //其他处理
delete socket;
mainWindow()->raise();
mainWindow()->activateWindow(); //记得激活窗口哦

⑵ 卸载或更改程序里的Qt,好几个一样的能否卸载只保留一个

可以,完全可以只保留一个。
一般应保留最新的一个。

阅读全文

与使qt程序只运行一个实例相关的资料

热点内容
您保存的文件格式可能包含有不兼容的功能 浏览:155
pos机的各种数据储存在哪里 浏览:430
win10文件怎么还原未知 浏览:342
vtk文件 浏览:166
timelineoptionjs下载 浏览:81
苹果手机怎么设置网络优先 浏览:877
线性数据如何计算 浏览:349
大数据服务体系建设 浏览:87
jsp页面报不了错 浏览:13
制作微课用什么app 浏览:24
如何让qq分组显示自己 浏览:815
sql大数据查询优化 浏览:548
哪里有文件销毁费用是多少 浏览:929
云视讯app如何在群里反馈举手 浏览:424
cpu数据如何看 浏览:426
abaqus安装最后文件路径出错 浏览:295
js传递函数参数 浏览:630
ios百度云压缩文件解压 浏览:253
把电脑的文件传到苹果6上 浏览:116
青少年编程考试证书哪个更权威 浏览:241

友情链接