Окно QML Force будет показано на первом экране - PullRequest
2 голосов
/ 19 мая 2019

У меня есть следующий компонент QML:

import QtQuick 2.3
import QtQuick.Window 2.3

Window
{
  id: main
  visible: true
  width: 500
  height: 500

  screen: Qt.application.screens[0]

  Text
  {
    text: "Hello World!"
  }
}

использовал следующий способ:

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QString>

int main(int argc, char** argv)
{
    QApplication app{argc, argv};
    QQmlApplicationEngine engine;
    engine.load(QUrl{QStringLiteral("qrc:/main.qml")});
    return app.exec();
}

Я запускаю это в системе с двумя экранами.

Пока у меня есть screen: Qt.application.screens[0], окно всегда будет отображаться на экране, где находится мышь при запуске приложения.

Если я изменю его на screen: Qt.application.screens[1], окно всегда будет отображаться на втором экране, независимо от текущей позиции мыши.

Qt.application.screens[2] не существует.

Теперь два вопроса: ожидается ли это поведение screen: Qt.application.screens[0], т.е. является ли первый элемент в этом массиве всегда текущим экраном?

И если да, то как мне получить первый экран?

Пробовал это с версиями Qt 5.9.6 и 5.12.3.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

На двухэкранном виртуальном рабочем столе я бы попытался установить координаты окна сразу после указания экрана. Следующий код должен центрировать окно на первом экране массива Qt.application.screens:

  screen: Qt.application.screens[0]
  x: screen.virtualX + ((screen.width - width) / 2)
  y: screen.virtualY + ((screen.height - height) / 2)

Обратите внимание, что я использовал свойства virtualX и virtualY, то есть координаты экрана в виртуальном рабочем столе . Таким образом, окно будет находиться в центре экрана, к которому оно принадлежит.

Кстати, можно вообще опустить свойство screen и задать только координаты:

  x: 0
  y: 0

Приведенный выше код поместит окно в верхний левый угол левого экрана, то есть в абсолютный верхний левый угол виртуального рабочего стола.

0 голосов
/ 20 мая 2019

Если я правильно понял вопрос, Qt.application.screens[0] означает просто доступ к первому элементу следующего массива: https://doc.qt.io/qt-5/qguiapplication.html#screens.Порядок QScreen экземпляров этого метода не описан в документации, но похоже, что 0-й индекс означает первый экран.Однако есть и другой способ получить первый экран.Однако имейте в виду, что выражение «первый экран» не совсем корректно.Вы можете физически поменять местами свои экраны, и какой из них будет первым?Вы должны понимать, что Qt не может знать, поменялись ли вы физически экранами или нет.Таким образом, есть более правильный вызов для этого типа экрана.Экран, который вы, вероятно, считаете первым, называется Qt основным экраном.Для доступа к этому экрану используется следующий метод: https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop

Другими словами, ваши потребности могут быть удовлетворены с помощью следующего подхода: вместо screen: Qt.application.screens[0] вы должны использовать screen: Qt.application.primaryScreen.Вполне возможно, что первый подход также будет работать, но использование primaryScreen выглядит гораздо более декларативным и понятным, чем первый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...