【发布时间】:2015-01-16 10:57:40
【问题描述】:
我正在 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 上的组合框下拉菜单上发生了什么而进行的测试。 问题似乎是一样的。
我还可以添加将窗口移动到第二个监视器上主工具栏高度下方的下拉位置是正确的。 此外,其他非 QT 应用程序没有这种行为,所以我认为这是下拉定位期间的 QT 4.8.5 问题。
我还发现了与 Mac OS X 相关的类似错误。 我不知道这些错误是否有意义,但我还是会列出它们:
- https://bugreports.qt.io/browse/QTBUG-36672
- https://bugreports.qt.io/browse/QTBUG-36984
- https://bugreports.qt.io/browse/QTCREATORBUG-11364
谁能帮我找到解决这个问题的办法?
非常感谢。
【问题讨论】:
标签: qt drop-down-menu xlib qt4.8 xserver