【问题标题】:Font Chage in QML UIQML UI 中的字体更改
【发布时间】:2020-09-23 08:51:09
【问题描述】:

我在 Qt/QML 中开发了一个 android 应用程序,它运行良好。 但是,当我更改我的 Android 手机设置 例如。显示字体->小到中或中到大。 它未应用在我的应用程序中,应用程序没有变化。 如何在我的应用程序中实现此更改。 提前致谢。

示例:- 如果我更改 android 手机显示设置的字体大小,那么它会自动更改每个应用程序 eq.whatsapp、facebook 等的字体大小。 但就我而言,我在 Qt/QML 中开发了一个 android 应用程序,它不会在显示字体大小方面发生变化。

【问题讨论】:

  • 请添加更多内容,例如显示一段您使用字体并设置大小的代码,这样您的问题可能会被否决/删除
  • @Amfasis 我已经更新了我的问题,因为这段代码有整个应用程序(不能上传),这意味着应用程序的每个 UI 都应该改变它(显示设置)。跨度>
  • 试试这个thread的解决方案
  • 我猜唯一的方法是使用Android API,然后使用Jni调用C++/QML。阅读如何Handle configuration changes。在您的情况下,您必须关注fontScale。也检查QAndroidJniObject。查看this 文章以获取代码示例。
  • @RamkumarR,我已经通过线程,没有任何出路。谢谢你的建议。

标签: android qt qml settings


【解决方案1】:

您必须手动执行此操作并使用 C++ 和 JNI。

#include <QtAndroidExtras>

然后获取Java QtActivity 类。

QAndroidJniObject qtActivity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");

获取资源:

QAndroidJniObject resources = qtActivity.callObjectMethod("getResources","()Landroid/content/res/Resources;");

获取配置对象并读取字体比例。

QAndroidJniObject configuration = resources.callObjectMethod("getConfiguration","()Landroid/content/res/Configuration;");
float scale = configuration.getField<float>("fontScale");

然后用比例变量设置一个 QMLEngine 上下文变量:

engine.rootContext()->setContextProperty("fontScale", scale);

【讨论】:

  • 谢谢..,我会这样用的。
【解决方案2】:

@Hubi 嗨,我在我的 qt/qml 应用程序中尝试了这段代码。 当我使用这个解决方案时,它工作得很好,但问题是当我默认启动应用程序时,它会占用资源字体大小并将该值设置为我的 UI 我尝试过的代码如下所述。

#include "addnewguestclass.h"

AddNewGuestClass::AddNewGuestClass()
{

    QQmlApplicationEngine *m_View;
    m_View = new QQmlApplicationEngine();
    m_View->load(QUrl(QStringLiteral("qrc:test.qml")));
    //m_View->rootContext()->setContextProperty("AddNewGuest",this);
    //QObject *root = m_View->rootObjects().value(0);

    QAndroidJniObject qtActivity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");

    QAndroidJniObject resources = qtActivity.callObjectMethod("getResources","()Landroid/content/res/Resources;");

    QAndroidJniObject configuration = resources.callObjectMethod("getConfiguration","()Landroid/content/res/Configuration;");
    float scale = configuration.getField<float>("fontScale");
    qDebug()<<"Scale: "<< scale;

    m_View->rootContext()->setContextProperty("fontScale", scale);
}

ma​​in.qml

property real dp: screen.pixelDensity * 10 * 2.54 / 160
       Item {
           width: 50*dp
           height: 50*dp
           anchors.centerIn: parent

           Label {
               text: qsTr("Hi, I am Hemant")
               //font.pixelSize: 16*dp
               font.pixelSize: Qt.application.font.pixelSize

           }
       }

【讨论】:

  • 请更新您的初始帖子!不要回答自己的帖子。 P.S:标签中的 font.pixelSize 应该是“fontScale”。 (=> font.pixelSize: fontScale)
  • Ok Hubi..,我已经应用了这个,但是没有任何变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多