我是QT的新手。我正在研究图形。
我正在使用QWidget绘制图形(用于在QWidget绘制事件中绘制图形)。我需要绘制背景和前景图形。背景是固定图形。前景我是画线。
每100毫秒我需要绘制20个点。此绘图时间为8秒。总计我需要绘制1600点(总点数代表有争议的线)。
我正在使用QTimer在每100毫秒调用此绘图。最初的几张画很快。在绘图的中间,它变得缓慢。
问题是我需要在每100毫秒绘制所有前景和背景。
请帮我解决问题。如果有任何人有示例代码请提供。提前谢谢。
有没有办法只绘制部分区域,即。只有图形的特定修改区域?
答案 0 :(得分:3)
没有硬件支持,QPainter-drawing可能会非常慢。如果所有行都可见,使用QGraphicsView将无济于事,因为它无论如何都在内部使用QPainter。
如果你只需要为每次更新绘制20个新点(或行),并且每次更新背景都会被清除,所以你必须再次渲染所有内容,你可以尝试一些事情:
1)禁用后台自动填充。请参阅:QWidget::autoFillBackground 将这样的内容添加到您的widget init:
setAutoFillBackground(false);
setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_NoSystemBackground, true);
现在第一次更新渲染背景和第一行。对于下一次更新,只需跳过渲染背景并仅渲染新行。
2)使用双缓冲。例如,创建小部件大小的QImage。
.h
private:
QImage m_targetImage;
.cpp
// constructor
m_targetImage = QImage(width(), height(), QImage::Format_ARGB32);
// paint event
// draw to image
QPainter p;
p.begin(&m_targetImage);
static bool firstUpdate = true;
if (firstUpdate)
{
// draw background)
p.drawImage(...);
firstUpdate = false;
}
// draw latest lines
p.drawLines(....);
p.end();
// draw image in widget paint
QPainter painter;
painter.begin(this);
painter.drawImage(0, 0, m_targetImage);
painter.end();
3)尽可能使用QGLWidget。从QGLWidget而不是QWidget继承您的小部件。此方法不适用于所有平台,速度增加可能还不够。使用OpenGL也会带来各种新问题。