誰かが次の問題を解決してくれるかもしれません: 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 の一般的な問題ですか?