无法调用QML函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法调用QML函数相关的知识,希望对你有一定的参考价值。

根据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功能。你能帮我找到问题吗?

提前致谢。

答案

为您的项目指定一个对象名称:

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

以上是关于无法调用QML函数的主要内容,如果未能解决你的问题,请参考以下文章

26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段

从 C++ 插件调用 QML 中的 JS 函数

Qt 使用自定义 QObject 类型调用 qml 函数

如何从片段 KOTLIN 中调用意图 [重复]

QML中未调用函数[关闭]

如何从另一个 QML 文件调用 QML 文件中定义的 Javascript 函数?