мой Контекстное меню приложения Qt отображается в неправильная позиция при использовании нескольких мониторов на Гном 3.
Казалось бы, что виновник здесь Гномовая ракушка, а не сам Qt, поскольку я не могу воспроизвести проблему, описанную ниже, с Ubuntu Unity, это происходит только при запуске Убунту Гном 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), и неправильное поведение не проявляется, так что это может показаться вопрос гнома 3?
Я попытался изменить свой основной монитор, чтобы портретный монитор слева был основным, и контекстное меню отображалось правильно.
Обратите внимание, черная панель запуска находится на левом экране
При использовании следующего макета (основной экран — горизонтальный справа), положение контекстного меню ограничивается верхней частью основного монитора.
Обратите внимание, черная панель запуска находится на правом экране
Так что может показаться, что верхняя позиция основного монитора — это максимальная высота, на которой Qt будет отображать свое контекстное меню?
В то время как технические детали могут немного отличаться, я обнаружил, что с простейшей ОС и двумя мониторами (ноутбук и умный телевизор) мой встроенный дисплей расположен справа от внешнего дисплея, но меню у меня не отображается приложение (KeePassXC в моем случае) на моем встроенном дисплее. Если я перенесу его на внешний дисплей, меню появятся в верхней части экрана, а не в окне. Ясно, что где-то есть ошибка, будь то в Qt, Ubuntu или Gnome Shell, я не могу сказать.
Я могу сказать, что при переключении моих дисплеев обратно в положение по умолчанию со встроенным слева от внешнего источника проблема решена: я наконец могу получить доступ к меню там, где они должны быть.
Я попытался переместить расположение окна вокруг, и пока мой встроенный дисплей расположен слева от моего внешнего дисплея, не имеет значения, где находится окно, оно просто работает так, как должно.
Это решение может быть не идеальным, если ваши мониторы физически не расположены таким образом, но в моем случае мне уже приходится лгать о том, где расположены мои мониторы. Мой встроенный находится ниже моего внешнего, но когда я пытаюсь сказать элементарному, что он перестает работать правильно (все окна перемещаются за пределы экрана, все окна запускаются за пределами экрана; удаление .config / monitors.xml исправляет это , но я должен иметь возможность получить доступ к командной строке на экране, чтобы сделать это.)
Других решений пока нет …