我正在使用SLED 11在QT 4.8.5(我的客户端必须使用此版本)中开发应用程序工具栏。 我也处于多监视器环境中。
我的目的是在指定的监视器上显示扩展的工具栏,在其他监视器上显示缩小的工具栏。 从主工具栏可以打开系统中安装的不同应用程序。这些应用程序可以是基于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计算下拉列表的位置时,它会考虑窗口所在的监视器独立的最大预留高度。
这里有两张图片显示问题。
第一张图片显示即使在QTCreator下拉菜单中也可以测试问题。
第二张图片显示了我为了查看自定义QMainWindow上的combobox下拉列表发生了什么而进行的测试。 问题似乎是一样的。
我还可以添加将窗口移动到第二台显示器上主工具栏高度下方的下拉位置是正确的。 此外,其他非QT应用程序没有这种行为,所以我认为这是下拉定位期间的QT 4.8.5问题。
我还发现了与Mac OS X相关的类似错误。 我不知道这些错误是否有意义,但无论如何我都会列出它们:
任何人都可以帮我找到解决这个问题的方法吗?
非常感谢。
答案 0 :(得分:1)
此Qt错误看起来非常相似:QMenu size is not shown properly on dual monitor and one with lower resolution.
它包含一个Qt补丁(虽然现在可能已经过时),可以纠正它。