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
import QtQuick 2.14 import QtQuick.Window 2.14 Window { visible: true width: 720 height: 1440 title: qsTr("Hello World") Column { anchors.centerIn: parent Text { text: "Screen.width: " + Screen.width color: "lightsteelblue" } Text { text: "Screen.height: " + Screen.height color: "lightsteelblue" } } MouseArea { anchors.fill: parent onClicked: { // ScreenSize == QGuiApplication::primaryScreen()->size() console.log( ScreenSize.height, ScreenSize.width); } } }
Вывод консоли:
D libTest2_armeabi-v7a.so: qml: 696 360
Скриншот:
Следующий Java код в Android Studio:
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); Log.d("MY_DEBUG", "WIDTH = " + Float.toString(metrics.widthPixels)); Log.d("MY_DEBUG", "HEIGHT = " + Float.toString(metrics.heightPixels));
Дает результат:
2020-03-26 13:48:12.097 9773-9773/? D/MY_DEBUG: WIDTH = 720.0 2020-03-26 13:48:12.097 9773-9773/? D/MY_DEBUG: HEIGHT = 1344.0
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Дмитрий
- 07 травня 2024 р. 09:40
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:60бали,
- Рейтинг балів-1
d
- dsfs
- 26 квітня 2024 р. 04:56
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
Останні коментарі
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко05 лютого 2024 р. 01:50
EVA25 грудня 2023 р. 10:30
Boost - статичне зв'язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
BlinCT05 травня 2024 р. 05:46
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii Legotckoi02 травня 2024 р. 14:07
IscanderChe30 квітня 2024 р. 04:22
Требуемый результат удалось достичь.
Сделал как написано здесь: DPI Awareness .
Еще помог вот этот ответ.
Немного информации что такое qpa .
Заменил "windows" на "android".
Теперь возвращается корректное разрешение экрана.
Хотя вроде бы для android это вообще не предназначено.
Потом удалил добавленные строки и все работает хорошо.
Т.е. приложение в изначальном варианте работает как надо.
Возвращает корректное значение разрешения экрана.
Что-то внутри Qt переключилось.
Суть в том, что изначально размеры для андроида возвращались в DPI, то есть в независимых от плотности экрана пикселях, а не в фактическом разрешении экрана.
Это позволяет писать интерфейс, не делая пересчёт фактических пикселей в независимые.
Qt поддерживает из коробки DPI, но раньше такой поддержки не было и нужно было решать эту проблему так, как описано в этой статье - QML - Урок 009. Масштабируемый интерфейс в Qt Qml Android . Вы можете применить функцию их этой статьи, чтобы получить пересчёт dpi в dp и думаю, что вы получите тот результат, который вам нужен.
То есть по сути, то, что Вы сделали в Java, так вы пересчитали DPI пиксели в обычные через использование метрик.
Главное, чтобы вы потом интерфейс писали основываясь на DPI, а не на фактических размерах.
А то, что вы выполнили в функции main - то это костыль, который скорее всего отключил DPI, это плохо, будет очень трудно писать качественный интерфейс, замучаетесь отлаживать на разных устройствах.
Либо, вы просто удалили Qt::AA_EnableHighDpiScaling, что тоже отключило поддержку high dpi.
В общем тот ответ на stackoverflow может быть вам и "помог", но только до тех пор, пока вы не используете получение ширины и высоты экрана на другом устройстве, где масштабирование будет работать иным способом. И будет пересчитываться с другим коэффициентом масштабирования.
Евгений, спасибо за ответ.
Отстал от жизни, оказывается уже и так можно (использовать DPI).
Теперь надо вернуть обратно.
Буду искать информацию и пробовать "жить" по-новому.
Еще вопрос.
Если мне небходимо задать какой-нибудь размер, его надо умножить на Screen.pixelDensity?
Нет, не нужно ничего умножать, если у вас включена поддержа High DPI в приложении а QML, то достаточно держать в памяти, что все значения задаются в DPI, и просто задаёте значения равные DPI сразу без пересчёта. Все эти умножени требовались раньше, когда поддержки DPI не было в Qt.