【发布时间】: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 的那个(子)函数?