【问题标题】:Gnome Shell causes QMenu to display in incorrect position when using multiple screens使用多个屏幕时,Gnome Shell 导致 QMenu 显示在不正确的位置
【发布时间】:2015-09-29 22:30:00
【问题描述】:

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

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

症状:

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

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

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

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

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

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

我已确认 _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 将显示它的上下文菜单的最大高度?

【问题讨论】:

  • 也许Qt“认为”你的菜单会从屏幕上掉下来并调整它的位置?
  • 是的,这就是我假设正在发生的事情 - 现在如何防止它? :)

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


【解决方案1】:

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

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

我尝试过移动窗口位置,只要我的内置显示器位于外部显示器的左侧,窗口在哪里都没有关系,它会正常工作。

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。当我深入研究它时,我意识到这是感知/“逻辑”监视器位置与屏幕渲染之间的冲突。就我而言,我可以通过xrandr 的输出和~/.config/monitors.xml 的配置看到我最右边的显示器(相当于你的惠普27" 显示器)它的位置偏移为+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。由于 Blender 不使用图形框架(例如 QT/QT5、GTK+ 等),这几乎可以肯定是 GNOME3 组件之一中的错误。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多