В системах X11 (Linux) Qt Widget не отображается поверх родительского элемента, когда QWidget.show () вызывается вскоре после родительского QWidget.show (). Любые идеи? - PullRequest
1 голос
/ 19 февраля 2020

Это запрос, чтобы узнать, нашел ли кто-нибудь какие-либо обходные пути или взломы, чтобы предотвратить случайное размещение 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 менеджер, для исправления.

...