2017-01-08 6 views
2

PyQtには、QGraphicsSceneがあります。このQGraphicsSceneに標準のQBrush塗りつぶしパターンの1つ、この場合はQt.Dense7Patternを追加します。これは、シーンが元の1:1スケールで表示されているときに、期待どおりに表示されます。Dense7パターンを構成する「ドット」は、互いに離れたいくつかのピクセルです。また、元の長方形の幅が50ピクセル、高さが50ピクセルであるとします。QBrush - 標準的な塗りつぶしパターンをスケールしますか?

私は、そのシーンを拡大すると、2の倍数で塗りつぶされた矩形が100x100ピクセルになるようにしますが、塗りつぶしパターンのドットは5ピクセル離れて表示されますが、Qtはズームインします静的な塗りつぶしパターンでも、塗りつぶしパターンのドットは10ピクセル離れて表示されます。

This questionも同様です。どうやら、ブラシのピクスマップ塗りつぶしパターンに変形(スケールを含む)を適用できますが、ブラシの「標準」塗りパターンには当てはまらないようです。私はちょうどからのインスタンスを作る

その後
class customFillPolygonItem(QGraphicsPolygonItem): 
    def paint(self,painter,option,widget=None): 
     # from here, painter.setBrush affects shapes drawn directly in this function; 
     # self.setBrush affects the call to super().paint 
     newBrush=QBrush(painter.brush()) 
     newBrush.setTransform(QTransform(painter.worldTransform().inverted()[0])) 
     self.setBrush(newBrush) 
     painter.setBrush(newBrush) 
     painter.drawRect(QRectF(0,0,50,50)) # draw a reality-check object 
     super(customFillPolygonItem,self).paint(painter,option,widget) 

:(うまくいけば、私は必要だすべてをした)

全体サブクラス:私は、サブクラスをしたとのは、paintメソッドに変換ブラシが、運を変更しました上記を使用してください

myItem=customFillPolygonItem(QPolygonF(... 
myItem.setBrush(QBrush(Qt.Dense7Pattern)) 
myScene.addItem(myItem) 

だから、スケールをブラシの標準塗りつぶしパターンに適用することは可能ですか?これはQBrush.setFlag(ItemIgnoresTransformations)に似ていますが、そのようなものは存在しません...アイテム全体(この場合は矩形)にのみそのフラグを設定できます。

回避策は、次のものがあります - 必要に応じて ItemIgnoresTransformationsを使用して手動で実際の長方形の頂点を変換 - それは問題のように、スケールする必要があり、その場合にはブラシように、そのピックスマップを使用し、各標準の塗りつぶしパターンのうち、QPixmapのを作るの上記の

もちろん、最も簡単な解決策を見つけることはいいでしょう。

更新日: Scholliiは質問された質問に答えます。アルファ値を調べるという提案も、私がこの特定のケースで抱えていたより大きな問題を解決することにつながりました。私が投稿したソリューションでは別のグレースケールを作成しました。とりあえずありがとう!

答えて

1

私は目標が変換によって到達できないと信じています:塗りつぶしパターンが「シーン」スペースで生成され、ビューの倍率に基づいて変換が適用されます。これは明らかにポイント間の間隔を増やすでしょう変換はそれを防ぐことができる、パターンの異なる図面のみ。

効果を得るには、ブラシにはシーンコードのポイント間の距離を制御するパラメータが必要です。 rectのpaint()メソッドでは、現在のビューズームファクタに基づいてこのパラメータ値を設定できます(paint()メソッドのstyle引数を使用)。

QBrushがこのようなパラメータを提供しているとは思わないので、前の段落で説明したように計算された距離を使用して、自分で点を描画する必要があります。 Pythonを終了すると、ドットのロスがあるとこれはかなり遅いかもしれませんが、PyQt5は一般的に非常に印象的なパフォーマンスを持っています。

ポイントの原点を選択する必要はありません(コーナーまたは中心は一般的な選択肢です)。拡大すると、ポイントが「原点に向かって」スライドするようになります。反対側の端部/縁部に「追加」される。私は効果が気に入らない可能性が高いと思いますし、実装するのが簡単ではないので、勾配やアルファ値など、ポイントに基づいていない別の視覚効果を考慮する必要があります。 setDashPattern()やビュー座標での残りの描画など、他のアプローチがあるかもしれませんが、おそらくそれほど価値はありません。

+0

それは可能ではない可能性があるという第二の意見を聞くことは良いことです。私はただのアルファ値を使っているとは思っていませんでした。それは完璧な解決策かもしれません。ディスプレイの全体的な目標は、異なるレベルのグレーレベルで異なるポリゴンを表示することです。標準的なブラシパターンは「通常の」スケールで機能していましたので、まだアルファ値は考えていませんでした。ありがとうございます - もし私が良い結果を見つけたらここに投稿します。 –

+0

はい、アルファが最善の解決策でした。その考えを育ててくれてありがとう。振り返ってみるといつも明らかです!私は正確な解決策を絞り込むために別の答えを掲示しました。 –

+0

これは素晴らしいことです。私が書いたことは、あなたが違う角度から問題を見ることになりましたが、別の質問(あなたが答えを知っていたもの)で終わりました。しかし、私はあなたの選択を尊重し、最も重要なのは、そのウサギの穴を下っていないことです:) – Schollii

1

ありがとうございますSchollii for the lead:アルファ値を設定すると簡単に解決できます。私は様々なグレースケールを表現するためにアルファ値を変えて、黒で行った。あなたが異なっ網掛けされ、すべてのn個の異なるアイテムを持っている場合は

、あなただけのアイテムのリストを歩くことができます:35はあなたが希望得ることができるように、良い見えるものに基づいて選択され

myItem.setBrush(QBrush(QColor(0,0,0,35*n))) 

1つのアイテムから次のアイテムへのグレーレベルの分離の量。

これは、サブクラス化と変換よりも大規模に畳み込まれていません!

関連する問題