2017-01-17 7 views
1

У меня есть QQuickView, который загрузил qml-файл, как показано ниже.Как получить имя экземпляра QObject для разбора QML?

Rectangle { width: 100; height: 100 } 

Затем я возвращаю корневой объект через QObject *root = view->rootObject(). Теперь я хочу получить имя класса из этого объекта. Следующий код приводит к «QQuickRectangle»

root->metaObject()->className() 

Но то, что я хочу «Прямоугольник» так же, как TypeName в файле QML. Любая идея?

Редактировать: Я хочу построить древовидное изображение с объектом hirarchie файла qml, такого как QtCreator.

enter image description here

ответ

1

Существует закономерность там, для типов QML, реализованных в C++ имя будет QQuickSomething для типов QML, реализованных в QML название будет Something_QMLTYPE_X_MAYBEMORESTUFF(objAddress).

Таким образом, вы можете сделать некоторые основные функции редактирования строки в зависимости от результата вы получите, чтобы изолировать фактическое имя типа:

QString name = QString(root->metaObject()->className()); 
if (name.contains("QQuick")) name.remove("QQuick"); 
else if (name.contains("QMLTYPE")) name.remove(QRegExp("_QMLTYPE_[0-9]*.*")); 
// else it might be just a QObject or your on custom type you should handle 

Edit: Я хочу построить TreeView с объекта hirarchie из в QML файл, такой как QtCreator.

Если вы не захотите вникать в частные API и использовать их, вероятно, будет проще и полезнее иметь собственную модель для управления как представлением, так и фактическим деревом объектов. Кроме того, QML довольно легко разобрать, я лично буду прятать и писать анализы быстрее, чем мне понадобится, чтобы попасть в существующий, особенно если все, что нужно, это контур дерева объектов, но YMMV.

+0

Если у меня есть пользовательский тип QML, например 'Test.qml', где' Item' является корневым элементом, 'console.log() 'печатает его как' qml: QQuickItem (0x2a63b050) 'не как' Test_QMLTYPE_X', поэтому я теряю тип в этом случае. Протестировано с Qt 5.7.0, MinGW. – folibis

+0

Имя класса C++ и имя типа QML не должны иметь никакого отношения. 'qmlRegisterType()' принимает произвольную строку (до тех пор, пока она является допустимым именем типа) в качестве ее четвертого аргумента –

+0

@folibis - это странно, для меня она всегда печатает QMLTYPE независимо от того, что является корневым элементом и как оно реализованы. – dtech

0

QtQuick не предоставляет некоторые специальные метаданные для QML элементов. Похоже, что QtQuick использует типы элементов внутри себя только при разборе источника. известный обходной путь является objectName:

Rectangle { 
    objectName: "Rectangle" 
} 

и так:

QString className = item->objectName(); 
+0

Уверены ли вы в этом. 'console.log (someObj)' указывает на другое. Также 'objectName' реализуется полностью в' QObject', поэтому к нему можно обращаться напрямую, а не к значительно более медленному поисковому запросу строки и варианту преобразования. – dtech

+0

Да, 'console.log()' выводит metainfo объекта C++, как и все другие классы Qt, полученные из 'QObject', в этом случае' QQuickRectangle', точно так же, как 'metaObject() -> className()' делает это. Вы не можете получить имя типа QML, например 'Item',' Rectangle' или 'MyItem' – folibis

+0

. Для qml-определённых типов для моего типа' T_Root.qml' вывод на консоль говорит 'T_Root_QMLTYPE_18', поэтому очевидно, что информация типа qml. – dtech

2

На нем содержится «лучшая» информация (QQmlType & QQmlMetaType), но она недоступна через любой публичный API, о котором я могу думать.

Не могли бы вы объяснить, что вы хотели бы сделать с этим? Может быть, есть альтернатива.

+0

Я работаю над приложением qml designer, и я хочу заполнить древовидную структуру, такую ​​как навигатор из QtCreator. Может быть, есть qml-parser? –

+0

Собственный парсер QtQuick находится по адресу https://github.com/qt/qtdeclarative/tree/dev/src/qml/parser. Из того, что я помню, я думаю, что Творец использует копию этого, адаптированного для себя, - но я мало знаю о Создателе, поэтому я могу ошибаться. Файл .g, вероятно, станет хорошим местом для поиска «правил». –