qt - QWidgetでアルファ透明マスクを使用していますか?

qt mask qwidget qpainter alpha-transparency

QWidgetにアルファ透明マスクを割り当てることは可能ですか? setMaskを使用してマスクを設定する方法は知っていますが、白黒のマスクしかサポートしていないようです。真のアルファチャネルをサポートすることは可能ですか?

すなわち、現在私はこのようなPNGを持っています:



そしてこのようなウィジェット:



PNGをQPixmapに読み込んでマスクとして設定すると、次のようになります(エッジに注意してください)。



ただし、これを取得したいと思います(滑らかなエッジ):



それを行う方法はありますか?

注:ウィジェットでより複雑な描画を行っています。マスク領域に制限する必要があるため、単純にPNGをウィジェットの背景画像として設定することはできません。
答え
あなたの最善のルートはQPainter's composition modesにあると思います。

例えば:

QPixmap PixmapToBeMasked(Size);
PixmapToBeMasked.fill(QColor(255, 255, 255, 120));

QPixmap Mask = DoSomethingToGetAMask();

QPainter Painter(&PixmapToBeMasked);
Painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
Painter.drawPixmap(0, 0, Mask.width(), Mask.height(), Mask);


これはウィジェットの描画をうまく処理します。それでもマウスイベントをマスクする必要がある場合は、追加の作業を行う必要があります。
関連記事

linux - Qt子プロセスを閉じて、子プロセスにクリーンアップコードを実行させるにはどうすればよいですか?

qt - QT、QTableWidget:cellChanged()シグナルによるアイテムの変更

eclipse - qtcreatorのすべてのGUI要素をユーザーが移動できますか?または一部のみですか?

xml - QMLでのRSS解析

qt - QtアプリにUIがあるかどうかを確認する

python - qmenubarを追加した後、デストラクタが呼び出されない

multithreading - マルチスレッドプログラムで使用されているAPIの非再入可能関数

qt - QStyledItemDelegateのComboBoxからダイアログを呼び出す

c++ - アプリケーションにフォーカスがない場合のキープレスの検出

c++ - 重複するQGraphicsItem-sホバーイベント