在 QGLWidget 中将位复制到 QtImage
Posted
技术标签:
【中文标题】在 QGLWidget 中将位复制到 QtImage【英文标题】:Copy Bits to QtImage in QGLWidget 【发布时间】:2012-09-14 07:23:57 【问题描述】:也许有人可以帮助我解决以下问题: 我想在 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;
错误: 当slot被调用时,内存被复制到镜像中。如果图像被保存,则内容是正确的。但是 repaint 方法只是将黑色内容绘制到小部件。
修复: 如果 memcpy 行在 slot 外实现,则图像内容被绘制到小部件。此修复程序大大增加了代码复杂性。因此,我有以下问题:
问题: 为什么 memcpy 在插槽内不起作用?这是 Qt 的普遍问题吗?
【问题讨论】:
还有其他想法吗?感谢您的帮助。 【参考方案1】:插槽并没有什么特别之处,它会阻止您的代码工作。
问题可能是当您调用 update() 时,会安排重绘但异步发生。从您提供的代码中,最可能的原因是 img
在对 rbg_data
和 paintEvent
的调用之间被修改
【讨论】:
【参考方案2】:您想确定 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,你会得到一些绘画错误。
【讨论】:
您好,感谢您的回答。图像由 new QImage(640, 480, QImage::Format_RGB888) 创建; ,所以格式是已知的。以上是关于在 QGLWidget 中将位复制到 QtImage的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Excel 中将前导零添加到固定的字母数字长度? [复制]