QML跨平台设计的问题:文本大小

时间:2014-04-04 01:31:19

标签: qt fonts cross-platform qml

我在使用不同的操作系统(尝试过Windows 7和Ubuntu 13.10)时遇到了不同的字体宽度和高度问题。我尝试设置pixelSize和pointSize,两种结果在Arial和Courier字体文本中都有不同的大小(Windows字体通常更大)。

以下是一个例子:

Rectangle {
    width: 312
    height: 44

    Text {
        id: text_1
        text: qsTr("1234567890123456789012345678901234567890")
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right

        font.family: "Courier"
        font.pointSize: 10
    }
    Text {
        id: text_2
        text: qsTr("123456789012345678901234567890")
        anchors.top: text_1.bottom
        anchors.left: parent.left
        anchors.right: parent.right

        font.family: "Courier"
        font.pointSize: 10
    }
    Text {
        id: text_3
        text: qsTr("12345678901234567890123456789012345")
        anchors.top: text_2.bottom
        anchors.left: parent.left
        anchors.right: parent.right

        font.family: "Courier"
        font.pointSize: 10
    }
}

这个矩形的宽度和高度是通过反复试验来定义的,以适应Ubuntu中的3个文本。请参见下面的屏幕截图:

Ubuntu SS WindowsSS

在我的应用程序中,我想要一个文本对象(使用Courier字体)来填充它的父级宽度(文本是固定的)。在另一个矩形中,我想要文本对象(不止一个,像上面的例子一样锚定,使用Arial字体)来填充父级的高度。

目前,我正在寻找一种方法来动态设置父级的宽度和高度,根据固定的文本内容计算,但我不能动摇这种感觉,这是一种更简单的方法。

任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:3)

在这种情况下选择一个父高度/宽度是个坏主意 - 正如你所看到的,它不可移植;如果你以后决定更改字体怎么办?你想重新计算一切吗?这是您想要委托给QML的东西。

我建议使用Layouts,如下所示:

import QtQuick.Layouts 1.1 // Necessary to use ColumnLayout

ColumnLayout {   // A Single Column
    Text {
        id: text_1
        text: qsTr("1234567890123456789012345678901234567890")

        // No need for anchoring ! You may want to use Layout.fillWidth: true in some cases

        font.family: "Courier"
        font.pointSize: 10
    }
    Text {
        id: text_2
        text: qsTr("123456789012345678901234567890")

        font.family: "Courier"
        font.pointSize: 10
    }
    Text {
        id: text_3
        text: qsTr("12345678901234567890123456789012345")

        font.family: "Courier"
        font.pointSize: 10
    }
}