2016-05-07 51 views
6

İstemcinin özel bir yazı tipi sağladığını belirten bir uygulama yazıyorum. Yazı tipi, düzenli, kalın, italik ve kalın-italik olmak üzere dört ayrı otf dosya olarak gelir.Tek bir sınıfta birden çok FontLoader nesnesi nasıl bulunur?

FontLoader { id: clientFontRegular; source: "qrc:/client/fonts/Font-Regular.otf" } 

ve sonra ben şöyle sayfamda herhangi kontrolü için kullanabilirsiniz: Benim sınıfta sadece bu dört yazı tiplerinden birini kullanmak isterseniz, ben FontLoader gibi pek oluşturmak

font.family: clientFontRegular.name 

Sorunum, sayfamda birden çok denetime sahip olduğumu ve bazıları için biraz, kalın, bazıları için italik vb. Kullanmak istiyorum. Bunu yapmak için diğer yazı tipleri için de FontLoader nesnesi ekledim :

FontLoader { id: clientFontBold; source: "qrc:/client/fonts/Font-Bold.otf" } 
FontLoader { id: clientFontItalic; source: "qrc:/client/fonts/Font-Italic.otf" } 
FontLoader { id: clientFontBoldItalic; source: "qrc:/client/fonts/Font-BoldItalic.otf" } 

Ancak bu doğru çalışmıyor. Tüm dört kimlikleri (clientFontRegular, clientFontBold, clientFontItalic ve clientFontBoldItalic), sayfanın herhangi bir yerinde kullanılabilir (örneğin, sistem yazı tipini kullanarak çökme veya sonlandırma olmadan), ancak kalın yazı tipinin ne olduğu önemli olmaksızın kullanılan yazı tipi.

Tüm otf dosyalarının hepsinin geçerli olduğunu biliyorum, çünkü bir dosya için FontLoader'ın tümünü yorumluyor ve yalnızca bunu kullanırsam, özel yazı tipi doğru şekilde oluşturuluyor. Tek bir sınıfta birden fazla FontLoader tanımlamaya çalışmakla ilgili bir sorun var gibi görünüyor (tek bir özel fonttan daha fazla çevrimiçi kullanım gördüğüm FontLoader örneklerinden hiçbiri).

Bunu nasıl yapacağını bilen var mı?

+0

Sorunu gösteren en az kendi kendine yeten işlevsel örnek kod sağlama alışkanlığına girin. Aksi halde neyin yanlış gittiğini nasıl anlarız? – dtech

cevap

6

Ayrıca, aynı sorunla uğraştım ve neden dokümanlar arasında hiçbir şey olmadığını merak ettim.

Birincisi, bir FontLoader eleman her yazı stili için kullanılır, (örneğin Label.qml için) özel bir Text eleman tanımlı böyle:

import QtQuick 2.5 

Text { 
    FontLoader { id: loader; source: "fonts/Blogger_Sans.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Italic.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Light.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Medium.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Bold.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Light_Italic.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Medium_Italic.otf"; } 
    FontLoader { source: "fonts/Blogger_Sans-Bold_Italic.otf"; } 

    font.family: loader.name; 
} 

Ben o çalışma var nasıl budur "Hile", Text öğesinin font.family özelliğinin dinamik olarak yeniden atanmamasıdır. Ve bu zaten yazı stilini kontrol etmek yeterlidir:

Column { 
    anchors.centerIn: parent; 

    MyLib.Label { 
     text: "Blogger_Sans" 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Italic" 
     font.italic: true; 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Light" 
     font.weight: Font.Light; 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Medium" 
     font.weight: Font.Medium; 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Bold" 
     font.weight: Font.Bold; 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Light_Italic" 
     font.weight: Font.Light; 
     font.italic: true; 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Medium_Italic" 
     font.weight: Font.Medium; 
     font.italic: true; 
    } 

    MyLib.Label { 
     text: "Blogger_Sans-Bold_Italic" 
     font.weight: Font.Bold; 
     font.italic: true; 
    } 
} 

Sadece varsayıyorum, ancak yazı tipleri (anonim FontLoader s tarafından bu durumda gibi) yüklenir kez onlar ezberlemiş ve ne zaman otomatik olarak kullanılabilir hale gözükmektesiniz mevcut yazı tipi özelliklerini kullanarak bunları belirtmek. Ama sadece tahmin ediyor.

QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Bold_Italic.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Medium_Italic.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Light_Italic.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Italic.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Bold.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Medium.otf"); 
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Light.otf"); 

Şimdi yazı ve ilgili stilleri QML mevcuttur

:

Düzenleme

olarak QFontDatabase::addApplicationFont kullanarak, bu C++ doğrudan özel yazı tipleri yüklemek mümkündür peppe tarafından Açıklamalarda belirttiği

Text { 
    font.family: "Blogger Sans" // note the use of the font family name 
    text: "MyText" 
    font.bold: true 
    font.italic: true 
} 

C++ yaklaşımı yalnızca daha temiz görünüyor ve ayrıca ano olan dosya yollarını kullanmadan yazı tiplerini belirlemenize izin verir. büyük avantaj.

+0

Fantastik, çok teşekkür ederim! Bunu anlamanın acı verici bir süreç olduğunu hayal edebiliyorum. – MusiGenesis

+6

Yazı tiplerine ada göre başvuruyorsanız, QFontDatabase'i kullanarak C++'da da TTF'leri kaydettirebilir misiniz? – peppe

+0

@peppe aslında gerçekten iyi bir nokta! Sadece test ettim ve işe yaradı, ipucu için teşekkürler! – qCring