QML中可重用的字体属性

时间:2016-05-27 15:40:51

标签: qt qml

在QML中,我希望能够为简单的语义重用定义一组字体属性。例如,而不是:

from itertools import chain
print(type(doc_set))
print(len(doc_set))

for top in ldamodel.print_topics():
  print(top)
print

# Assinging the topics to the document in corpus
lda_corpus = ldamodel[corpus]
#print(lda_corpus)

# Find the threshold, let's set the threshold to be 1/#clusters,
# To prove that the threshold is sane, we average the sum of all probabilities:
scores = list(chain(*[[score for topic_id,score in topic] \
                     for topic in [doc for doc in lda_corpus]]))
print(sum(scores))
print(len(scores))
threshold = sum(scores)/len(scores)
print(threshold)

cluster1 = [j for i,j in zip(lda_corpus,doc_set) if i[0][1] > threshold]
cluster2 = [j for i,j in zip(lda_corpus,doc_set) if i[1][1] > threshold]
cluster3 = [j for i,j in zip(lda_corpus,doc_set) if i[2][1] > threshold] 

我希望能写下来:

IndexError: list index out of range

如何创建一个我可以分配的Text { text: "This is a header" font { family:'Encode Sans'; weight:Font.Black; italic:false; pointSize:24 } } 值?

我知道我制作了一个组件,例如:

Text {
  text: "This is a header"
  font: headerFont
}

但是,当我想对font或需要# Header.qml Text { font { family:'Encode Sans'; weight:Font.Black; italic:false; pointSize:24 } } # main.qml Header { text:"This is a header" } 的其他地方使用相同的字体设置时,这不起作用。

我也知道我可以使用this question的答案,例如:

Label
font

虽然这确实是单一来源的,但如图所示,它是非常冗长的。

我试过了......

// style.js    
.pragma library
var header = {
  family: 'Encode Sans',
  weight: Font.Black, // is this legal?
  italic: false,
  size:   24
};

...但// main.qml import "style.js" as Style Text { text: "This is a header" font { family: Style.header.family weight: Style.header.weight italic: Style.header.italic pointSize: Style.header.size } } 行错误“元素无法创建”。

2 个答案:

答案 0 :(得分:12)

This answer完全涵盖了我的需求。我可以使用Qt.font()方法创建具有我需要的属性的字体值。包含在具有全局ID的QtObject中,我可以:

### main.qml
QtObject {
    id: theme
    property font headerFont: Qt.font({
        family: 'Encode Sans',
        weight: Font.Black,
        italic: false,
        pointSize: 24
    })
}

### AnyOther.qml
Text {
    text: "This is a header"
    font: theme.headerFont
}

答案 1 :(得分:0)

嗯,这真的不是一个明显的主题..我会把它作为一个答案,但它可能不是你问题的直接答案,尽管我希望它可能是一个帮助.. < / p>

.pragma是一种方法,直到你没有使用qtquickcompiler 使用QT&gt; 5.6,.pragma库在Qt 5.5中被破坏然后使用qtquickcompiler,所以它不是我们案例的解决方案。

我们与QML字体斗争了好几个月,试图在我们的应用程序中获得正确,漂亮的字体,实际目标是让QML应用程序的字体看起来与操作系统中的其他字体完全相同(我是谈论WinXX)..所以QML应用程序中的Arial字体看起来与任何Windows应用程序中的Arial完全相同。

首先我们必须从QTRenderer切换到Native,因为FreeType渲染器在WinXX平台上看起来要差得多,然后是原生字体,至少它是使应用程序看起来更接近原生字体的一种方式。实际上从这一点来看,字符与OS中的字符一样,但是......

然后我们遇到很多问题,字符之间的间距错误(特别是非英文字母),字距等等。

其他问题是您无法在QML中更改许多QFont属性,但是它们可用,然后您从C ++导出的对象返回prebuild QFont对象..

我们最终得到的是遵循C ++代码框架:

QFont GlobalObject::createFont(const QString & family, int pixelSize, bool isBold, bool bKerning) const {
    QFont ft = QFont(family);
    ft.setFamily(family);
    ft.setBold(isBold);
    ft.setPixelSize(pixelSize);
    ft.setKerning(bKerning);

    return ft;
}

您可以为ft应用任何缓存,因此您可以按名称设置子集,无论您认为合适。这非常合适,具有适当的原生渲染,这是在QML应用程序中在WinXX上获得与像素相同的字体的唯一方法

所以我对答案的看法(根据我的经验)是在C ++中处理QFont对象,如果你想对事物的样子进行适当的微调,而不是试图在QML代码中使用它。