【问题标题】:Fail to invoke QML function调用 QML 函数失败
【发布时间】:2017-12-18 13:28:59
【问题描述】:

根据http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html“调用QML方法”一章,我尝试从C++调用main.qml中的bbox函数。

这是我的代码:

main.qml

import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6

Window {
    width: 512
    height: 512
    visible: true

    Item{
        anchors.fill: parent

        Plugin{
            id: osmplugin
            name: "osm"
        }

        Map {
            anchors.fill: parent
            id: map
            plugin: osmplugin;
            zoomLevel: (maximumZoomLevel - minimumZoomLevel)/2
            center {
                // The Qt Company in Oslo
                latitude: 59.9485
                longitude: 10.7686
            }
        }
        Component.onCompleted:{
            console.log("zoomlevel : " + map.zoomLevel)
            console.log("Visible region : " + map.visibleRegion)
        }

        function bbox(){
            return map.visibleRegion;
        }
    }

}

和 main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include <QGeoRectangle>
#include <QQmlComponent>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlComponent component(&engine, "qrc:/main.qml");

    QObject *map = component.create();
    QVariant ret;

    bool ok = QMetaObject::invokeMethod( map, "bbox",  Qt::DirectConnection, Q_RETURN_ARG( QVariant, ret ) );

    if ( !ok ){
        qWarning( "Fail to call qml method" );
    }
    QGeoRectangle rect = qvariant_cast<QGeoRectangle>( ret );

    return app.exec();
}

我收到以下错误消息:

"QMetaObject::invokeMethod: 没有这样的方法 QQuickWindow::bbox()"

似乎没有找到 bbox 功能。你能帮我找出问题吗?

提前致谢。

【问题讨论】:

  • 好吧 bbox() 不是您的地图(c++)的方法。只需将它从项目移动到窗口。
  • 正确,谢谢,它有效。所以,如果我必须让这个函数在 Item 中(例如),什么是正确的代码来访问 Item 的那个(子)函数?

标签: qt qml


【解决方案1】:

给你的项目一个对象名称:

Item{
    anchors.fill: parent
    objectName: "bboxObj"

    function bbox(){
        return map.visibleRegion;
    }
}

在 C++ 中,使用对象名称获取您的对象:

QObject *map = component.create();
QObject *bboxObj= map->findChild<QObject*>("bboxObj");

并调用方法:

if (bboxObj)
    ok = QMetaObject::invokeMethod( bboxObj, "bbox",  Qt::DirectConnection,    Q_RETURN_ARG( QVariant, ret ) );

【讨论】:

  • 非常感谢你们两个。对我来说再迈出一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 2015-09-27
  • 2021-04-09
相关资源
最近更新 更多