gpt4 book ai didi

c++ - 在QML插件的QGLWidget上渲染QImage

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:57 25 4
gpt4 key购买 nike

我正在尝试编写一个 QML 插件,它从视频中读取帧(使用自定义小部件来完成该任务,而不是 QtMultimedia/Phonon),并且每个帧都被转换为 QImage RGB888,然后显示在 QGLWidget 上(出于性能原因)。现在没有任何东西被绘制到屏幕上,屏幕一直保持白色。

重要的是要声明我已经在没有 QGLWidget 的情况下完成了所有这些工作,所以我知道问题在于 QGLWidget 的设置和绘制。

插件正在注册:

qmlRegisterType<Video>(uri,1,0,"Video");

所以Video是插件的主类。在它的构造函数中我们有:

Video::Video(QDeclarativeItem* parent)
: QDeclarativeItem(parent), d_ptr(new VideoPrivate(this))
{
setFlag(QGraphicsItem::ItemHasNoContents, false);

Q_D(Video);
QDeclarativeView* view = new QDeclarativeView;
view->setViewport(&d->canvas()); // canvas() returns a reference to my custom OpenGL Widget
}

在我跳转到 canvas 对象之前,让我说我重载了 Video::paint() 所以它调用了 canvas.paint() 在将 QImage 作为参数传递时,我不知道这是否是正确的方法,所以我想就此提出一些建议:

void Video::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
Q_UNUSED(painter);
Q_UNUSED(widget);
Q_UNUSED(option);

Q_D(Video);
// I know for sure at this point "d->image()" is valid, but I'm hiding the code for clarity
d->canvas().paint(painter, option, d->image());
}

canvas对象被声明为GLWidget canvas;,这个类的头定义为:

class GLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit GLWidget(QWidget* parent = NULL);
~GLWidget();

void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QImage* image);
};

看起来很简单。现在,QGLWidget 的实现如下:

GLWidget::GLWidget(QWidget* parent)
: QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
// Should I do something here?
// Maybe setAutoFillBackground(false); ???
}

GLWidget::~GLWidget()
{
}

最后:

void GLWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QImage* image)
{
// I ignore painter because it comes from Video, so I create a new one:
QPainter gl_painter(this);


// Perform drawing as Qt::KeepAspectRatio

gl_painter.fillRect(QRectF(QPoint(0, 0), QSize(this->width(), this->height())), Qt::black);

QImage scaled_img = image->scaled(QSize(this->width(), this->height()), _ar, Qt::FastTransformation);

gl_painter.drawImage(qRound(this->width()/2) - qRound(scaled_img.size().width()/2),
qRound(this->height()/2) - qRound(scaled_img.size().height()/2),
scaled_img);
}

我错过了什么?

我最初问this question on Qt Forum但没有得到回复。

最佳答案

已解决。问题是当我应该从加载它的应用程序中检索 GL 上下文时,我试图在我的插件中创建一个新的 GL 上下文。

This code非常有助于了解如何实现这一目标。

顺便说一下,我发现这些东西是在 view 中绘制的。只是我需要执行 view->show(),但这创建了另一个窗口,这不是我想要的。我上面分享的链接有答案。

关于c++ - 在QML插件的QGLWidget上渲染QImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8446437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com