2017-01-05 6 views
0

私はいくつかの並べ替えの進行状況バーを実装しようとしています、その前にグリッド。 私はそれに透明な「穴」を持つPNGを持っており、進行状況バーの前のマスクとして使用されます。トランスペアレントPNGイメージを含むQLabelをスーパーインポーズ/オーバーレイする方法は?

QStackedLayoutというラベルを2つ付けて作成しようとしました.1つは単色で塗りつぶされ、もう1つはオーバーレイ用のPNGが含まれます。

QStackedLayout::StackAllは、レイアウト内のすべてのウィジェットを表示できると思っていました。

QStackedLayout *stackedLayout = new QStackedLayout(ui->widget_progressbar); 
stackedLayout->setStackingMode(QStackedLayout::StackAll); 

label_fill = new QLabel(); 
label_fill->setFixedSize(100, 100); // just for testing 
label_fill->setStyleSheet("background-color: #669966"); 
stackedLayout->addWidget(label_fill); 

label_foreground = new QLabel(); 
label_foreground->setStyleSheet("border-image: url(:/img/mask.png) 0 0 0 0 stretch stretch;"); 
stackedLayout->addWidget(label_foreground); 

上記のコードでは、緑色の四角形がマスクを覆って前景にあります。レイアウトの追加を再注文した場合、またはstackedLayout->setCurrentWidget(label_foreground);またはlabel_foreground->raise();を使用した場合、label_fillはまったく表示されません。 PNGの透明な穴には、レイアウトがあるウィジェットの背景色が表示されます。これは親ウィジェットの色を変更することで確認しました。透明な穴に変更された色が見えました。

私は画像が自動的に拡大縮小されるようにスタイルシートにborder-imageを使用します。しかし、background-imageスタイルを使用するか、代わりに単純にlabel_foreground()->setPixmap(...)を使用するだけで、同じ透明性の問題が残ります。

これを行う「正式な」方法は何ですか?

もちろん、私が本当にしなければならないのは、QPixmapを編集することですが、私はサイズ変更イベントを処理する必要があります。私自身のレイアウトマネージャを実装することなく、レイアウトでこれを解決する方法はありますか?

私はQGraphicsSceneを使用することに頼ると思いますが、基本的なレイアウトのソリューションがあるかどうかはまだ不思議です。

+0

ルック:それは正しく画像の透明部分を通してそれ以下の他のウィジェットを示しています。あなたが持っているボーダーイメージでスタイルシートを使用すると、このプロパティは無効になっているという警告があります。私はそれが何であるかを正確にはわかりませんが、スタイルシートを使う代わりに、代わりにsetPixmapを使うかもしれません。 – goug

+0

@goug:あいにく、質問ですでに述べたように、setPixmapでも同じことが起こります。 – vsz

+0

私はこの質問をもう一度読みましたが、実際にスタイルシートではなくsetPixmapでこれを試したとは言えませんでした。多分あなたはそれを暗示するつもりだったかもしれませんが、確かに明確ではありません。 – goug

答えて

1

問題は私のlabel_foregroundがその親のスタイルシート(ui->widget_progressbar)を継承していたため、堅実な背景色を持っていました。 PNG画像の透明な穴では、私が見た親ではなく、ラベル自体の背景色です。ラベルに透明な背景を追加する

は、問題を解決:QWidgetの:: autoFillBackgroundドキュメントで

label_foreground->setStyleSheet("background-color: rgba(0,0,0,0); border-image: url(:/img/mask.png) 0 0 0 0 stretch stretch;"); 
関連する問題