我的 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));
}
我的问题是我有以下屏幕布局:
当我的窗口在右侧屏幕上,或在左侧屏幕上但在右侧屏幕顶部下方的位置时,上下文菜单显示正确:
当我的窗口在左侧屏幕上时,在右侧屏幕顶部上方的某个级别,即使从QPoint
返回的mapToGlobal
的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显示其上下文菜单的最大高度?
答案 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组件之一中的错误。