2012-03-06 11 views
0

QPainterPathの描画アルゴリズムをどのようにカスタマイズすることができますか?QWindgetでQPaintPath描画アルゴリズムをカスタマイズする

表示可能な要素だけをペイントしてアプリケーションをスピードアップしたいと思います。

は私がQPainterPathからのリアルタイムプロットを描いていますし、これを実行したいと思います:QPainterPathの一番左に表示される要素の

  1. バイナリ検索を。
  2. QPainterPathの右端に表示される要素のバイナリ検索。
  3. 可視要素のみを描画します。

QWidgetのQPaintEngineをQWidget::paintEngine()でカスタマイズする必要があると思います。

ただし、QPaintEngine::drawPath(...)デフォルト実装does nothing

私は正しいですか?

UPDATE:respounce、Koyingため

感謝。

私はこの方法をしようと試みてきました:

int minIndex = BinarySearchForMatchOrGreat(path, beginOffset); 
int maxIndex = BinarySearchForMatchOrGreat(path, endOffset); 
QPainterPath newPath; 
for (int i = minIndex; i < maxIndex; i++) 
{ 
    const QPainterPath::Element & element = path.elementAt(i); 
    newPath.moveTo(element.x, element.y); 
} 
painter.drawPath(newPath); 

すべてが素敵な作品!私は、任意の要素数に対して時間オーバーヘッドを固定しています。

私のコードをスピードアップするための提案はありますか?

UDPATE:

QPainterPathを読み取り、別のスレッドからそれに要素を追加しているときに、私はエラーが発生しています。コールスタックと 時々、アプリのクラッシュ:!!

QtCored4.dll qt_message_output(QtMsgType MSGTYPE、constのchar型* BUF)ライン2240 C++ QtCored4.dll qt_message(QtMsgType MSGTYPE、constのchar型* MSG、char型* AP)ライン2298 + 0x12バイトC++ QtCored4.dll!qFatal(const char * file、int line)Line 1999 + + 0x12 bytes C++ QtCored4.dll!qt_assert(const char *アサーション) 0x16バイトC++ QtGuid4.dll!QPainterPath :: elementAt(I int型)線405 + 0x36バイトC++ MyPlot.dll!MyPlot :: paintEvent(QPaintEvent *イベント)ライン172 + 0x13にバイトC++

elementAt(i)、i == 4303を呼び出し、5459個の要素があります。

多分、要素数はクラッシュの瞬間では本当ですか?

第2スレッドは、最初のスレッドがクラッシュしている間に要素数を変更できますか?

このスレッドではどのように動作しますか: 私のguiスレッドは読み取り専用メソッドのみを使用します。 私の2番目のスレッドは、毎秒1〜5千ポイントを追加します。

+0

または、QPainterPathの動作を変更するにはサブクラス化が必要ですか? – k06a

+0

QPainterPathを反復している間に他のスレッドでQPainterPathが変更された場合、問題が発生します...ミューテックスを追加する必要があります – Koying

+0

"反復"とは何を意味しましたか?私はelementAt()とelementCount()メソッドのみを使用します... – k06a

答えて

1

QPaintEngineは、基盤となるプラットフォーム固有のペイントエンジン、つまりWindowsのGDI、LinuxのX、Macのcocoaなどとの抽象インターフェースです。あなたが探しているものではありません。

QPainterPathを編集して、塗りたくない要素を削除してください。 QPainterPathはプリミティブの一覧にすぎません。ビットマップのようなものではなく、SVGのようなビットです。

関連する問題