2016-05-07 20 views
6

Ich schreibe eine App, für die der Client eine benutzerdefinierte Schriftart bereitgestellt hat. Die Schriftart kommt als vier separate otf Dateien, eine für normal, fett, kursiv und fett-kursiv. Wenn ich nur eine dieser vier Schriftarten in meiner Klasse verwenden möchten, schaffe ich das FontLoader wie so:Wie haben Sie mehrere FontLoader-Objekte in einer Klasse?

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

und dann kann ich es wie so für jede Kontrolle auf meiner Seite verwenden:

font.family: clientFontRegular.name 

Mein Problem ist, dass ich mehrere Steuerelemente auf meiner Seite habe, und ich regelmäßig für einige, fett für einige, kursiv für einige andere usw. verwenden möchte. Dazu habe ich FontLoader Objekte für die anderen Schriftarten hinzugefügt, so :

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

Aber das funktioniert nicht richtig. Alle vier IDs (clientFontRegular, clientFontBold, clientFontItalic und clientFontBoldItalic) können überall auf der Seite verwendet werden (d. H. Ohne Absturz oder Ende mit der Systemschriftart), aber die verwendete Schriftart ist unabhängig von der fettgedruckten Schriftart.

Ich weiß, dass alle vier meiner otf Dateien gültig sind, denn wenn ich alle außer dem FontLoader für eine Datei auskommentiere und nur diesen benutze, wird die benutzerdefinierte Schriftart korrekt gerendert. Es scheint nur ein Problem mit dem Versuch zu sein, mehrere FontLoader in einer Klasse zu definieren (keines der FontLoader-Beispiele, die ich online gesehen habe, verwendet mehr als eine einzige benutzerdefinierte Schriftart).

Weiß jemand, wie man das macht?

+0

Gewöhnen Sie sich an die Bereitstellung von minimalen in sich geschlossenen funktionalen Beispielcode, der das Problem veranschaulicht. Wie können wir sonst wissen, was schief läuft? – dtech

Antwort

6

Ich kämpfte auch mit dem gleichen Problem herum und fragte mich, warum es nichts in den Dokumenten gibt. Dies ist, wie ich es bekam Arbeit:

Zuerst habe ich definiert eine benutzerdefinierte Text Element (zum Beispiel Label.qml), wo ein FontLoader Element für jede einzelne Schriftstil verwendet wird, wie folgt aus:

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

Der "Trick" ist, die Text-Eigenschaft font.family-Eigenschaft nicht dynamisch neu zuzuweisen. Und das ist schon genug, um die Schriftart zu steuern:

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

ich nur unter der Annahme bin, aber es sieht aus wie einmal Schriftarten geladen werden (wie in diesem Fall durch anonyme FontLoader s), sie gespeichert werden und werden automatisch zur Verfügung, wenn Sie werden mit den verfügbaren Schrifteigenschaften angegeben. Aber es ist nur raten.

bearbeiten

Wie bereits von peppe in den Kommentaren aus, es ist auch möglich, benutzerdefinierte Schriftarten direkt in C zu laden ++ QFontDatabase::addApplicationFont mit:

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"); 

Nun ist die Schriftart und verwandte Arten in QML verfügbar sind:

Der C++ Ansatz scheint nur sauberer und ermöglicht Ihnen auch, Schriftarten ohne Verwendung von Dateipfaden anzugeben, die ano ist Das ist ein großer Vorteil.

+0

Fantastisch, vielen Dank! Ich kann mir vorstellen, dass dies ein schmerzhafter Prozess war. – MusiGenesis

+6

Wenn Sie Schriftarten nach Namen referenzieren, können Sie die TTFs auch in C++ mit QFontDatabase registrieren? – peppe

+0

@peppe das ist eigentlich ein wirklich guter Punkt! Ich habe es gerade getestet und es funktioniert, danke für den Hinweis! – qCring

Verwandte Themen