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

コードの動作を妨げるスロットについては特別なことは何もありません。

おそらく問題は、update()を呼び出すと、再描画がスケジュールされますが、非同期で発生することです。あなたが提供したコードから、最も可能性の高い原因imgはとへの呼び出しの間で変更されていrbg_dataますpaintEvent

于 2012-09-14T10:12:25.547 に答える
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 に答える