QML font.pointSize варьируется в зависимости от платформы - PullRequest
0 голосов
/ 12 февраля 2019

Я знаю, что везде огромное количество постов, однако на самом деле ничего не работает или, по крайней мере, не для меня ...

В основном я не использую точные числа для font.pointSize, я использую его как: шрифт.pointSize: Math.min (mainappwindow.width, mainappwindow.height) / 10, чтобы быть уверенным, что при изменении разрешения текст всегда будет составлять 10% от всего экрана (очевидно, меньше по ширине или высоте) ...

Однако, если я скомпилирую в окнах, высота текста будет 72 пункта (посчитана и отлажена).Но когда я компилирую на Android (720x1280 HD), тот же код снова отлаживает 72 балла, но он становится больше!coutned points и его 113 ... после недели поисков в Google и пробуя все, что я мог попробовать (ничего не получалось), я просто вычислил разницу в 0,638, которую я умножаю, если платформа Android ... Это прекрасно работает ...однако, когда я изменил разрешение на телефоне с HD на fullHD (1080x1920), его значение снова увеличилось на 1,632 ...

. Поэтому этот пересчет не будет работать на разных устройствах с разным разрешением ...

Я прочитал все исходники Google, QML-масштабирование и т. Д., Но я бы действительно оценил любую часть кода, направленную на мой пример ...

Спасибо, это приводит меня в отчаяние

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Как @ sk2212 сказал, что вы можете использовать Qt :: AA_EnableHighDpiScaling

В файле main.cpp напишите этот код

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

Я бы рекомендовал:check Text Propertys: renderType , минимальный размер пикселя , минимальный размер точки и fontSizeMode . Проверьте renderType и fontSizeMode .Может быть, это ваше решение

В текстовом элементе попробуйте этот код. И попробуйте без вашего пользовательского кода

renderType: Text.QtRendering
fontSizeMode: Text.FixedSize

Также было бы здорово, если бы вы предоставили некоторый код.
PS: Я бы рекомендовал создать дваверсии, одна для настольного компьютера, другая для телефона, кода будет меньше, и обслуживание вашего приложения будет проще.

0 голосов
/ 13 февраля 2019

Вы можете использовать Qt::AA_EnableHighDpiScaling см. Документация высокого разрешения

Однако иногда возникают некоторые проблемы с этой опцией, поэтому вы можете реализовать свою собственную оболочку размера пикселя:

import QtQuick 2.0

pragma Singleton

Object {
    id: units

    /*!
       \internal
       This holds the pixel density used for converting millimeters into pixels. This is the exact
       value from \l Screen:pixelDensity, but that property only works from within a \l Window type,
       so this is hardcoded here and we update it from within \l ApplicationWindow
     */
    property real pixelDensity: 4.46
    property real multiplier: 1.4 //default multiplier, but can be changed by user

    /*!
       This is the standard function to use for accessing device-independent pixels. You should use
       this anywhere you need to refer to distances on the screen.
     */
    function dp(number) {
        return Math.round(number*((pixelDensity*25.4)/160)*multiplier);
    }

    function gu(number) {
        return number * gridUnit
    }

    property int gridUnit: dp(64)
}

В вашем main.cpp используйте собственный код Android для вычисления density:

int density = 0;
float logicalDensity = 0;
float yDpi = 0; float xDpi = 0;

#if defined(ANDROID)
   QAndroidJniObject qtActivity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
   QAndroidJniObject resources = qtActivity.callObjectMethod("getResources", "()Landroid/content/res/Resources;");
   QAndroidJniObject displayMetrics = resources.callObjectMethod("getDisplayMetrics", "()Landroid/util/DisplayMetrics;");
   density = displayMetrics.getField<int>("densityDpi");
   logicalDensity = displayMetrics.getField<float>("density");
   yDpi = displayMetrics.getField<float>("ydpi");
   xDpi = displayMetrics.getField<float>("xdpi");
   QAndroidJniEnvironment env;
   if (env->ExceptionCheck()) {
       // Handle exception here.
       env->ExceptionClear();
   }
#endif

// Add it as a context property (see main.qml)
engine.rootContext()->setContextProperty("densityData", density);

В вашем main.qml добавьте Component.onCompleted что-то вроде этого:

    Units.pixelDensity = Qt.binding(function() {
        if (Qt.platform.os === "android") {
            return densityData / 25.4; // densityData is per inch but we need per mm
        }
        return Screen.pixelDensity
    });

    function calculateDiagonal() {
        if (Qt.platform.os === "android") {
            return Math.sqrt(Math.pow(Screen.width, 2) +
                             Math.pow(Screen.height, 2)) / densityData;
        }
        return Math.sqrt(Math.pow(Screen.width, 2) +
                         Math.pow(Screen.height, 2)) / (Screen.pixelDensity * 25.4);
    }

    Units.multiplier = Qt.binding(function() {
        var diagonal = calculateDiagonal();
        Device.diagonal = diagonal;
        var baseMultiplier = 1;
        if (diagonal >= 3.5 && diagonal < 5.1) { //iPhone 1st generation to phablet
            return 0.8;
        } else if (diagonal >= 5.1 && diagonal < 6.5) {
            return 1;
        } else if (diagonal >= 6.5 && diagonal < 15.1) {
            return baseMultiplier;
        } else if (diagonal >= 15.1 && diagonal < 29) {
            return 1.4 * baseMultiplier;
        } else if (diagonal >= 29 && diagonal < 92) {
            return 1.4 * baseMultiplier;
        } else {
            return 1.4 * baseMultiplier;
        }
    });

Используйте для каждого значения пикселя:

Rectangle {
 height: Units.dp(50)
 width: Units.dp(30)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...