3

Gnome 3上使用多个显示器时,我的 Qt 应用程序的上下文菜单显示在不正确的位置。

似乎这里的罪魁祸首可能是Gnome Shell,而不是 Qt 本身,因为我无法用 Ubuntu Unity 复制下面描述的问题,它只在运行Ubuntu Gnome 14.04时发生。

症状:

我正在使用QWidget::mapToGlobal(QPoint)信号QWidget::customContextMenuRequested来找到显示上下文菜单的正确位置。

然后我QMenu::exec(QPoint)用来在那个位置显示菜单

void Window::slotOnShowContextMenu(const QPoint& p)
{
    _menu->exec(_tree->viewport()->mapToGlobal(p));
}

我的问题是我有以下屏幕布局:

在此处输入图像描述

当我的窗口位于右侧屏幕或左侧屏幕但位于右侧屏幕顶部下方的位置时,上下文菜单正确显示:

在此处输入图像描述

当我的窗口在左侧屏幕上时,在右侧屏幕顶部上方的级别上,即使QPoint返回的 Y 值mapToGlobal是正确的,上下文菜单也不会在该点显示,而是被限制为与右侧屏幕处于同一水平。

在此处输入图像描述

我已经确认_tree->viewport()->mapToGlobal(p)返回正确的结果(只需记录结果QPoint

QPoint point = _tree->viewport()->mapToGlobal(p);

std::cout << point.x() << ":" << point.y() << '\n';

因此,这似乎QMenu::exec(QPoint)是罪魁祸首?

如何正确显示上下文菜单?

编辑:

我尝试在标准 Ubuntu 14.04 上运行相同的应用程序(即:使用 Unity 而不是 Gnome),并且不正确的行为不会出现,所以这似乎是Gnome 3 的问题

我尝试更改我的主监视器,以便左侧的纵向监视器是主监视器,并且上下文菜单正确显示。

在此处输入图像描述

注意黑色启动栏在左侧屏幕上

当使用以下布局时(主屏幕在右侧是横向的),上下文菜单位置被限制在主监视器的顶部。

在此处输入图像描述

注意黑色启动栏在右侧屏幕上

所以看起来主显示器的顶部位置是 Qt 将显示它的上下文菜单的最大高度?

4

2 回答 2

0

虽然技术细节可能略有不同,但我发现使用基本操作系统和两台显示器(一台笔记本电脑和一台智能电视),我的内置显示器位于外部显示器的右侧,如果我有 Qt,菜单是不可见的应用程序(在我的例子中是 KeePassXC)在我的内置显示器上。如果我把它移到我的外接显示器上,菜单就在显示器的顶部,而不是在窗口中。显然某处存在错误,无论是在 Qt 还是 ubuntu 或 gnome shell 中,我都不能说。

我可以说将我的显示器切换回默认位置,内置在外部左侧,问题得到解决:我终于可以访问它们应该在的菜单。

我尝试过移动窗口位置,只要我的内置显示器位于外部显示器的左侧,窗口在哪里都没有关系,它就像它应该的那样工作。

如果您的显示器没有以这种方式物理定位,则此解决方案可能并不理想,但就我而言,我已经不得不对显示器的位置撒谎。我的内置低于我的外部,但是当我试图告诉基本,它停止正常运行(所有窗口都移动到屏幕边界之外,所有窗口都在屏幕外启动;删除 .config/monitors.xml 修复它,但我必须能够进入屏幕上的命令提示符才能执行此操作。)

于 2018-12-18T09:08:28.590 回答
0

我遇到了同样的问题。当我深入研究它时,我意识到这是感知/“逻辑”监视器位置与屏幕渲染之间的冲突。就我而言,我可以通过最右边的显示器(相当于您的惠普 27" 显示器)的输出xrandr和配置看到它的位置偏移量为:~/.config/monitors.xml+360

$ xrandr 
Screen 0: minimum 320 x 200, current 7040 x 1440, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+5120+360 (normal left inverted right x axis y axis) 309mm x 173mm
...

这 360 个像素对应于 QT 所理解的窗口“位置”的顶部。在我的例子中,菜单栏本身是 25 像素高。牢记所有这些(360 + 标题栏高度 + 菜单高度)感知到的菜单绘制位置的实际偏移量。

+---------+---------------------------------------------+   ^
|         |                                             |   |
| +-------------------------------------^-------------+ |   |
| |       |                             |   25 pixels | |   | 360 pixels
| +-------------------------------------v-------------+ |   |
| |       |                                           | |   v
| |       |    385 pixels                             | +---+---------------------------+
| |       |                                           | |                               |
| |  +----v+                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  +-----+                                          | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| +---------------------------------------------------+ |                               |
|                                                       |                               |
|                                                       |                               |
|                                                       |                               |
|                                                       |                               |
+-------------------------------------------------------+-------------------------------+

当我重新对齐屏幕以使位置偏移为零时,就像在以下设置中一样,问题就消失了:

$ xrandr 
Screen 0: minimum 320 x 200, current 7040 x 1440, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+5120+0 (normal left inverted right x axis y axis) 309mm x 173mm
...

在这种情况下,360 像素位置偏移现在为零,QT 将下拉菜单呈现在正确的位置:

+-------------------------------------------------------+-------------------------------+
|                                                       |                               |
| +-------------------------------------^-------------+ |                               |
| |                                     |   25 pixels | |                               |
| +--+-----+----------------------------v-------------+ |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  |     |                                          | |                               |
| |  +-----+                                          | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | |                               |
| |                                                   | +-------------------------------+
| +---------------------------------------------------+ |
|                                                       |
|                                                       |
|                                                       |
|                                                       |
+--------------------------------------------------------

我正在向 QT 提交关于此错误的错误(因为我有多个受此错误影响的应用程序),但在收集错误的相关信息的过程中,我发现它不仅受到 QT/QT5 的影响,而且还有搅拌机。由于 Blender 不使用图形框架(例如 QT/QT5、GTK+ 等),这几乎可以肯定是 GNOME3 组件之一中的错误。

于 2020-07-01T18:11:03.273 回答