QT 4.8.5-弹出菜单显示在错误位置-底座11

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::

我正在SLED 11上开发QT 4.8.5中的应用程序工具栏(此版本对我的客户端是必需的)。 我也在一个多监视器环境中

我的目的是在指定的监视器上显示扩展工具栏,在其他监视器上显示缩小工具栏。 从主工具栏可以打开系统中安装的不同应用程序。这些应用程序可以基于QT,也可以不基于QT

为了使xserver将工具栏作为停靠窗口处理,并在桌面上保留空间(因此其他窗口无法在工具栏上移动,并使窗口最大化不覆盖工具栏),我使用了一些xlib调用

这是我保留空间的方式:

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补丁(尽管现在可能已经过时),可以纠正它