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