【问题标题】:How to avoid repaint on QFrame?如何避免在 QFrame 上重绘?
【发布时间】:2017-04-12 20:11:41
【问题描述】:

我有一个QFrame,用于绘制一些矩形来表示一天中的某些时间段,例如,用户睡觉的时间段。

为此,我覆盖了paintEvent(QPaintEvent *) 函数,并使用QPainter 绘制矩形。

工作正常,问题是paintEvent(QPaintEvent *)函数被Qt自动调用多次以重绘QFrame,并且消耗太多CPU。其实我只需要重绘几次(通过手动调用重绘函数)。

有什么方法可以避免QFrame 自动重绘自身?

提前致谢

我使用的是 Qt 5.3

【问题讨论】:

  • 金光闪闪的猜测:将if (anythinghasChanged){...} 添加到您的paintEvent()
  • @tobi303 我已经尝试过了,但它不起作用,我认为QFrame 已被删除(自动)并且不再重新绘制。
  • CPU 过多是多少?如果真的是这样的话,也许你应该找出为什么它会不断重绘
  • 正如我在 Windows 任务管理器中看到的,它仅在重绘过程​​中使用了大约 40% 的 CPU。

标签: c++ qt paintevent qframe


【解决方案1】:

当 Qt 需要重新绘制小部件时,它们就会重新绘制。一般来说,你无法控制其中的任何一个。您只能在需要时添加重绘请求,而不能减少它们。

您永远不需要调用repaint 方法。相反,每当用于绘画的数据发生变化时,您应该update() 小部件。更新事件被融合以提高性能。对update() 的调用应该在小部件的setter 方法中,或者应该连接到dataChanged() 和用于提供小部件的数据模型的等效信号。

很可能你做错了什么。您需要提供一个独立的示例来演示该问题。

【讨论】:

  • 只有在某些数据发生变化时才会重新绘制小部件?然后我需要仔细看看是否有一些数据被改变了。我将尝试提供一个独立的示例。谢谢。
  • 只有当 Qt 通过调用 paintEvent 请求重新绘制时,才应该绘制小部件。只有在用于绘制的数据发生更改时,您才应该通过调用update() 从 Qt 请求重新绘制。查看您的paintEvent 并确定您在绘画中使用了哪些非常量数据。然后确保在更改此数据的所有点处调用update()。 Qt 会处理剩下的事情。永远不要打电话给repaint()
  • 谢谢@Kuba Ober,我会调查我的paintEvent 函数。
【解决方案2】:

我终于找到了问题所在。我在 paintEvent 函数中设置样式表,我认为它因此被重新绘制。

我正在做这样的事情:

MyFrameBar::MyFrameBar(QWidget *parent) : QFrame(parent)
{
    color = QColor(50, 50, 50, 200);
}

void MyFrameBar::paintEvent(QPaintEvent *)
{
    QString style = "border: 1px solid rgba(%1, %2, %3, %4);";
    style = style.arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha());
    setStyleSheet(style);
    ...
}

我刚刚更改了设置样式表的位置,一切正常。

新代码如下所示:

MyFrameBar::MyFrameBar(QWidget *parent) : QFrame(parent)
{
    setColor(QColor(50, 50, 50, 200));
}

void MyFrameBar::paintEvent(QPaintEvent *)
{
    ...
}

void MyFrameBar::setColor(const QColor &color)
{
    this->color = color;

    QString style = "border: 1px solid rgba(%1, %2, %3, %4);";
    style = style.arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha());
    setStyleSheet(style);
}

【讨论】:

  • paintEvent 不应该做任何事情,除了绘画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多