2012-01-05 15 views
9

QMLファイルで指定したウィジェットがあります。このウィジェットは、Rectangleのトップレベルを含み、2つのColumnsを含んでいます。これらのそれぞれには、多くのText要素が含まれています。このQMLウィジェットは、C++のQDeclarativeViewのサブクラスにラップされています。Qtの多くのテキスト要素のフォントを指定するQML

これらのText要素のフォントを指定します。今日は、トップレベルのプロパティを指定することで、次の操作を行います。

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要素に対してフォントを指定するより良い方法はありますか?

注!私はQMLファイルを手書きしています。

答えて

11

別の可能性は、デフォルトでTextからセットいくつかのプロパティを継承する新しいQML成分を書き込むことである。

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

可能な解決策の1つは、渡された要素のchildren(たとえば、Column)を反復処理する関数を書くことです。この機能では、すべてのプロパティを設定することができます。trueに設定されているプロパティuseStyleが含まれている各要素、

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

、スタイルを取得します。これは、スタイルを手動で割り当てるよりも短くなりますが、スタイルを設定するかどうかを定義することはできます。

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でそれを使用することができます。 –

関連する問題