2016-08-10 8 views
1

私はQPainterを使ってアプリケーションを作成しています.QPainterクラスにはcairo_push_groupのアナログが必要です。例えば、交差する可能性があります。Qtのcairo_push_groupアナログ:「クリア」コンポジションモードは、その下のすべてをクリアします

問題は、「クリア」作成モードで穴を描画すると、描画する穴の下にあるすべてがクリアされることです。私は複雑な形を描く前に穴の下にあったイメージを残しておきたい。言い換えれば、穴の下のすべてがクリアされます。穴の下のすべてが見えるようにするだけです。

1つの解決策はOdd fillオプション(デフォルトのもの)でQPainterPathを使用しているようですが、私のアプリでは穴に交差する可能性があり、この方法では2つの穴が結合しません2つの穴の交差点は穴ではありません)。

もう1つの解決策は、QPainterPath::subtractedメソッドを使用することですが、何らかの理由でポリゴンの品質が低下します(円は、数え方が数えられる形になります)。

他の解決策は、私は必要なすべてを描き、それをクリア、一時的QImageへ描画してからモード「オーバー先」を使用していますQImageは再びそれを描く保存することですが、それは非常に遅いように思わメモリを消費するソリューションです。

この問題を解決する他の方法はありますか?たぶんQtにcairo_push_groupというアナログ機能がありますか?

カイロに切り替えるようアドバイスしてください。
写真は問題をよりよく説明しています:Pictures

答えて

1

私は自分自身でa​​nwserを見つけました。 QPainterPath + =と - =演算子(QPainterPath::unitedQPainterPath::subtractedのメソッドと同じですが、の任意のベジェ曲線なし)を使用することもできます。私はすべての弧、円などを "ポリライン"(たとえば、すべての円が100面のポリゴンに置き換えられている)に置き換えました。あなたは辺の数を変えるだけで必要な品質を達成することができます。

他の解決方法 - 一時的なQImage - は遅すぎるとは思わないし、ちょうどいいです。これはカイロでも行われている方法です。元のサイズと同じサイズのを作成し、元の設定と同じ設定のQPainterを設定し、新しいQPainterを使用して一時イメージを描画し、最終的にQPainter::drawImageメソッドを使用して元のデバイスにすべてを描画します。

関連する問題