z
Наурыз 26, 2020, 3: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
2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

5
z
  • Наурыз 26, 2020, 6: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, 1: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, 9:46 Т.Қ.

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

        z
        • Наурыз 27, 2020, 10:43 Т.Қ.

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

          Evgenii Legotckoi
          • Наурыз 30, 2020, 1:17 Т.Қ.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз