1

也许有人可以帮助我解决以下问题:我想在 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;
}

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

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

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

4

2 回答 2

0

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

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

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

于 2012-09-14T13:46:20.973 回答
0

插槽没有什么特别之处,它会阻止您的代码工作。

问题可能是当您调用 update() 时,会安排重绘但异步发生。从您提供的代码中,最可能的原因是在调用和img调用之间被修改rbg_datapaintEvent

于 2012-09-14T10:12:25.547 回答