问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

QT有什么方法管理不同进程窗口ZOrder关系

发布网友 发布时间:2022-05-14 06:41

我来回答

1个回答

热心网友 时间:2023-08-15 11:16

为了使一个应用程序在同一时间只运行一个实例,需要用某种方法在程序启动时,检测是否已有正在运行的实例,如果有,则将本次启动的参数传递给前一个实例(例如需要打开的文档的路径),如果没有,则正常启动。
实现的方法有多种:
1. 用Windows API创建一个互斥量:
#include <windows.h>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

HANDLE hMutex = CreateMutex(NULL, TRUE, L"YourApp"); // 创建一个互斥量来保证只运行一个实例
if(hMutex != NULL)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
QMessageBox::critical(qApp->activeWindow(), QObject::tr("An instance of this application has been run!"), QObject::tr("Only one instance can be run at a time!"));
return 1;
}
}

... // 以下是正常启动代码
}
注:如果保险起见,CreateMutex()中的字符串应该用一个GUID来保证其唯一性,Visual Studio中有一个生成GUID的工具,菜单“工具”->“创建GUID”,选择合适的定义形式,创建并拷贝到剪贴板即可。

此方法的缺点:1.使用了Windows API,不能跨平台;2.不能自动激活前一个实例的窗口。
2. 每次启动时用Windows API枚举进程,同时在第一次运行时用SetProp()函数给当前窗口设置属性,这样下次启动时,在枚举的进程中查找具有这个属性的窗口,若找到,说明已有实例在运行,将该实例的窗口激活;若未找到则正常启动。
此方法客服了前一方法的第2个缺点,但过于依赖Windows API函数(似乎还是MFC函数,对Qt程序好像不可行)。有兴趣的可以照这个链接里的代码试试
3. 利用QLocalSocket和QLocalServer,基本的思路是:
应用程序启动时首先尝试去连接一个QLocalServer,如果连接失败,说明自己是第一个实例,于是创建这么一个QLocalServer,否则将启动参数发送给QLocalServer然后退出。第一个实例的QLocalServer在收到后面启动的实例发来的参数时可以进行处理(例如激活第一个实例的窗口)。这个链接里有详细的示例代码供参考。
注:使用QLocalSocket和QLocalServer时,需要把QtNetwork库包含在项目文件中;
4. 用Qt Solutions里提供的QtSingleApplication类(最简单的方法,推荐)
从ftp://ftp.qt.nokia.com/qt/solutions/lgpl/ 下载QtSingleApplication的源码包,解压缩后按照INSTALL.TXT里的说明进行配置和编译,我选择编译成动态库,这样下次再用,只需引用头文件和lib文件即可,比较方便。
用法很简单,只需把原来main()里的QApplication对象换成QtSingleApplication对象,调用一下isRunning()方法进行判断即可。
// 原来的代码
int main(int argc, char **argv)
{
QApplication app(argc, argv);

MyMainWidget mmw;

mmw.show();
return app.exec();
}

// 修改后的代码
int main(int argc, char **argv)
{
QtSingleApplication app(argc, argv);

if (app.isRunning())
return 0;

MyMainWidget mmw;
mmw.show();
return app.exec();
}
注1:QtSingleApplication的实现方法基本上也是利用QLocalServer和QLocalSocket,所以同样依赖于QtNetwork库;
注2:以上代码只展示了QtSingleApplication最简单的用法,这个类还有更多用法,请参考源码包中带的范例和文档。
QtSingleApplication的几种用法(直接使用源码,编译成动态库等)可以参考这个链接:Qt程序只运行一个实例
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑docx怎么转换成word文档电脑上docx格式文件转换方法 电脑白屏是怎么回事啊。??? 电脑开机花屏渐渐地白屏了显示器突然白屏花屏的原因及解决方法_百度知 ... iphone录屏失败因为5823什么意思_iphone录屏失败提示5823代表什么意思... 软考中级:信息安全工程师 求大神解答打印机如何设置默认双面打印 如何更改打印机的打印格式? 经期同房月经没了会怀孕吗 iphone8p轻触解锁设置 宝沃bx5300公里多少油钱 手机电池型号是BL-L907的是配什么手机的,那个牌子? BL‐5CA的手机电池和BL‐5C手机电池有什么不同 诺基亚手机电池BL-5B,BL-4C有什么区别?可以通用吗? html如何自适应宽屏正屏。如何自适应分辨率和居中 诺基亚手机电池 BL-5CA 和 BL-5C能混用吗? “锐利形容眼睛”是什么意思? 用宽阔、慰藉、锐利、金碧辉煌、造句 锐利怎么造句? 锐利造句 锐利是什么意思? 锐利、悲惨、栩栩如生、妙不可言,(造句) 贝瓦儿歌小蜜蜂 锐利造句。 锐利(尖而锋利)造句 造句锐利(1)尖而快,指刀刃锋利等 (2)尖锐,多指目光,言论,文笔等 照顾(1)考虑(到) 锐利根据不同意思写两个句子 用锐利根据词语的不同意思造句 锐利能组什么句子? 锐利怎么 造句??? 锐利怎么造句 英语满分120,昨天刚考完,做梦梦到英语考试104是怎么回事 盐湖股份000792未来趋势 利用QT写界面,但是具体程序是C的编写 要怎么链接呢??? 除了用extern &quot;C&quot;这样的方法 有没有编译的时候链 盐湖股份趋势分析,000792趋势分析 梦到回学校参加英语考试 盐湖股份的趋势图,000792的趋势图 一个qt程序能不能有两个mainwindow 梦见自己要参加外语考试? 盐湖股份趋势图,000792趋势图 c++基础怎么快速学qt,推荐几本书,不要老的最近看的资料编程总是通不过,很多类在qt4 5都用不 股票专家点评000792股票怎样操作 荣耀10和荣耀player哪个好 太阴入命是什么意思 对于000792 怎样把握好最强的趋势,请教下高手能帮个忙吗? 太阴勾绞入命起什么福 四墓库全的从强格八字女命,时干七杀妒合年月干,特殊八字有没高手分解 太阴入身宫,主双亲不利,或离异或出祀,请问如何理解 口袋妖怪游戏的种类 求口袋妖怪所有游戏作品的名称,要很全的! 这个口袋妖怪游戏叫什么