qt - 优化QT中的画线

标签 qt

我是 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/

相关文章:

c++ - QFileDialog 中的后退和前进按钮没有信号

c++ - 如何使用 QSettings 读取 Windows 注册表(默认)值?

c++ - QT 图形绘图,如何更改 QGraphicsView 的坐标系/几何图形

c++ - Qt 信号和槽通过引用传递

c++ - 分配期间内存损坏错误

c++ - 二进制字符串到 C++ 中的 byte[]?

c++ - Horizo​​ntalHeaderView 不调用 QAbstractTableModel 的 child 的 headerData()

c++ - 使用 Qt Creator 在 Debug模式下编译一段代码

c++ - 错误 : symbol(s) not found for architecture x86_64, collect2:ld 返回 1 个退出状态

qt - 带标题的 QNetworkRequest