【问题标题】:Avoid QGraphicsItem with children from infinite repainting避免 QGraphicsItem 与孩子无限重绘
【发布时间】:2017-01-09 12:11:29
【问题描述】:

我有一个 QGraphicsItem 元素(从 QGraphicsItem 子类化),它的子元素是 QGraphicsTextItem

问题是QGraphicsItempaint(...)方法被无限调用。

这是来自我的QGraphicsItem 元素的绘制方法,带有QGraphicsTextItem

void rectangle_element::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{
    painter->drawRoundedRect( -10, -10, 80, 40, 5, 5 );
    painter->drawStaticText( -10, -10, QStaticText( "some text" ) );
    text_item->setPlainText( "more text" );
}

我不能将setCacheModeQGraphicsItem::CacheMode::NoCache 以外的其他标志一起使用。

我使用的是 Qt 5.6。

更新:

  • text_item 是该类的成员,它在初始化列表中被初始化。

【问题讨论】:

  • 为什么每次画画都要创建一个孩子?在构造函数中创建子节点
  • @Fabio - 更新了问题。 QGraphicsTextItem 是 calss 的成员。
  • 再一次,为什么每次绘制item时都要设置子文本?
  • 所以每次绘制矩形时,设置text_item的文本。这可能会导致父项重绘,这可能是无限循环的原因。通常,在绘制操作期间更改项目不是一个好主意。请记住,paint 方法的调用频率很高。
  • 取决于何时应该更改。如果文本在项目的生命周期内相同,则在创建时设置它。否则,可能会出现某种触发文本更改的事件,因此请在此处设置文本。文字本身的绘制应该由QGraphicsTextItem处理。

标签: c++ qt qgraphicsitem qpainter qgraphicstextitem


【解决方案1】:

您在父项的paint() 方法中设置了text_item 的文本,这似乎反过来触发了父项的重绘,从而创建了一个无限循环。通常,在绘制操作期间更改项目不是一个好主意。请记住,paint() 方法可以被高频调用。

可能有一些事件触发了text_item 的文本更改需求,例如用户交互,这反过来又调用了一个槽。这是您应该设置文本的地方。文字本身的绘制由QGraphicsTextItem处理。

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多