7

(见编辑)

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

该应用程序有一个主窗口和 QListBox 子窗口。

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

当我(或以后的用户)使用 alt-tab 时,我怎样才能使它只显示一个窗口?

我猜这种行为是因为一个主窗口没有剪辑子窗口 - 子窗口扩展了主窗口的边界。Gnome 对许多其他应用程序也有不好的 alt-tab 行为,显示模式对话框与主窗口分开。但就我的应用程序而言,这真的很烦人。

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

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

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

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

4

2 回答 2

3

在为您的窗口创建窗口时,在其构造函数中或稍后通过函数调用QListBox设置窗口标志。这是一些代码片段(我省略了标题):Qt::ToolsetWindowFlags

int main(int argc, char** argv)
{
    QApplication 应用程序(argc,argv);
    QMainWindow mw;
    mw.show();
    QWidget toolWindow(&mw, Qt::Window|Qt::Tool);
    QHBoxLayout 布局(&toolWindow);
    toolWindow.setLayout(&layout);
    QListView lv(&toolWindow);
    layout.addWidget(&lv);
    工具窗口.show();

    返回 app.exec();
}

我已经在我的 Debian sid 盒(Gnome 2.30,metacity 2.30.1)上用新创建的用户测试了这个:问题 #3553428 答案的图像证明.

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

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL

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

于 2010-08-30T20:49:54.553 回答
1

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

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

[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html
于 2010-09-02T09:23:22.080 回答