QML context of dynamically generated items
-
Hello,
I'm trying to figure out in which context dynamically generated items are being stored?
Therefor let me explain my scenario.First I've registered two new QML types:
@qmlRegisterType<MyViewController>("uicontrollers", 1, 0, "ViewController");
qmlRegisterType<MyTabController>("uicontrollers", 1, 0, "TabController");@Then I used them in qml files:
mainview.qml
@Rectangle {Component { id: tab_factory MyTab {} } TabView { id: a_tabview //some code here ... } ViewController { id: view_controller objectName: "myViewController" onNewTab: { var tab_obj = tab_factory.createObject(a_tabview) var a_tab = a_tabview.addTab(a_name, tab_obj) a_tab.active = true }
}@
MyTab.qml
@Component
{
id: the_tabRectangle { id: tab_frame border.width: 0 property string the_name: "" SplitView { id: a_tab_split // some items here ... } TabController { id: my_tab_controller objectName: "myTabController" Component.onCompleted: { console.log(my_tab_controller) } } }
}
@Dynamic tab creation works fine from my C++ class.
Therefor I use the function described below to find my ViewController and emit newTab signal.
But when I try to find the created TabController in the QML context I get no results:uicontroller.h
@//*****************************************************************************
//** Template FindMyQMLObjects
//*****************************************************************************
template<typename T> QList<T> FindQMLObjects(QString in_name)
{
QList<T> ret;
QList<QObject*> root_obj_list = m_engine.rootObjects();foreach(QObject* obj, root_obj_list) { qDebug() << "root_obj name: " << obj->objectName(); ret = obj->findChildren<T>(in_name, Qt::FindChildrenRecursively); if (ret.size() > 0) break; } return ret;
}
@Any idea where my QML objects are hiding?
Thanks for your help.
Best regards,
Rainer -
Since you are passing the parent as Tab_view, it should be children of the tabview only. It will be in the current context itself. Here is the sample which I tried and it works perfectly.
I suspect that either object is not created or you are not iterating the correct object. Try with following code snippet. It should work
@QQuickView view;
view.setSource(QUrl(QStringLiteral("qrc:///main.qml")));
view.show();QQuickItem *item = view->rootObject();
QQuickItem *obj = qobject_cast<QQuickItem >(item->findChild<QQuickItem>("myObj"));
if (obj)
qDebug() << "My name is ="<<obj->objectName();
@ -
Dheerendra: Thanks for your reply.
Since I'm using
@QQmlApplicationEngine m_engine;@
in my application and searching over all possible rootObjects @QList<QObject*> root_obj_list = m_engine.rootObjects();@
with
@ret = obj->findChildren<T>(in_name, Qt::FindChildrenRecursively);@
I'm quite sure that I'm iterating over all possible Items, e.g. searching the ViewController works fine.Due to log output I'm even quite sure that the TabController item is created correctly.
I have tried some variations to access the TabController from ViewController in qml file:
@
...
var a_tab = a_tabview.addTab(a_name, tab_obj)
...
var a_item = a_tab.item // this is the Rectangle in MyTab.qml
var a_tab_controller = a_tab.TabController // this returns some [object Object] but I don't know how I can access the TabController item within!?!
var res_tab_controller = a_tab.item.resources[0] // this returns the TabController item but I think it's not a proper way to retrieve resources[0]
@This happens before I search the TabController from C++ code.
-
How are you giving object name ? For createObject can you pass the objectName as well ?. You can try some thing like the following and see
@ var obj = component.createObject(parent, {"objectName" :"myObj", "x": 100, "y": 100});@
-
I have defined the objectName in MyTab.qml.
findChildren<>() should return a list of all Items with the given objectName.Any suggestions how I can access the TabController within
@var a_tab_controller = a_tab.TabController@ which returns some
@[object Object]@ ?