QT 4.8.5-弹出菜单显示在错误位置-底座11
我正在SLED 11上开发QT 4.8.5中的应用程序工具栏(此版本对我的客户端是必需的)。 我也在一个多监视器环境中 我的目的是在指定的监视器上显示扩展工具栏,在其他监视器上显示缩小工具栏。 从主工具栏可以打开系统中安装的不同应用程序。这些应用程序可以基于QT,也可以不基于QT 为了使xserver将工具栏作为停靠窗口处理,并在桌面上保留空间(因此其他窗口无法在工具栏上移动,并使窗口最大化不覆盖工具栏),我使用了一些xlib调用 这是我保留空间的方式:QT 4.8.5-弹出菜单显示在错误位置-底座11,qt,drop-down-menu,xlib,qt4.8,xserver,Qt,Drop Down Menu,Xlib,Qt4.8,Xserver,我正在SLED 11上开发QT 4.8.5中的应用程序工具栏(此版本对我的客户端是必需的)。 我也在一个多监视器环境中 我的目的是在指定的监视器上显示扩展工具栏,在其他监视器上显示缩小工具栏。 从主工具栏可以打开系统中安装的不同应用程序。这些应用程序可以基于QT,也可以不基于QT 为了使xserver将工具栏作为停靠窗口处理,并在桌面上保留空间(因此其他窗口无法在工具栏上移动,并使窗口最大化不覆盖工具栏),我使用了一些xlib调用 这是我保留空间的方式: void ToolbarWindow::
void ToolbarWindow::dock(int x, int y, int width, int height)
{
#ifdef Q_WS_X11 //only define on Qt 4.X
Display *display = QX11Info::display();
// Change the window type in order to make it DOCK.
Atom tmp = XInternAtom(display, "_NET_WM_WINDOW_TYPE_DOCK", False);
XChangeProperty(display,
winId(),
XInternAtom(display, "_NET_WM_WINDOW_TYPE", False),
XA_ATOM ,
32,
PropModeReplace,
(unsigned char *)&tmp, 1);
// Reserve the space.
// [0]left, [1]right, [2]top, [3]bottom, [4]left_start_y, [5]left_end_y, [6]right_start_y, [7]right_end_y, [8]top_start_x, [9]top_end_x, [10]bottom_start_x, [11]bottom_end_x
long insets[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
insets[2] = height;
insets[8] = x;
insets[9] = x+width;
XChangeProperty(display,
winId(),
XInternAtom(display, "_NET_WM_STRUT", False),
XA_CARDINAL ,
32,
PropModeReplace,
(unsigned char *)&insets, 4);
XChangeProperty(display,
winId(),
XInternAtom(display, "_NET_WM_STRUT_PARTIAL", False),
XA_CARDINAL ,
32,
PropModeReplace,
(unsigned char *)&insets, 12);
#endif
}
一切似乎都很好,但在一些测试之后,我发现QT下拉菜单有一个大问题。
看来,当Qt计算下拉位置时,它会考虑最大独立高度,而不是窗口中的监视器。p>
这里有两张图片显示了这个问题
第一幅图像显示,即使在QTCreator下拉菜单中,也可以测试该问题。
第二幅图显示了我所做的一个测试,目的是查看自定义QMainWindow上的combobox下拉列表中发生了什么。
问题似乎是一样的
我还可以补充一点,将窗口移动到第二个监视器主工具栏高度下方的下拉位置是正确的。
此外,其他非QT应用程序没有这种行为,因此我认为这是Qt4.8.5在下拉定位期间的问题
我还发现了与MacOSX相关的类似bug。
我不知道这些bug是否有意义,但我还是会列出它们:
非常感谢。此Qt错误看起来非常相似: 它包括一个Qt补丁(尽管现在可能已经过时),可以纠正它