gpt4 book ai didi

c++ - 将 QImage 与 QQuickImageProvider 一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:33 26 4
gpt4 key购买 nike

我已经创建了一个继承QQuickImageProvider类的类,但我想使用 QQuickImageProvider 的 requestImage() 函数来设置 QImage 变量,但我不知道该怎么做,因为我需要类对象中的 QImage 变量,该类对象已在 QML 中定义从 ContextProperty 并希望使用 id 变量作为索引值来从列表中检索 QImage。主要功能代码如下:

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ImageProvider *imageProvider = new ImageProvider;
QQmlApplicationEngine engine;
PageBuffer p;
engine.rootContext()->setContextProperty("p",&p);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.addImageProvider("images", imageProvider);

return app.exec();
}

PageBuffer p 包含一个 QImages 列表,当用户选择了列表的某个索引值时,我需要使用 QQuick ImageProvider 呈现这些列表。这是我想将索引值传递给图像提供者的 QML 代码片段,它显示了一个图像元素,该元素将显示保存在 PageBuffer 对象中的 Qimages 列表中的元素之一:

    Image{
x: 4
y: 4
height : imagerec.height
visible: true
width : imagerec.width
anchors.fill: imagerec
source:fileUrl
Text{
id:txt
x: 0
y: 71
text:"Sketch"+(index+1)
horizontalAlignment: txt.AlignHCenter
font.family: "Tahoma"
color:"#ffffff"

}

MouseArea {
anchors.rightMargin: -59
anchors.bottomMargin: -39
anchors.fill: parent
onClicked: {
p.index=index;
p.image=mod.get(index).fileUrl
images.image=p.img
// main.source="image://image/1"

// main.source=p.image

// console.log(mod.get(index).fileUrl)
// main.source=p.image;

// currentimage=m.image;
}
}
}

最佳答案

您可以在 C++ 代码中设置 pobjectName。假设此名称是 MyObject。所以现在您可以将此名称(作为字符串)传递给您的图像提供程序(在本例中为 imageprovider):

main.source="image://imageprovider/MyObject"

据我了解,您已经拥有自己的类,派生自 QQuickImageProvider 并覆盖了 requestImage。在您的情况下,id 将是 "MyObject"。所以现在你可以很容易地通过它的 objectName 获得真正的类:

QQuickWindow *window = qobject_cast<QQuickWindow*>(engine.rootObjects()[0]);    
PageBuffer *p = window->findChild<PageBuffer *>(id);

我不确定访问根项目,请自行检查。

更新:

您可以将 ImageProvider 声明为:

图像提供者.h

class ImageProvider : public QQuickImageProvider
{
public:
ImageProvider (QQmlEngine *engine,ImageType type, Flags flags = 0);
private:
QQmlEngine *m_engine;
}

图像提供者.cpp

ImageProvider ::ImageProvider (QQmlEngine *engine, ImageType type, Flags flags)  :
QQuickImageProvider(type,flags),
m_engine(engine)
{
}

QImage ImageProvider ::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
QQuickWindow *window = qobject_cast<QQuickWindow*>(m_engine.rootObjects()[0]);
PageBuffer *p = window->findChild<PageBuffer *>(id);
// do with p what you want
}

主要.cpp

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
ImageProvider *imageProvider = new ImageProvider(&engine,QQmlImageProviderBase::Image,0);
PageBuffer p;
engine.rootContext()->setContextProperty("p",&p);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.addImageProvider("images", imageProvider);
return app.exec();
}

关于c++ - 将 QImage 与 QQuickImageProvider 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929643/

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