1

次のようなタイムラインのルールを作成しようとしています:

タイムライン

私は QGraphicsView を持っています。ここに QGraphicsScene を配置し、そこに QGraphicsItems のような行やいくつかのラベルを追加します。

ズームが変更された場合にのみシーンに要素を追加します (paintEvent が発生した場合は追加しません)。

時間ラベルを追加するには、次を使用します。

    QString label = "00:14"; // For example
    int posX = ... // Here I calculate the position of the label
    scene->addText(label,QFont("Arial",8))->setPos(posX,-1);

ルールを再描画する必要がある場合は、次のようにします。

    qDeleteAll(scene->items());

最初にラベルと線を追加します。

成績が悪いことに気づきました。私のシーンには 8k 要素 (ラインとラベルの間) のようなものがあるので、Valgrind を使用して問題をチェックしました。

「おそらく」シーンにテキストを追加する行にメモリリークがあることを示しています。次のようなメッセージがあります。

    2,165,760 bytes in 470 blocks are possibly lost in loss record 9,922 of 9,923
      in TimelineWidget::drawRule() in Timeline/timelinewidget.cpp:166
      1: realloc in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
      2: /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.3
      3: /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.3
      4: QTextDocument::setPlainText(QString const&) in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.3
      5: /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.3
      6: QGraphicsTextItem::QGraphicsTextItem(QString const&, QGraphicsItem*, QGraphicsScene*) in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.3
      7: QGraphicsScene::addText(QString const&, QFont const&) in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.3
      8: TimelineWidget::drawRule() 

これは addText 呼び出しでのみ発生し、addLine 呼び出しでは発生しません。

Qt 4.8を使用していますが、質問は次のとおりです。

  • それらのメモリリークは本当ですか?

  • 私は何か間違ったことをしていますか?

  • 私のルールを実装するための別の/より良い方法はありますか?

前もって感謝します!

4

1 に答える 1