2012-01-05 94 views
9

我有一個通過QML文件指定的小部件。此小部件包含頂級Rectangle,其中包含兩個Columns。這些Columns中的每一個都包含許多Text元素。此QML小部件以C++包裝在QDeclarativeView的子類中。指定Qt中許多文本元素的字體QML

我想爲這些Text -elements中的每一個指定字體。今天,我做到這一點通過指定頂級屬性:

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

每個Text -elements綁定到這些屬性:

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

這是不是很優雅,需要每次添加新的領域我需要支持新的東西(例如帶下劃線的字體)。我無法聲明font類型的屬性,並將其綁定到此處(小部件爲空,qmlviewer會警告「屬性之後的預期類型」)。

是否有更好的方法來指定所有Text -elements的字體?

注意!我手寫QML文件。

回答

11

另一種可能性是寫入新的QML組件,在默認情況下從Text繼承一個集合的一些特性:

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

一個可能的解決方案是編寫一個函數,該函數遍歷傳入元素的children(例如Column)。在這個函數的所有屬性進行設置:

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

每個元素,包含設置爲true屬性useStyle,被風格。這比手動分配樣式要短,但您仍然可以定義哪些元素應該被樣式化。

5

在Qt 5.6(至少也許更早),你可以使用Qt.font()動態分配字體對象並在其他地方引用它。所以,這個工程:在這裏Qt.font()

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

Text 
{ 
    color: fontcolor 
    font: parent.myFont 
} 

更多信息:https://doc-snapshots.qt.io/qt5-5.6/qml-qtqml-qt.html#font-method

+0

您也可以從C++暴露出QFont和QML使用它。 – 2017-02-08 09:57:18