【问题标题】:Access a member function using QQuickWindow使用 QQuickWindow 访问成员函数
【发布时间】:2015-05-01 15:01:53
【问题描述】:

我已将 ObjectName 设置为 main 中的一个类,并希望从另一个类访问该对象:

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 p 的类:

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 的任何成员,可能是因为指针,我如何才能访问对象 p 中的函数?

【问题讨论】:

  • p 实际上是一个有效指针而不是空指针吗?
  • 是的,我刚刚检查了它是 NULL,这意味着我试图从 QQuickWindow 获得正确的对象
  • 我还检查了 p 实例不是子实例,因为我在 QQuickWindow 中打印了每个子对象的所有对象名称,它没有显示我在实例 p 的主函数中设置的指定对象名称跨度>

标签: qt qml qimage


【解决方案1】:

您可以将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();
}

那你就不用搜索object children了,直接访问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; 
}

【讨论】:

  • 这个 p 对象将在 QML 中更新,它将是 imageprovider 类中的同一个实例,对吧?
  • 是的:Q_PROPERTY(PageBuffer *pageBuffer READ // etc ...)
  • 非常感谢! ,它无需设置属性即可工作
猜你喜欢
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多