2012-01-05 9 views
9

Ho un widget specificato tramite un file QML. Questo widget contiene un livello superiore Rectangle che contiene due Columns. Ognuno di questi Columns contiene molti elementi-Text. Questo widget QML è racchiuso in una sottoclasse di QDeclarativeView in C++.Specifica del carattere per molti elementi di testo in Qt QML

Desidero specificare il carattere per ciascuno di questi elementi-Text. Oggi faccio questo specificando le proprietà di alto livello:

property string fontfamily: "Arial" 
property bool fontbold: false 
property bool fontitalic: false 
property int fontpixelsize: 11 
property string fontcolor: "White" 

e legare ogni Text -Elementi a queste proprietà:

Text 
{ 
    color: fontcolor 
    font.family: fontfamily 
    font.bold: fontbold 
    font.italic: fontitalic 
    font.pixelSize: fontpixelsize 
    ... 
} 

Questo non è molto elegante e nuovi campi deve essere aggiunto ogni volta Ho bisogno di supporto per qualcosa di nuovo (es. Caratteri sottolineati). Non sono stato in grado di dichiarare una proprietà di tipo font e associarlo a questo (il widget è vuoto e qmlviewer avverte su "tipo previsto dopo la proprietà").

C'è un modo migliore per specificare un carattere per tutti gli elementi-Text?

Nota! Sto scrivendo a mano i file QML.

risposta

11

Un'altra possibilità è quella di scrivere un nuovo componente QML, che eredita dalla Text un set di alcune proprietà di default:

StyledText.qml

import QtQuick 1.0 

Text { 
    // set default values 
    color: "blue" 
    font.family: "Arial" 
    font.bold: true 
    font.italic: true 
    font.pixelSize: 12 
} 

main.qml

import QtQuick 1.0 

Rectangle { 
    Row { 
     spacing: 10 

     Column { 
      StyledText { 
       text: "Foo1" 
      } 
      StyledText { 
       text: "Bar1" 
      } 
      StyledText { 
       text: "Baz1" 
      } 
     } 

     Column { 
      StyledText { 
       text: "Foo2" 
      } 
      StyledText { 
       text: "Bar2" 
      } 
      StyledText { 
       text: "Baz2" 
      } 
     } 
    } 
} 
2

Una possibile soluzione è scrivere una funzione che itera su children di un elemento passato (ad esempio uno Column). In questa funzione tutte le proprietà possono essere impostate:

import QtQuick 1.0 

    Rectangle { 
    Row { 
     spacing: 10 

     Column { 
      id: col1 

      Text { 
       property bool useStyle: true 
       text: "Foo1" 
      } 
      Text { 
       property bool useStyle: true 
       text: "Bar1" 
      } 
      Text { 
       property bool useStyle: true 
       text: "Baz1" 
      } 
     } 

     Column { 
      id: col2 

      Text { 
       property bool useStyle: true 
       text: "Foo2" 
      } 
      Text { 
       text: "not styled" 
      } 
      Text { 
       property bool useStyle: true 
       text: "Baz2" 
      } 
     } 
    } 

    function setTextStyle(parentElement) { 
     for (var i = 0; i < parentElement.children.length; ++i) { 
      console.log("t", typeof parentElement.children[i]); 
      if (parentElement.children[i].useStyle) { // apply style? 
       parentElement.children[i].color = "blue"; 
       parentElement.children[i].font.family = "Arial" 
       parentElement.children[i].font.bold = true; 
       parentElement.children[i].font.italic = true; 
       parentElement.children[i].font.pixelSize = 12; 
      } 
     } 
    } 

    // set style 
    Component.onCompleted: { 
     setTextStyle(col1); 
     setTextStyle(col2); 
    } 
} 

Ogni elemento, che contiene la proprietà useStyle impostata a true, viene designato. Questo è più breve, che assegnare lo stile manualmente, ma è ancora possibile definire quali elementi devono essere stilizzati o meno.

5

In Qt 5.6 (almeno, probabilmente anche prima), è possibile utilizzare Qt.font() per allocare dinamicamente un oggetto carattere e fare riferimento ad esso altrove. Quindi, questo funziona:

property font myFont: Qt.font({ 
    family: fontfamily, 
    bold: fontbold, 
    italic: fontitalic, 
    pixelSize: fontpixelsize 
}); 

Text 
{ 
    color: fontcolor 
    font: parent.myFont 
} 

Maggiori informazioni Qt.font() qui: https://doc-snapshots.qt.io/qt5-5.6/qml-qtqml-qt.html#font-method

+0

Si può anche esporre una QFont da C++ e utilizzarlo in QML. –

Problemi correlati