很多时候,为了方便软件的使用,我们需要让编写的界面程序显示在最上层,这时候就需要对窗口属性进行调整。网上给的常用方案是给窗口设置显示在最前的属性:
1 //Qt::FramelessWindowHint表示窗口是无边框的窗口,不显示标题栏
2 //Qt::Tool表示是工具窗口不在任务栏显示程序图标
3 //Qt::WindowsStayOnTopHint表示窗口显示在最上层
4 //Qt::WindowDoesNotAcceptFocus表示窗口不接受焦点
5 setWindowFlags(Qt::FramelessWindowHint
6 | Qt::Tool
7 | Qt::WindowStaysOnTopHint
8 | Qt::WindowDoesNotAcceptFocus);
采用这种方案窗口第一次显示的时候是可以保持在最上层的,但是如果窗口隐藏了之后再次显示的后往往最前的状态很容易被抢占,使得窗口无法继续保持在最前面显示。为了让窗口保持在最前面显示,我们需要在窗口再次显示之后将窗口设置到最前显示,在windows下设置方法如下
1 //窗口再次显示的时候
2 //通过设置属性让窗口显示在最前
3 if(!this->isVisible())
4 {
5 this->setVisible(true);
6 #ifdef _WIN32
7 ::SetWindowPos(HWND(this->winId()),HWND_TOPMOST,0,0,0,0,
8 SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
9 ::SetWindowPos(HWND(this->winId()),HWND_NOTOPMOST,0,0,0,0,
10 SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
11 #endif
12 }
13 else
14 {
15 this->setVisible(false);
16 }
在Linux下窗口属性设置了Qt::WindowStaysOnTopHint之后窗口也无法保持显示在最前面,很多时候即便是显示在了最前面,还会出现鼠标事件穿透的问题,针对这个问题,我们可以设置额外的属性来解决这个问题。
1 this->setWindowFlags(Qt::FramelessWindowHint
2 | Qt::WindowStaysOnTopHint
3 | Qt::WindowDoesNotAcceptFocus
4 | Qt::Tool
5 | Qt::X11BypassWindowManagerHint);
窗口添加了Qt::X11BypassWindowManagerHint属性之后就可以保持在最前面显示了。
Qt::X11BypassWindowManagerHint : 完全忽视窗口管理器,它的作用是产生一个根本不被管理器的无窗口边框的窗口,此时,用户无法使用键盘进行输入,除非手动调用QWidget::ActivateWindow()函数。
当然这个属性是针对Linux下生效的在Windows下不可用哦。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)