z
26 марта 2020 г. 15:38

Qt возвращает неправильный размер экрана Android устройства

qt, qml, android, screen, Size

Я сделал тестовое приложение для проверки размера экрана Android смартфона.
Реальное разрешение экрана должно быть 720 x 1440.
Проверил на Xiaomi Redmi 6. Результат: 360 х 696.
Windows 7 64 bit, Qt 5.14.1, jdk1.8.0_241.
Приветствуются любые предположения.

main.qml

  1. import QtQuick 2.14
  2. import QtQuick.Window 2.14
  3.  
  4. Window {
  5. visible: true
  6. width: 720
  7. height: 1440
  8. title: qsTr("Hello World")
  9.  
  10. Column {
  11. anchors.centerIn: parent
  12.  
  13. Text {
  14. text: "Screen.width: " + Screen.width
  15. color: "lightsteelblue"
  16. }
  17.  
  18. Text {
  19. text: "Screen.height: " + Screen.height
  20. color: "lightsteelblue"
  21. }
  22. }
  23.  
  24. MouseArea {
  25. anchors.fill: parent
  26. onClicked: {
  27. // ScreenSize == QGuiApplication::primaryScreen()->size()
  28. console.log( ScreenSize.height, ScreenSize.width);
  29. }
  30. }
  31.  
  32. }

Вывод консоли:

  1. D libTest2_armeabi-v7a.so: qml: 696 360

Скриншот:

Следующий Java код в Android Studio:

  1. DisplayMetrics metrics = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(metrics);
  3. Log.d("MY_DEBUG", "WIDTH = " + Float.toString(metrics.widthPixels));
  4. Log.d("MY_DEBUG", "HEIGHT = " + Float.toString(metrics.heightPixels));

Дает результат:

  1. 2020-03-26 13:48:12.097 9773-9773/? D/MY_DEBUG: WIDTH = 720.0
  2. 2020-03-26 13:48:12.097 9773-9773/? D/MY_DEBUG: HEIGHT = 1344.0
2

Вам это нравится? Поделитесь в социальных сетях!

5
z
  • 26 марта 2020 г. 18:20
  • Ответ был помечен как решение.

Требуемый результат удалось достичь.
Сделал как написано здесь: DPI Awareness .
Еще помог вот этот ответ.
Немного информации что такое qpa .

  1. int main(int argc, char *argv[])
  2. {
  3. argc = 3;
  4. argv[0] = (char*)"Appname";
  5. argv[1] = (char*)"--platform";
  6. argv[2] = (char*)"android:dpiawareness=0";
  7.  
  8. QGuiApplication app(argc, argv);
  9. ...
  10. }

Заменил "windows" на "android".
Теперь возвращается корректное разрешение экрана.
Хотя вроде бы для android это вообще не предназначено.
Потом удалил добавленные строки и все работает хорошо.
Т.е. приложение в изначальном варианте работает как надо.
Возвращает корректное значение разрешения экрана.
Что-то внутри Qt переключилось.

    Evgenii Legotckoi
    • 27 марта 2020 г. 13:39
    • (ред.)

    Суть в том, что изначально размеры для андроида возвращались в DPI, то есть в независимых от плотности экрана пикселях, а не в фактическом разрешении экрана.
    Это позволяет писать интерфейс, не делая пересчёт фактических пикселей в независимые.

    Qt поддерживает из коробки DPI, но раньше такой поддержки не было и нужно было решать эту проблему так, как описано в этой статье - QML - Урок 009. Масштабируемый интерфейс в Qt Qml Android . Вы можете применить функцию их этой статьи, чтобы получить пересчёт dpi в dp и думаю, что вы получите тот результат, который вам нужен.

    То есть по сути, то, что Вы сделали в Java, так вы пересчитали DPI пиксели в обычные через использование метрик.

    Главное, чтобы вы потом интерфейс писали основываясь на DPI, а не на фактических размерах.

    А то, что вы выполнили в функции main - то это костыль, который скорее всего отключил DPI, это плохо, будет очень трудно писать качественный интерфейс, замучаетесь отлаживать на разных устройствах.
    Либо, вы просто удалили Qt::AA_EnableHighDpiScaling, что тоже отключило поддержку high dpi.

    В общем тот ответ на stackoverflow может быть вам и "помог", но только до тех пор, пока вы не используете получение ширины и высоты экрана на другом устройстве, где масштабирование будет работать иным способом. И будет пересчитываться с другим коэффициентом масштабирования.

      z
      • 27 марта 2020 г. 21:46

      Евгений, спасибо за ответ.
      Отстал от жизни, оказывается уже и так можно (использовать DPI).
      Теперь надо вернуть обратно.
      Буду искать информацию и пробовать "жить" по-новому.

        z
        • 27 марта 2020 г. 22:43

        Еще вопрос.
        Если мне небходимо задать какой-нибудь размер, его надо умножить на Screen.pixelDensity?

          Evgenii Legotckoi
          • 30 марта 2020 г. 13:17

          Нет, не нужно ничего умножать, если у вас включена поддержа High DPI в приложении а QML, то достаточно держать в памяти, что все значения задаются в DPI, и просто задаёте значения равные DPI сразу без пересчёта. Все эти умножени требовались раньше, когда поддержки DPI не было в Qt.

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь