如何避免在 QFrame 上重绘?
How to avoid repaint on QFrame?
我有一个QFrame
,用来画一些矩形来表示一天中的一些时间段,例如,用户睡觉的时间段。
为此,我覆盖了 paintEvent(QPaintEvent *)
函数,并使用 QPainter
绘制矩形。
工作正常,问题是 Qt 多次自动调用 paintEvent(QPaintEvent *)
函数来重新绘制 QFrame
并且它正在消耗太多 CPU。实际上,我只需要重绘几次(通过手动调用重绘函数)。
有什么方法可以避免 QFrame
自动重新绘制自身?
提前致谢
我正在使用 Qt 5.3
只要 Qt 需要重新绘制小部件,就会重新绘制它们。一般来说,你无法控制其中的任何一个。您只能在需要时添加重绘请求,而不能减少它们。
您永远不需要调用 repaint
方法。相反,每当用于绘画的数据发生变化时,您都应该 update()
小部件。融合更新事件以提高性能。对 update()
的调用应该在小部件的 setter 方法中,或者应该连接到 dataChanged()
和用于提供小部件的数据模型的等效信号。
很可能你做错了什么。您需要提供一个独立的示例来说明问题。
终于找到问题了。我在 paintEvent
函数中设置样式 sheet,我认为它因此被重新绘制。
我正在做这样的事情:
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);
...
}
我刚刚更改了设置样式的位置 sheet,一切正常。
新代码如下所示:
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);
}
我有一个QFrame
,用来画一些矩形来表示一天中的一些时间段,例如,用户睡觉的时间段。
为此,我覆盖了 paintEvent(QPaintEvent *)
函数,并使用 QPainter
绘制矩形。
工作正常,问题是 Qt 多次自动调用 paintEvent(QPaintEvent *)
函数来重新绘制 QFrame
并且它正在消耗太多 CPU。实际上,我只需要重绘几次(通过手动调用重绘函数)。
有什么方法可以避免 QFrame
自动重新绘制自身?
提前致谢
我正在使用 Qt 5.3
只要 Qt 需要重新绘制小部件,就会重新绘制它们。一般来说,你无法控制其中的任何一个。您只能在需要时添加重绘请求,而不能减少它们。
您永远不需要调用 repaint
方法。相反,每当用于绘画的数据发生变化时,您都应该 update()
小部件。融合更新事件以提高性能。对 update()
的调用应该在小部件的 setter 方法中,或者应该连接到 dataChanged()
和用于提供小部件的数据模型的等效信号。
很可能你做错了什么。您需要提供一个独立的示例来说明问题。
终于找到问题了。我在 paintEvent
函数中设置样式 sheet,我认为它因此被重新绘制。
我正在做这样的事情:
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);
...
}
我刚刚更改了设置样式的位置 sheet,一切正常。
新代码如下所示:
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);
}