如何避免在QFrame上重绘?

时间:2017-04-12 20:11:41

标签: c++ qt paintevent qframe

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

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

它工作正常,问题是paintEvent(QPaintEvent *)函数被 Qt 多次自动调用以重新绘制QFrame并消耗太多 CPU 即可。实际上,我只需重复几次(通过手动调用重绘函数)。

有一些方法可以避免QFrame自动重绘自己?

提前致谢

我正在使用Qt 5.3

2 个答案:

答案 0 :(得分:2)

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

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

你最有可能做错其他事。您需要提供一个独立的示例来演示问题。

答案 1 :(得分:0)

我终于找到了问题。我在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);
}