z
26 марта 2020 г. 5: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

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
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
5
z
  • 26 марта 2020 г. 8:20
  • Ответ был помечен как решение.

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

int main(int argc, char *argv[])
{
    argc = 3;
    argv[0] = (char*)"Appname";
    argv[1] = (char*)"--platform";
    argv[2] = (char*)"android:dpiawareness=0";

    QGuiApplication app(argc, argv);
    ...
}

Заменил "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 может быть вам и "помог", но только до тех пор, пока вы не используете получение ширины и высоты экрана на другом устройстве, где масштабирование будет работать иным способом. И будет пересчитываться с другим коэффициентом масштабирования.

z

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

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

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

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

Комментарии

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

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

DK
1 апреля 2020 г. 8:03
Dmitry Kozhinov

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
A
30 марта 2020 г. 12:47
Anna

C++ - Тест 001. Первая программа и типы данных

  • Результат:60баллов,
  • Очки рейтинга-1
A
29 марта 2020 г. 12:14
Alexanderv66

C++ - Тест 003. Условия и циклы

  • Результат:71баллов,
  • Очки рейтинга1
Последние комментарии
3 апреля 2020 г. 8:06
Konstantin Grudnitskiy

Я надеюсь вы уже разобрались в чем дело, но если вдруг нет, то проблема состоит в том, что вы пытаетесь запустить программу из интерпретатора питона. Файл main.py это уже готова…
3 апреля 2020 г. 6:18
Konstantin Grudnitskiy

>>> text = 'hello world'>>> ' '.join(word for word in text.split()[:-1])'hello'>>> def remove_last_word(text):... return text and ' '.join(word for word in text.s…
27 марта 2020 г. 14:40
Евгений Легоцкой

Добрый день. В конце пятой статьи скачать можете.
27 марта 2020 г. 14:28
mkdir _

Здравствуйте, а можно, пожалуйста, ссылку на целые исходники, если есть?
27 марта 2020 г. 4:36
Евгений Легоцкой

Скорее всего также, как и для установки всех остальных переменых в CMake, через использование set
Сейчас обсуждают на форуме
3 апреля 2020 г. 12:53
BlinCT

Само собою на компе этого незаметно.
3 апреля 2020 г. 8:48
Intruder

Евгений, добрый день. Спасибо!
s
3 апреля 2020 г. 7:52
solmik

да вроде много чего установленно, если неправильный путь указать то же самое, пробовал запустить видео через плей лист (по примерам из док)и из него назад путь взять, не получилось
3 апреля 2020 г. 5:50
Юрий-В

Спасибо ! Поковырявшись и посмотрев интерфейс QSvgRender и т.д. понимаю что похоже нужно будет лезть в реализацию ::render(..). Кто может подсказать как и где выкачать актуальные исходники…
2 апреля 2020 г. 2:46
Евгений Легоцкой

Я думаю, что это где-то описано, но в такой глубине документации и максимум в самых базовых вещах, то есть отдельно в классах этого не пишут, просто потому, что придётся писать для каждого класс…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB