2015-05-01 1 views
0

Я поставил ObjectName к классу в основных и хочу получить доступ к этому объекту из другого класса:Доступ к функции члена с помощью QQuickWindow

main.cpp

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

return app.exec(); 
} 

Класса, где я пытаюсь получить доступ PageBuffer р от:

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 *>("Object"); 
    cout<<p->current_box; //error at runtime 
    QImage e; 
    e.load("Pic4.jpg"); 
    return e; 
} 

Но я не могу показаться, чтобы получить доступ к любому члену объекта PageBuffer, возможно, из-за указатели, как может я могу получить доступ к функции из объекта р?

+0

Является 'p' на самом деле действительный указатель, а не нуль? – Mitch

+0

Да, это NULL, я только что проверил, значит, я хочу получить правильный объект из QQuickWindow – Javeria

+0

Я также проверил, что p-экземпляр не является дочерним, поскольку я напечатал все имена объектов каждого дочернего элемента в QQuickWindow, который не показывает указанный который я установил в основной функции для экземпляра p – Javeria

ответ

0

Вы можете просто ввести pageBuffer член в ImageProvider:

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

    return app.exec(); 
} 

Тогда вам не нужно искать объект детей, вы можете получить доступ к pageBuffer непосредственно:

QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) 
{ 
    QQuickWindow *window = qobject_cast<QQuickWindow*>(m_engine->rootObjects()[0]); 
    PageBuffer *p = pageBuffer(); 
    cout << p->current_box; 
    QImage e; 
    e.load("Pic4.jpg"); 
    return e; 
} 
+0

Этот p-объект будет обновлен в QML, он будет тем же самым экземпляром в классе imageprovider? – Javeria

+0

Yep: 'Q_PROPERTY (PageBuffer * pageBuffer READ // и т. Д.)' – Mitch

+0

Yeh благодарит много! , он работает без настройки свойства – Javeria