Gnome Shell заставляет QMenu отображаться в неправильном положении при использовании нескольких экранов

Контекстное меню моего приложения Qt отображается в неправильной позиции при использовании нескольких мониторов в Gnome 3.

Может показаться, что виновником здесь является 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));
}

Моя проблема в том, что у меня следующая схема экрана:

Когда мое окно находится на правом экране или на левом экране, но в позиции ниже верхней части правого экрана, контекстное меню отображается правильно:

Когда мое окно находится на левом экране, на уровне выше верхней части правого экрана, хотя значение Y QPoint вернулся из 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 будет отображать свое контекстное меню?

3 ответа

Я столкнулся с этой же проблемой. По мере того, как я копался в этом, я понял, что это конфликт между воспринимаемым /"логическим" расположением монитора и рендерингом экрана. В моем случае я могу видеть выводxrandr и конфигурация ~/.config/monitors.xml что мой самый правый монитор (эквивалент вашего 27-дюймового монитора Hewlett Packard) имеет смещение положения +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.

Я сталкиваюсь с этим с приложениями qt в fvwm, если:

  • У меня есть конфигурация монитора с мертвым пространством
  • и если анимация меню qt включена

Меню оказываются за пределами экрана и вообще не видны или находятся совершенно не в том месте (в зависимости от смещения монитора) -

Таким образом, я не уверен, что это просто ошибка оболочки gnome.

В то время как технические детали могут немного отличаться, я обнаружил, что с простейшей ОС и двумя мониторами (ноутбук и умный телевизор), с моим встроенным дисплеем, расположенным справа от внешнего дисплея, меню не отображается, если у меня есть Qt приложение (KeePassXC в моем случае) на моем встроенном дисплее. Если я перенесу его на внешний дисплей, меню появятся в верхней части экрана, а не в окне. Ясно, что где-то есть ошибка, будь то в Qt, Ubuntu или Gnome Shell, я не могу сказать.

Я могу сказать, что при переключении моих дисплеев обратно в положение по умолчанию со встроенным слева от внешнего источника проблема решена: я наконец могу получить доступ к меню там, где они должны быть.

Я попытался переместить расположение окна вокруг, и пока мой встроенный дисплей расположен слева от моего внешнего дисплея, не имеет значения, где находится окно, оно просто работает так, как должно.

Это решение может быть не идеальным, если ваши мониторы физически не расположены таким образом, но в моем случае мне уже приходится лгать о том, где расположены мои мониторы. Мой встроенный находится ниже моего внешнего, но когда я пытаюсь сказать элементарному, что он перестает работать правильно (все окна перемещаются за пределы экрана, все окна запускаются за пределами экрана; удаление.config/monitors.xml исправляет это, но я должен иметь возможность получить доступ к командной строке на экране, чтобы сделать это.)

Другие вопросы по тегам