0
根據http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html一章「調用QML方法」,我嘗試從C++調用main.qml中的bbox函數。未能調用QML函數
這裏是我的代碼:
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的那個(子)函數? – kontiki