0

QPainterPathの描画アルゴリズムをカスタマイズするにはどうすればよいですか?

表示されている要素のみをペイントして、アプリを高速化したいと思います。

QPainterPathからリアルタイムプロットを描画していますが、これを実行したいと思います。

  1. QPainterPathの左端に表示される要素の二分探索。
  2. QPainterPathの右端に表示される要素の二分探索。
  3. 表示されている要素のみを描画します。

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

しかし、QPaintEngine::drawPath(...)デフォルトの実装は何もしません

私は正しいですか?

アップデート:

復活してくれてありがとう、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 msg、...)行2481+0xfバイトC++QtCored4.dll!qt_assert(const char *アサーション、const char *ファイル、int行)行1999+0x16バイトC++QtGuid4.dll!QPainterPath :: elementAt(int i)行405+0x36バイトC++MyPlot.dll!MyPlot :: paintEvent(QPaintEvent *イベント)行172+0x13バイトC++

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

たぶん、要素数はクラッシュの瞬間には現実的ではありませんか?

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

これが私のスレッドの仕組みです:私のGUIスレッドは読み取り専用メソッドのみを使用します。私の2番目のスレッドは、1秒あたり1〜5千ポイントを追加します。

4

1 に答える 1