将位复制到QGLWidget中的QtImage



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

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;
}

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

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

问题:为什么memcpy不能在插槽中工作?这是Qt的普遍问题吗?

插槽没有什么特别的地方会阻止您的代码工作。

问题可能在于,当您调用update()时,重新绘制是按计划进行的,但它是异步进行的。根据您提供的代码,最有可能的原因是img在对rbg_datapaintEvent 的调用之间被修改

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

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

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

相关内容

  • 没有找到相关文章

最新更新