qtd 发表于 2019-11-1 14:01:17

如何在qml中,设置一种全局字体,让所有控件都用这个字体


jiajia_deng 发表于 2019-11-1 14:01:18

这里分享一下另外一种 Qt 官方推荐的解决方案:
1、mian 函数中设置全局样式
QQuickStyle::setStyle("Material");
2、创建一个名为 qtquickcontrols2.conf 的配置文件,将配置文件加入到 qrc 资源文件的根目录 / 下。内容如下:

Primary=#337EFF
Accent=#337EFF
Theme=System
Background=#FFFFFF
Font\Family=Microsoft YaHei UI
Font\PixelSize=14
通过以上配置文件设置默认字体和默认字体样式。更多资料请参考 Qt 官方文档:doc.qt.io/qt-5/qtquickcontrols2-configuration.html

jiajia_deng 发表于 2019-11-1 16:11:01

实现一个自定义的 Text 组件,里面把默认格式都设置好,要用到的位置使用自己的自定义组件就可以了。比如名为 StyledText.qml 的文件,里面内容:

import QtQuick 2.0

Text {
    color: "#333333"
    font.family: "Microsoft YaHei Light"
    font.pixelSize: 14
    textFormat: Text.PlainText
}

要用到时

StyledText {
    text: qsTr("Styled text")
    font.pixelSize: 14
    color: "#FFFFFF"
}

qtd 发表于 2019-11-2 09:26:13

jiajia_deng 发表于 2019-11-1 16:11
实现一个自定义的 Text 组件,里面把默认格式都设置好,要用到的位置使用自己的自定义组件就可以了。比如名 ...

Button {
                              id: control
                              text: qsTr("登 录")
                              font.wordSpacing: -0.2
                              font.pointSize: 20
                              implicitWidth: 220
                              implicitHeight: 70
                              anchors.top:text2.bottom
                              anchors.topMargin: 20

                              contentItem: StyledText {
                                    text: control.text
                                    font: control.font
                                    opacity: enabled ? 1.0 : 0.3
                                    horizontalAlignment: Text.AlignHCenter
                                    verticalAlignment: Text.AlignVCenter
                                    elide: Text.ElideRight
                                    color: control.down|| control.hovered ? "#ffffff" : "#ffffff"
                              }

                              background: Rectangle {
                                    implicitWidth: 130
                                    implicitHeight: 30
                                    opacity: enabled ? 1 : 0.3
                                    color: control.down|| control.hovered ? "#1ee781" : "#11d45e"
                                    radius: 30

                              }
                            }

为什么 “StyledText” 应用到按钮控件中,字体族就不是"Microsoft YaHei Light" 这个了呢?

jiajia_deng 发表于 2019-11-5 14:38:50

像 StyledText 一样实现一个 StyledButton

Sehin_春子 发表于 2019-11-6 15:58:28

本帖最后由 Sehin_春子 于 2019-11-6 16:01 编辑

在放图片的目录新建.qss文件:在本地新建mqss.txt(名字随你起),改变成后缀名为.qss。在qt添加现有文件,把mqss.qss添加进去,双击打开。写样式。
button类:
/*设置所有按钮统一样式*/
QPushButton{
background-color:blue;/* 设置为蓝色背景,这里结束要有分号*/
}
QPushButton:pressed{
background-color:red;/*被按下时设置为红色背景。结束要有分号*/
}
/*如果你大部分按钮需要同一个样式,只有个别按钮需要特殊,可以用#设置某个名称的样式 ____比如我有个按钮对象名称是MyBtn,可以这样:*/
QPushButton#Mybtn{
background-color:white;   /* 只有MyBtn设置为白色背景,这里结束要有分号*/
}
QPushButton#Mybtn:pressed{
background-color:blue;/* 只有MyBtn被按下是蓝色背景,这里结束要有分号*/
}
/*其他也一样,需要写他的类名加个{},样式在{}里写。跟setStylesheet一样的.**重点是要在mainwindow.cpp添加qss文件读取的代码,以后设置样式就可以在qssl里设置而不需要每个按钮都加代码也不用给每个控件在设计师里添加***/
QFile file(":/Qss/resource/mqss.qss");//这是我的路径,你要写你的
      file.open(QFile::ReadOnly);
      // 读取文件全部内容,使用tr()函数将其转换为QString类型
      QString styleSheet = tr(file.readAll());
      // 为QApplication设置样式表
      qApp->setStyleSheet(styleSheet);
如果qss文件加载路径正确,样式表QPushButton大小写或者单词写错不会报错,只不过你的控件不会有样式显示,如果qss读取不成功,可以百度。

lsyzsl 发表于 2019-11-7 16:40:01


bool loadGlobalFonts(int fontSize , QGuiApplication *app)
{

    //将字体文件名传给addApplicationFont,得到字体的Id
    int fontId = QFontDatabase::addApplicationFont(APP_FONT_DIR);
    qDebug()<<"fontId = "<<fontId;
    if(fontId<0)
      return false;
    //将字体Id传给applicationFontFamilies,得到一个QStringList,其中的第一个元素为新添加字体的family
    QString msyh = QFontDatabase::applicationFontFamilies (fontId).at(0);
    qDebug()<<"my font = "<<msyh<<"font size:"<<fontSize;
    QFont font(msyh,fontSize);
    //将此字体设为QApplication的默认字体
    app->setFont(font);
    return true;

}
在main函数里调用这个函数。字体路径自己修改。

jiajia_deng 发表于 2020-12-21 14:34:36

qtd 发表于 2019-11-2 09:26
**** 作者被禁止或删除 内容自动屏蔽 ****

Text 是 Qt Quick Controls 1 的控件,不受 Qt Quick Controls 2 的样式控制,你应该把 Text 更换为 Label
页: [1]
查看完整版本: 如何在qml中,设置一种全局字体,让所有控件都用这个字体