我是 QT 新手。我正在研究图形。
我正在使用 QWidget 来绘制图形(用于在 QWidget 绘制事件中绘制图形)。我需要绘制背景和前景图形。背景是固定图形。前景我正在画线。
每 100 毫秒我需要绘制 20 个点。本次绘制时间为8秒。我总共需要画 1600 分(总分代表有争议的路线)。
我正在使用 QTimer 每 100 毫秒调用一次该绘图。前几张图画得很快。在绘图的中间它变得缓慢。
问题是我需要每 100 毫秒绘制所有前景和背景。
请帮我解决这个问题。如果有人有示例代码,请提供。提前致谢。
有没有办法只绘制部分区域,即。仅图形的特定修改区域?
最佳答案
如果没有硬件支持,QPainter 绘图可能会非常慢。如果所有线条都可见,则使用 QGraphicsView 将无济于事,因为它内部无论如何都使用 QPainter。
如果您每次更新只需绘制 20 个新点(或线),并且每次更新背景都会被清除,因此您必须重新渲染所有内容,那么您可以尝试以下几种方法:
1) 禁用后台自动填充。请参阅:QWidget::autoFillBackground 将这样的内容添加到您的小部件初始化中:
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 也会带来各种新问题。
关于qt - 优化QT中的画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4183492/