如何在执行alt-tab时阻止Gnome显示两个窗口? (c ++ qt app)

时间:2010-08-24 03:42:04

标签: c++ qt gnome qwidget alt-tab

(见编辑)

我正在开发gnome下的QT / c ++应用程序。

应用程序主窗口和QListBox子窗口。

当我远离应用程序时,这两个窗口都显示为单独的主窗口。

如何在我(或以后的用户)使用alt-tab时只显示一个窗口?

我猜测这种行为是因为一个主窗口没有剪切子窗口 - 子窗口扩展了主窗口的边界。对于许多其他应用程序,Gnome也有很糟糕的alt-tab行为,与主窗口分开显示模态对话框。但在我的应用程序的情况下,这真的很烦人。

我想我可以制作一个包含现有窗户的巨大透明窗口。但找到一个“干净”的解决方案会更好。

(最合乎逻辑的猜测确实是它与窗口标志有关。我已经尝试了我能想到的每个合理的标志组合。窗口类型被描述为here

编辑: 该应用程序有一个QWidget作为其主窗口(Not QMainWindow),QListView包含在QWidget对象中,并通过将一个点传递给主窗口来创建。  使用Qt :: Tool |进行样式设置Qt的:: FramelessWindowHint。

Edit2: Qt :: X11BypassWindowManagerHint样式确实可以从alt-tab列表中删除窗口。问题是它还使窗口“不受管理”,因此它覆盖了其他窗口。每当我失去焦点时,我都可以躲藏起来 - 现在可以获得更好的解决方案。

2 个答案:

答案 0 :(得分:3)

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)上使用新创建的用户image proof on answer to question #3553428对此进行了测试。

如果这不是您想要的,请将软件命名为正常工作,或者您可以自行检查。要执行此操作,请在终端窗口中运行xprop,然后单击您感兴趣的窗口。输出将包含窗口标志。您感兴趣的是_NET_WM_WINDOW_TYPE(ATOM)。对于工具窗口(即未在alt-tab中列出),该标志为:

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL

如果带有这些标志的窗口不是工具箱窗口,那么窗口管理器出现问题,或者您个人设置了此类行为。

答案 1 :(得分:1)

您可以使用wmctrl工具手动尝试。使用“-r -b SOMETHING”,您可以修改它的NET_WM参数。在[1]中尝试这些。

如果这样可行,您可以使用Xlib-Calls添加它们(如果您从Qt了解X11 Window Number。我相信这是可能的。)

[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html