2016-10-10 18 views
0

qmlで透明なテキストを作成しようとしています。背景上の透明なボタンのテキスト

ApplicationWindow { 
    visible: true 
    width: 320 
    height:240 
    style: ApplicationWindowStyle { 
      background: Image { // paste any url here 
       source: "https://t4.ftcdn.net/jpg/01/05/18/57/240_F_105185755_w384KDBvemK5Mn4oXzrWbCz9SRvHuDIh.jpg" 
      } 
    } 
    Button 
    { 
     anchors.centerIn: parent 
     style: ButtonStyle 
     { 
      padding 
      { 
       left: 16 
       right: 16 
       top: 8 
       bottom: 8 
      } 

      background: 
       Rectangle 
       { 
        antialiasing: true 
        color: control.pressed ? "#d1d1d1" : control.hovered ? "#666" : "transparent" 
        border.color: "white" 
        radius: height/2 
        border.width: 1 
       } 

      label: 
       Text 
       { 
        text: "buttonText" 
        color: control.pressed ? "white" : control.hovered ? "#00000000" : "white" 
       } 
      } 
     } 
    } 

私が欲しいのは、ホバー状態にあるボタンで透明テキストを持つことです。 私はカスタマイズされたボタンがあります。テキストの背景色が必要です。例:Example

upd私は遅いPC上でシェーダなしで動作する必要があります。

+2

Can [this post](http://stackoverflow.com/questions/39903639/how-to-apply-opacity-mask-to-a-qml-item)お手伝いしますか? – user2436719

+0

@ user2436719古い内蔵ビデオカードを搭載した低速PCで動作するにはこの例が必要で、プログラムにはたくさんのボタンがあります。シェイダーなしでそれを行う能力はありますか? – Pillar

+2

@Pillar - OpenGLのすべてがすでにシェーダを使用しています。シェーダそのものは簡単ではなく、平らな色合いよりもやや遅いです。そして、いいえ、シェーダを使わずにOpenGLで何もできません。 QMLはOpenGLを使用します。どちらか一方の方法では、シェーダを使用することになります。 – dtech

答えて

1

1つのオプションは、カスタムQQuickPaintedItemを使用し、QPainterPathを使用して「テキストの形の穴」を描くことです。 QFontMetrics::boundingRect()が助けるべきであるものの、基本的にこの

void MyItem::paint(QPainter *painter) 
{ 
    QPainterPath path; 
    path.addRect(0, 0, width(), height()); 
    path.addText(textX, textY, font, yourText); 

    painter->setBrush(yourBackgroundColor); 
    painter->setPen(Qt::transparent); 
    painter->drawPath(path); 
} 

位置、すなわちtextXtextYなどの

は、私は怖い手動で計算しなければならないであろう。