Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何防止Gnome在执行alt tab时显示两个窗口?(c+;+;qt应用程序)_C++_Qt_Gnome_Qwidget_Alt Tab - Fatal编程技术网

C++ 如何防止Gnome在执行alt tab时显示两个窗口?(c+;+;qt应用程序)

C++ 如何防止Gnome在执行alt tab时显示两个窗口?(c+;+;qt应用程序),c++,qt,gnome,qwidget,alt-tab,C++,Qt,Gnome,Qwidget,Alt Tab,(见编辑) 我正在gnome下开发一个QT/c++应用程序 该应用程序包含主窗口和QListBox子窗口 当我将alt tab从应用程序中移出时,这两个窗口都显示为单独的主窗口 当我(或稍后的用户)使用alt tab时,如何使它只显示一个窗口 我猜这种行为是因为一个主窗口没有剪裁子窗口-子窗口扩展了主窗口的边界。Gnome在许多其他应用程序中也有不好的alt选项卡行为,分别从主窗口显示模式对话框。但就我的应用而言,这真的很烦人 我想我可以制作一个巨大的透明窗口,包括现有的两个窗口。但最好能找到一

(见编辑)

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

该应用程序包含主窗口和QListBox子窗口

当我将alt tab从应用程序中移出时,这两个窗口都显示为单独的主窗口

当我(或稍后的用户)使用alt tab时,如何使它只显示一个窗口

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

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

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

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


Edit2:Qt::X11ByPassWindowManagerInt样式用于将窗口从alt选项卡列表中删除。问题是,它还使窗口处于“非托管”状态,因此它会覆盖其他窗口。每当我失去注意力的时候,我都可以躲起来——现在就奖励一个更好的解决方案

QListBox
窗口创建窗口时,在其构造函数中设置
Qt::Tool
window标志,或稍后使用
setWindowFlags
函数调用。下面是一些代码片段(我省略了标题):


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

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

如果这样做有效,您可以将它们添加到Xlib调用中(如果您从Qt了解X11窗口号,我相信这是可能的)


我猜这和窗户上的旗帜有关。。。例如,如果你把它做成一个工具窗口,它会同时抓住这两个窗口吗?例如,当我使用OpenOffice时,gnome不通过其浮动工具窗口进行制表,而只通过主窗口进行制表?有没有可能找到生成此问题所需的最低代码框架?好吧,你已经得到了唯一的答案-问题是,你错了。我等一下。如果您编辑以反映我问题中的评论,可能会奖励它…好吧,我认为解决方案与我的编辑一样-您需要使用Qt::X11ByPassWindowManagerInt样式处理所有问题。但是,嘿,如果你经历了那么多麻烦,你比任何人都更接近…但是frickin stack overflow可能已经吃掉了奖金,因为我看不到它们出现。真糟糕。这个地方已经不是以前的样子了。。。 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(); } _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_NORMAL
[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html