2016-05-07 34 views
6

Sto scrivendo un'app per la quale il client ha fornito un carattere personalizzato. Il font si presenta come quattro file separati otf, uno per regolare, grassetto, corsivo e grassetto-corsivo. Se voglio usare solo uno di questi quattro tipi di carattere nella mia classe, creo il FontLoader in questo modo:Come avere più oggetti FontLoader in una classe?

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

e poi posso usarlo per qualsiasi controllo sulla mia pagina in questo modo:

font.family: clientFontRegular.name 

Il mio problema è che ho più controlli sulla mia pagina, e voglio usare regolarmente alcuni, grassetto per alcuni, corsivo per altri, ecc. Per fare ciò ho aggiunto anche gli oggetti FontLoader per gli altri tipi di caratteri, come ad esempio :

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

Ma questo non funziona correttamente. Tutti e quattro gli id ​​(clientFontRegular, clientFontBold, clientFontItalic e clientFontBoldItalic) possono essere utilizzati in qualsiasi punto della pagina (vale a dire senza andare in crash o finire con il carattere di sistema), ma il carattere utilizzato non importa quale sia il carattere in grassetto.

So che tutti e quattro i miei file otf sono validi, perché se commento tutto tranne il FontLoader per un file e ne utilizzo solo uno, il font personalizzato viene reso correttamente. Sembra proprio che ci sia un problema nel tentativo di definire più FontLoaders in una classe (nessuno degli esempi di FontLoader che ho visto in linea usa più di un singolo font personalizzato).

Qualcuno sa come fare?

+0

Prendere l'abitudine di fornire un codice di esempio funzionale autonomo e minimo che illustri il problema. Altrimenti come facciamo a sapere cosa non va? – dtech

risposta

6

Ho anche lottato con lo stesso problema e mi sono chiesto perché non ci fosse nulla nei documenti. Questo è quanto ho capito di lavoro:

In primo luogo, ho definito un elemento personalizzato Text (ad esempio Label.qml), in cui un elemento FontLoader viene utilizzato per ogni singolo stile del carattere, in questo modo:

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

Il "trucco" è quello di non riassegnare dinamicamente la proprietà dell'elemento font.family. E questo è già sufficiente a controllare lo stile del carattere:

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

Sto solo presupposto, ma sembra che una volta che i caratteri vengono caricati (come in questo caso da anonimi FontLoader s), sono memorizzati e resi disponibili automaticamente quando specificandoli usando le proprietà dei font disponibili. Ma è solo una supposizione.

Modifica

Come sottolineato nei commenti da peppe, è anche possibile caricare font personalizzati direttamente in C++ utilizzando QFontDatabase::addApplicationFont:

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

Ora il tipo di carattere e stili correlati sono disponibili in QML:

L'approccio C++ sembra solo più pulito e consente anche di specificare i caratteri senza utilizzare i percorsi di file che è ano un grande vantaggio.

+0

Fantastico, grazie mille! Posso immaginare che capire questo è stato un processo doloroso. – MusiGenesis

+6

Se si fa riferimento ai caratteri in base al nome, è possibile anche registrare i TTF in C++ utilizzando QFontDatabase? – peppe

+0

@peppe è davvero un buon punto! L'ho appena testato e funziona, grazie per il suggerimento! – qCring