- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试编写一个 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/
我正在使用带有 PySide 绑定(bind)的 python 中的 Qt。我的应用程序的主要部分是可以调整到特定值的 OpenGL View (这是一个模拟器,用于在移动设备的不同分辨率下测试我的游
我是QT新手,有问题。我从http://qt.nokia.com/downloads/sdk-windows-cpp下载了用于开源C++开发的Qt SDK,并在PATH中添加了C:\QT\2010.0
我想在 QGLWidget 中显示 OptixSDK 的示例 6。 我的应用程序只有 3 个 QSlider 用于绕 X、Y、Z 轴和 QGLWidget 旋转。 据我了解,每当我的 QSlider
我正在 Qt 中制作一个 GUIon,我正在使用 QGLWidgt 来显示对象的运动。为了调试目的,我在矩阵上进行了硬编码以尝试显示茶壶,但屏幕上没有显示任何内容。我尝试了很多东西,我只是不知道出了什
基本上我想在 Text Edit 小部件上显示按下的按钮。 Key 事件适用于 GLWidget。如何与 GLWidget 中的 MainWindow 小部件进行交互?到目前为止,这是我的代码, 主窗
我基本上想做的是创建一个 QGLWidget 的实例(或者更确切地说是 QGLWidget 的派生类),将它添加到 QMainWindow ,然后从我的 QTCreator 程序中的任何地方访问 QG
我有一个 Qt 应用程序,它在 Mac OS 上使用 OpenGL 绘图和 QGLWidget。在我的 MBP 上运行良好,但在 30"屏幕上尝试时,我注意到存在窗口大小限制。 如果我将窗口大小增加到
我想编写一个单线程应用程序来显示两个 QGLWidget(一个用于 3D,一个用于 2D)。我试图找到有关同时显示的两个 QGLWidgets 的信息,但没有找到任何对我有帮助的信息。 现在,我认为我
我看了很多关于 OpenGL 不绘图、常见错误等的文章和 SO 问题。这个让我很困惑。 我已经为 glOrtho 尝试了几种不同的设置、不同的顶点位置、颜色等,但都无济于事。 我可以确认 OpenGL
我有小部件: class Main_Widget : public QWidget { Q_OBJECT public: explicit Main_Widget(QWidget *p
是否可以使用 Qt 在 QGLWidget 中完全脱离屏幕进行渲染,而无需将场景重新绘制到屏幕,从而避免缓冲区在监视器上完全翻转? 我需要保存在帧缓冲区上生成的每一帧,但是,由于序列由 4000 帧组
我是 OpenGL 和 Qt 的新手,我正在同时学习这两者(已经 3 天了:)。几年前,我用 DirectX 做了一些实验,我清楚地记得在那里制作全屏窗口是可能的。我所说的全屏是指真正的全屏,即使顶部
我正在上传大量纹理(每秒 60 个 VGA 图像)并且它阻塞了我的 UI 线程。来自 the Qt 5.1 QGLWidget manual page (强调我的): Texture uploadin
我正在使用 QGraphicsView显示 2D 图像并有一个单独的 QGLWidget窗口以显示一些 3D 对象。我正在根据 3D 对象的旋转动态更改“QGraphicsView”中显示的图像。 我
我有两个计时器来重新绘制 QGLWidget 并确定 FPS QObject::connect(&fpsTimer, SIGNAL(timeout()), this, SLOT(updateFps()
我有一种流媒体应用程序,它应该捕获窗口的内容。在窗口中,一个 QGLWidget 绘制了东西。目前我在每个绘制周期中都使用 widget.grabFrameBuffer(必须是实时的)。该应用使用 1
我有一个 QGLWidget,我在其中渲染一个动态网格。我想做的是录制我在此窗口中查看的视频。如果可能的话,我想使用 Qt 的低级多媒体库或高级 Phonon。 非常感谢您的想法! 最佳答案 在最新版
我想知道是否有比这更好的解决方案:我有一个渲染代码和一个颜色选择代码,我已经共享了这两个代码(VBO 等)之间可以共享的所有内容,我的代码看起来像: void paintGL() { label1:
我想使用 QGLWidget、QGraphicsScene 和 QGraphicsView 创建一个简单的缩略图查看器。我在将 QGLWidget 放在 QGraphicsScene 上时遇到问题。代
我一直在尝试在 QGLWidget 中渲染立方体,但结果是错误的。无论我如何旋转它,它看起来都像一个扁平的正方形。就像它没有注意到它顶点的 Z 坐标一样。就在我添加 GL_DEPTH_BUFFER_B
我是一名优秀的程序员,十分优秀!