2016-05-27 47 views
1

在QML中,我希望能夠定義一組用於簡單語義重用的字體屬性。例如,而不是:QML中的可重用字體屬性

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" } 

然而,這並不時,我想用相同的字體設置爲Label或其他地方,一個font是工作需要。

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

// 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 
    } 
} 

雖然這確實單一來源的值,它是,如圖所示,痛苦冗長。


我想這...

Font { 
    id: header 
    family: 'Encode Sans' 
    weight: Font.Black 
    italic: false 
    pointSize: 24 
} 

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

...但它的錯誤 「元素是不可創建」 關於Font {線。

+0

大多數不平凡的QML難題讓我問Qt的支持。 – AlexanderVX

+0

http://stackoverflow.com/questions/36848185/is-there-any-way-to-set-a-property-attribute-for-some-all-sub-items/36848272#36848272 http:// stackoverflow .com/questions/36806326/how-to-create-a-custom-grouping-properties-and-apply-them-to-different-contro/36810566 – dtech

+0

@ddriver謝謝。我在我的問題中提到了這個選項(它在中間),並且正在尋找更好的答案,它適用於多種不同的類型。 – Phrogz

回答

5

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 
} 
0

嗯,這真的不是很明顯的話題。我會把它作爲一個答案,但它可能不是直接回答你的問題,但我希望它可能是一個幫助..

.pragma是直到你沒有使用qtquickcompiler 使用QT> 5.6,.pragma庫在Qt 5.5中被破壞,然後使用qtquickcompiler,所以它不是我們的案例的解決方案。

我們與QML字體打了好幾個月,試圖在我們的應用程序中獲得一個合適的,看起來很好看的字體,實際上目標是獲得一個QML應用程序,其字體與OS中的其他字體完全一樣我正在談論WinXX)..所以QML應用程序中的Arial字體在任何Windows應用程序中都與Arial完全相同。

首先,我們必須從QTRenderer切換到本機,因爲FreeType渲染器在WinXX平臺上看起來更糟糕,然後是本機字體,至少這是讓應用程序看起來更接近本地字體的一種方式。實際上從這個角度看字符在操作系統中的字符相同,但..

然後,我們遇到了很多問題之間的字符(特別是在非英文字母),字距等等等之間的錯誤間距。

其他問題是,您不能更改QML中的許多QFont屬性,但是它們可用,然後您從C++導出對象返回預構建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; 
} 

您可以將任何緩存英尺,所以你將不得不名稱的子集,不管你能想到合適的。這工作得很好,具有適當的本地渲染,並且它是在QML應用程序中的WinXX上獲得像素相同的外觀字體的唯一方式。因此,我對一個答案(來自我的經驗)的看法是處理QFont如果你想對事物的外觀進行適當的微調,而不是試圖在QML代碼中使用它,那麼你可以在C++中使用對象。

+0

FWIW,請參閱我接受的答案,它顯示瞭如何使用'Qt.font()'方法直接在QML中創建'font'值。 – Phrogz

+0

問題是QFont本身有更多的微調選項,比如字距控制,這些都不是通過QML版本提供的。我的意思是隻要你不必排序這個問題,你的方法肯定是更清潔的,因爲它是本地QML,但是我的方法是更好地解決一些渲染錯誤。 – evilruff