使用多个屏幕时,Gnome Shell会导致QMenu显示在错误的位置

时间:2015-09-29 22:30:00

标签: c++ qt gnome gnome-3 gnome-shell

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

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

症状:

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

然后我使用QMenu::exec(QPoint)显示该位置的菜单

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

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

Ubuntu Gnome 14.04

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

enter image description here

当我的窗口在左侧屏幕上时,在右侧屏幕顶部上方的某个级别,即使从QPoint返回的mapToGlobal的Y值正确,也会显示上下文菜单在那一点上不显示,但相当于与右手屏幕处于同一水平。

enter image description here

我已确认_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问题

我尝试更换主显示器,以便左侧的人像显示器是主显示器,并且正确显示上下文菜单。

enter image description here

注意黑色启动栏位于左侧屏幕

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

enter image description here

注意黑色启动栏位于右侧屏幕

所以主显示器的顶部位置似乎是Qt显示其上下文菜单的最大高度?

2 个答案:

答案 0 :(得分:0)

虽然技术细节可能略有不同,但我发现基本的操作系统和两个显示器(一台笔记本电脑和一台智能电视)的内置显示器位于外部显示器的右侧,如果我将菜单隐藏,在我的内置显示器上安装Qt应用程序(在我的情况下为KeePassXC)。如果将其移至外部显示器,则菜单位于显示器的顶部,而不是窗口中。我不能说,无论是在Qt,ubuntu还是gnome shell中,都有明显的错误。

我可以说,将显示器切换回默认位置,并在外部左侧安装内置显示器,此问题已解决:我终于可以访问菜单了。

我尝试过移动窗口的位置,只要我的内置显示器位于外部显示器的左侧,无论窗口在哪里,它都可以正常工作。< / p>

如果显示器的摆放位置不是这种方式,则此解决方案可能不是理想的选择,但就我而言,我已经不得不躺在显示器摆放的位置。我的内置组件位于我的外部组件之下,但是当我尝试告诉基本组件时,它停止正常运行(所有窗口均移至屏幕边界之外,所有窗口均在屏幕外启动;删除.config / monitors.xml可以修复该问题,但是我必须能够进入屏幕上的命令提示符才能执行此操作。)

答案 1 :(得分:0)

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

+360

如QT所知,这360个像素对应于窗口“位置”的顶部。 就我而言,菜单栏本身为25像素高。请牢记所有这些信息(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
...

当我重新对齐屏幕以使位置偏移为零(如以下设置)时,问题就消失了:

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

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

$ 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
...

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