Это запрос, чтобы узнать, нашел ли кто-нибудь какие-либо обходные пути или взломы, чтобы предотвратить случайное размещение X11 Qt windows. Эти особенности X11 обсуждаются внизу этой страницы в документации Qt. Это часто происходит в моем программном обеспечении, где мне нужно отобразить окно, затем всплывающее окно и сообщение об ошибке, которое всегда появляется на другом экране (вверху слева). Это блокирует основное приложение (модальность) и снижает опыт моего пользователя и доверие к моему программному обеспечению.
Я использую RHEL 7.2 KDE (система на основе X11). Последние несколько дней мои поиски решений и попыток были безрезультатны.
Мои идеи полу-решения: я рассматриваю реализацию строки состояния внизу, которая отображает ошибки ... но я чувствую, что это слишком легко игнорировать и не вызывает тревожного эффекта как всплывающее окно. Для sub windows из моего основного приложения я установил родителя всплывающего окна в главное окно, чтобы оно как минимум появлялось в верхней части главного окна, а не на случайном мониторе.
Минимальный воспроизводимый пример в среде Qt 5.13:
void MainWindow::on_actionShowEditorWindow_pressed() // called from a menu on a QMainWindow
{
editorWindow.show(); //editor Window is a QMainWindow
editorWindow.activateWindow(); // to request focus
// according to Qt documentation X11 systems asynchronously calculate the screen position after .show()
// so when the message below is displayed, the window manager doesn't know where the editor window is, so it defaults to the top left screen
QMessageBox::warning(editorWindow, tr("title"), "This message always appears on the top left screen");
}
Вот мой конструктор editorWindow:
EditorWindow::EditorWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::EditorWindow)
{
ui->setupUi(this);
}
Мой оконный менеджер - kwin, в котором запущен KDE на RHEL 7.2. Большинство моих пользователей работают с 4-мя мониторами, и RHEL 7.2 содержит смесь gnome и KDE.
Спасибо всем, кто может помочь.
Редактировать: в данный момент я пытаюсь настроить kwin, мой windows менеджер, для исправления.