在QGLWidget中将位复制到QtImage

时间:2012-09-14 07:23:57

标签: qt memcpy slot qglwidget

也许有人可以帮我解决以下问题: 我想在QGLWidget中绘制QImage的内容,但是小部件是用黑色绘制的。

class QGLCanvas {
    public:
    QGLCanvas(QWidget* parent) : QGLWidget(parent) {
    }

    void setImage(const QImage* image) {
      img = image;
    }

    void paintEvent(QPaintEvent*) {
      // From Painter Documentation Qt
      QPainter p(this);
      p.setRenderHint(QPainter::SmoothPixmapTransform, 1);
      p.drawImage(this->rect(), *img);
      p.end();
    }

    public slots:
    void rgb_data(const void *data) {
      memcpy((void *)img->bits(), data, img->byteCount()); // data will be copied (sizes are known)
      // img.save("text.png"); // saves right image
      this->update(); // calls repaint, but does not draw the image.
   }
   private:
   QImage *img;
}

The Bug: 调用插槽时,内存将复制到映像。如果保存图像,则内容正确。但重绘方法只是将黑色内容绘制到小部件中。

修复: 如果memcpy行在插槽外部实现,则图像内容将被绘制到窗口小部件。此修复程序大大增加了代码复杂性。因此,我有以下问题:

问题: 为什么memcpy在插槽中不起作用?这是Qt的一般问题吗?

2 个答案:

答案 0 :(得分:0)

对于阻止代码工作的插槽没有什么特别之处。

可能的问题是,当您调用update()时,会调度重绘但异步发生。从您提供的代码中,最有可能的原因是在imgrbg_data

的调用之间修改paintEvent

答案 1 :(得分:0)

您想确定QImage的format。当你调用位并期望它是RGB时,你需要检查格式。

if( img->format() != QImage::Format_RGB888 )
{
    // convert the image format to RGB888
    *img = img->convertToFormat(QImage::Format_RGB888);
}

这样,Qt会在尝试绘制时知道图像格式。如果你用RGB数据填充它但QImage被“格式化”为ARGB,你会得到一些绘画错误。