一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

  很多时候,为了方便软件的使用,我们需要让编写的界面程序显示在最上层,这时候就需要对窗口属性进行调整。网上给的常用方案是给窗口设置显示在最前的属性:

复制代码
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下不可用哦。

posted on   一杯清酒邀明月  阅读(1307)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示