Qt/QML : Send QImage From C++ to QML and Display The QImage On GUI
我创建了一个类
但是,我很难将
我已经进行了一些研究,发现
谢谢你的帮助!
编辑1:
我在这里看了一下:http://qt-project.org/doc/qt-5.0/qtquick/qquickimageprovider.html,但我看不到如何将QImage传递给快速图像提供程序并从中创建QUrl 。
编辑2。这是标题。实施不重要。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Publisher { Q_OBJECT public: Publisher(QObject* parent = 0); virtual ~Publisher(void); Q_SIGNALS: void newImage(const QImage& newImage); }; |
编辑3。这是我的QML代码,但是我不知道如何绘制QImage,因此该代码毫无意义。
我的main.cpp文件:
1 2 3 4 5 6 7 8 9 10 11 12 | int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<Publisher>("Components", 1, 0,"Publisher"); QtQuick2ApplicationViewer viewer; viewer.setMainQmlFile(QStringLiteral("qml/QQuickViewExample/main.qml")); viewer.showExpanded(); return app.exec(); } |
我的main.qml文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import QtQuick 2.0 import Components 1.0 Rectangle { id : testRect width: 360 height: 360 Image{ anchors.fill: parent id: myImage Publisher { id: myPub onNewImage: { myImage.source = newImage; #I know this doesnt work, it needs a QUrl and not a QImage } } } } |
换句话说,您有一个类发出一个携带QImage的信号,并想用该图像更新QML中的项目?有多种解决方案,都不涉及"将QImage转换为QUrl"(无论这意味着,您肯定不需要获取携带图像数据的
使用图像提供者
这意味着您可以在QML文件中使用普通的
在QML中,只需将普通的
1 2 3 4 | Image { id: myImage source:"image://providerIdPassedToAddImageProvider/foobar" } |
我们快到了,我们现在只需要一种将映像更新推送到QML世界的方法(否则Image将永远不知道何时更新自身)。有关如何使用
请注意,通常不需要将
使用自定义Qt Quick 2项目
找出将携带新图像的信号连接到物品插槽的方法。
这可能是棘手的部分。
要使用C ++执行连接,您需要一种方法来确定该项目已创建(并获得指向它的指针);通常,这是通过将
或者,可以像上面一样,通过暴露给QML世界的发布者C ++对象上的
1 2 3 4 5 6 7 8 | MyItem { id: myItem } Connections { target: thePublisherObjectExposedFromC++ onNewImage: myItem.setImage(image) } |
无论您何时创建MyItem实例,这都具有工作优势。但我不确定100%会成功,因为我不确定您是否可以处理QML中的
当我想将图像生成的C ++类嵌入到QML中时,我总是通过将C ++类作为
1 2 3 | void MyItem::paint(QPainter* painter,const QStyleOptionGraphicsItem*,QWidget*) { painter->drawImage(QPointF(0.0f,0.0f),_image); } |
如果您已经有合适尺寸的QImage ...并完成了作业。对于动画,只需绘制新内容即可ping update()。
使用QQuickItem。有一个Qt示例可以做到这一点。
C:\ Qt \ Examples \ Qt-5.14.1 \ quick \ scenegraph \ threadedanimation
您可以从QQuickItem派生一个类,并使用qmlRegisterType注册它。
在您的类中提供覆盖函数'updatePaintNode'。在示例中,类为" Spinner"
在updatePaintNode中:
创建从QObject和QSGTransformNode派生的节点类
在节点类构造函数中:
使用createTextureFromImage将Qimage转换为QSGTexture。
创建QSGSimpleTextureNode,使用setTexture设置QSGTexture
具有QSGSimpleTextureNode的appendChildNode
在QML中添加
1 | import Spinner 1.0 |
和
1 2 3 4 5 | Spinner { anchors.centerIn: parent anchors.horizontalCenterOffset: 80 spinning: true } |