【发布时间】: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