我正在尝试为这样的时间线制定规则:
我有一个 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,我的问题是:
这些内存泄漏是真的吗?
难道我做错了什么?
是否有另一种/更好的方法来实施我的规则?
提前致谢!