在执行ALT-TAB时,如何防止侏儒显示两个窗口? (C ++ QT应用程序)
题
(请参阅编辑)
我正在开发GNOME下的QT/C ++应用程序。
应用程序主窗口和QListBox子窗口。
当我远离应用程序时,这两个窗口都显示为单独的主窗口。
我该如何制作它,以便当我(或以后的用户)使用alt-tab时仅显示一个窗口?
我猜想这种行为之所以出现,是因为一个主窗口不会夹住子窗口 - 子窗口扩展了主窗口的边界。 GNOME对于其他许多应用程序也具有不良的Alt-tab行为,与主窗口分开显示模态对话框。但是就我的应用程序而言,这确实很烦人。
我认为我可以制作一个巨大的透明窗口,其中包括现有窗口。但是找到一个“干净”解决方案会更好。
(最合乎逻辑的猜测确实是它与窗口标志有关。我尝试了我能想到的所有合理的标志组合。窗口类型已描述 这里)
编辑:该应用程序具有QWIDGET作为其主窗口(不是QMainWindow),QListView包含在Qwidget对象中,并通过将点传递到主窗口而创建。用QT ::工具| QT :: FramelessWindowHint。
edit2: QT :: X11BYPASSWINDOWMANAGERHINT风格 做 工作以从Alt-Tab列表中删除窗口。问题在于它还使窗口“未经管理”,因此覆盖了其他窗口。每当我失去焦点时,我都可以躲藏起来 - 现在奖励更好的解决方案。
解决方案
在为您的窗口创建窗口时 QListBox
窗口设置 Qt::Tool
其构造函数或以后的窗口标志 setWindowFlags
功能调用。这是一些代码段(我省略了标题):
int main(int argc, char** argv) { QApplication app(argc, argv); QMainWindow mw; mw.show(); QWidget toolWindow(&mw, Qt::Window|Qt::Tool); QHBoxLayout layout(&toolWindow); toolWindow.setLayout(&layout); QListView lv(&toolWindow); layout.addWidget(&lv); toolWindow.show(); return app.exec(); }
我已经在我的Debian SID框(Gnome 2.30,Metacity 2.30.1)上测试了此功能: .
如果这不是您想要的,请命名正确工作的软件,否则您可以自己检查。做这个运行 xprop
在终端窗口中,单击您感兴趣的窗口。输出将包含窗口标志。您感兴趣的是 _NET_WM_WINDOW_TYPE(ATOM)
. 。对于工具窗口(即未在alt-tab中列出),此标志是:
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL
如果带有这些标志的窗口不是工具箱窗口,那么您的窗口管理器有问题,或者您亲自设置了此类行为。
其他提示
您可以通过WMCTRL工具手工尝试。使用“ -r -b件”,您可以将net_wm参数修改为它。在[1]中尝试这些。
如果有效,则可以使用Xlib-calls添加它们(如果您从QT了解X11窗口号。我相信这是可能的)。
[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html