z
zhdv0626 березня 2020 р. 05: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 р. 08: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 переключилось.

    Evgenii Legotckoi
    • 27 березня 2020 р. 03: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 р. 11:46

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

        z
        • 27 березня 2020 р. 12:43

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

          Evgenii Legotckoi
          • 30 березня 2020 р. 03:17

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

            Коментарі

            Only authorized users can post comments.
            Please, Log in or Sign up
            OI
            • Ora Iro
            • 24 грудня 2024 р. 06:38

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

            • Результат:40бали,
            • Рейтинг балів-8
            AD

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:50бали,
            • Рейтинг балів-4
            m
            • molni99
            • 26 жовтня 2024 р. 01:37

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80бали,
            • Рейтинг балів4
            Останні коментарі
            ИМ
            Игорь Максимов22 листопада 2024 р. 11:51
            Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii Legotckoi31 жовтня 2024 р. 14:37
            Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZE19 жовтня 2024 р. 08:19
            Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов05 жовтня 2024 р. 07:51
            Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas505 липня 2024 р. 11:02
            QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Тепер обговоріть на форумі
            Donald Randolph
            Donald Randolph30 грудня 2024 р. 02:59
            Personal Injury lawyer Santa Monica As an experienced Santa Monica personal injury lawyer, Donald C. Randolph has recovered over $100 Million in verdicts and settlements for our clients. In severe injury cases, this compensation i…
            Nirvana Yoga School
            Nirvana Yoga School30 грудня 2024 р. 05:13
            OAuth2.0 через VK, получение email Nirvana Yoga School is one of the most trusted and reputed traditional Rishikesh yoga courses , India certified by Yoga Alliance, USA. We aim to spread traditional yoga teachings so t…
            s
            sripark30 грудня 2024 р. 04:47
            Mobile app development company in Chennai A Mobile app development company in Chennai focuses on creating personalized mobile applications to meet various business requirements. These companies offer a full range of services,…
            a
            amit8830 грудня 2024 р. 04:45
            Excel in Exams with PSLE Maths Tuition Singapore Preparing for the PSLE can be challenging, but the right guidance makes all the difference. PSLE Maths tuition Singapore offers personalized coaching to help students master key concepts, improv…
            a
            awinash6230 грудня 2024 р. 04:23
            Unlock Your Potential with the Certified Public Accountant Credential" Becoming a Certified Public Accountant (CPA) is a career milestone that opens doors to unparalleled opportunities in the world of accounting and finance. This globally recognized qualification s…

            Слідкуйте за нами в соціальних мережах