z
March 26, 2020, 3:38 p.m.

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

Do you like it? Share on social networks!

5
z
  • March 26, 2020, 6:20 p.m.
  • The answer was marked as a solution.

Требуемый результат удалось достичь.
Сделал как написано здесь: 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
    • March 27, 2020, 1:39 p.m.
    • (edited)

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

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

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

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

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

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

      z
      • March 27, 2020, 9:46 p.m.

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

        z
        • March 27, 2020, 10:43 p.m.

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

          Evgenii Legotckoi
          • March 30, 2020, 1:17 p.m.

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

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            • Last comments
            • Evgenii Legotckoi
              March 9, 2025, 9:02 p.m.
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              March 9, 2025, 4:14 p.m.
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              Nov. 22, 2024, 9:51 p.m.
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            • Evgenii Legotckoi
              Oct. 31, 2024, 11:37 p.m.
              Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            • A
              Oct. 19, 2024, 5:19 p.m.
              Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html