2015-04-28 2 views
2

Я создал класс, который наследует QQuickImageProvider класс, , но я хочу использовать requestImage() функцию QQuickImageProvider установить переменную QImage, но я не знаю, как сделать это, как мне нужно, что Qimage переменную из объект класса, который был обработан в QML из ContextProperty и хочет использовать переменную id в качестве значений индекса для извлечения QImage из списка. Вот основной код функции:Использование QImage С QQuickImageProvider

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 р содержит список QImages, что мне нужно представить с помощью QQuick ImageProvider, когда определенное значение индекса для списка был выбран пользователем. Вот фрагмент кода QML, в котором я хочу передать значение индекса в imageprovider, он отображает элемент изображения, который отображает один из элементов из списка Qimages, который сохраняется в объекте PageBuffer:

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; 
         } 
        } 
       } 

ответ

1

Вы можете установить objectName из p в код C++. Предположите, что это имя MyObject. Итак, теперь вы можете передать это имя (как строка) к поставщику изображения (imageprovider в данном случае):

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

Как я понимаю, у вас уже есть свой собственный класс, полученный из QQuickImageProvider и overided requestImage. В вашем случае id будет "MyObject". Итак, теперь вы легко можете получить реальный класс по ИТС objectName:

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

Я не уверен, что с доступом к корневой элемент, проверить это самостоятельно, пожалуйста.

ОБНОВЛЕНО:

Вы можете объявить ImageProvider как:

imageprovider.h

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

imageprovider.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 
} 

main.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(); 
} 
+0

Можете ли вы объяснить еще одну вещь? переменная двигателя здесь была объявлена ​​в main.cpp, как я буду использовать ее в функции requestimage? – Javeria

+0

вы можете передать ссылку на QQuickEngine через конструктор ImageProvider и сохранить его в частном члене внутри класса – folibis

+0

Я объявил объект ImageProvdier «ImageProvider * imageProvider = new ImageProvider;» Можете ли вы объяснить, как я должен ссылаться на нее? – Javeria

Смежные вопросы