Ответы пользователя по тегу QML
  • Почему parent->findchild("") не находит объекты, созданные Repeater'ом?

    MaxQwerty
    @MaxQwerty
    Linux, C++, Pyton, ML
    Можете воспользоваться данным примером, чтобы получить полный дамп по объектам свойствам в дереве QML-объектов:
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <QMetaProperty>
    #include <QList>
    
    #include <QDebug>
    
    void dumpQmlItemProperties(QObject* qmlItem)
    {
        const QMetaObject* metaObj = qmlItem->metaObject();
        qDebug() << metaObj->className();
        for(int i=0; i<metaObj->propertyCount(); ++i)
        {
            QMetaProperty prop = metaObj->property(i);
            qDebug()
                     << prop.name()
                     << prop.read(qmlItem);
        }
    }
    
    void dumpQmlObjectsTree(QList<QObject*> qmlItems)
    {
        QList<QObject*>::iterator it = qmlItems.begin();
        while(it != qmlItems.end())
        {
            qDebug() << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>";
            dumpQmlItemProperties(*it);
            qDebug() << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<";
            dumpQmlObjectsTree((*it)->children());
            ++it;
        }
    }
    
    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
        dumpQmlObjectsTree(engine.rootObjects());
        return app.exec();
    }
    Ответ написан
    Комментировать
  • Как сделать двунаправленный биндинг(связь) между Qt (C++) и QML?

    MaxQwerty
    @MaxQwerty
    Linux, C++, Pyton, ML
    Вам нужно использовать не
    engine.rootObjects().at(0)->setProperty("appCore", qVariantFromValue(appCore));
    а пробросить этот AppCore как новый компонент:
    //это должно быть до строки 
    //QQmlApplicationEngine engine;
    qmlRegisterType<AppCore>("com.myown.project", 1, 0, "AppCore");

    Потом в QML-файле объявляете
    import com.myown.project 1.0
    и можете использовать элемент AppCore как обычный. так как он прямой потомок от QObject, то он будет невидимым, подобно обычному QtObject. Но теперь вам доступно для биндинга его свойство AppCore:
    AppCore
    {
        id: appCoreId
        val1: 100500;
    }

    Теперь, нужно достать инстанс этого класса обратно в С++. Для этого можно использовать поиск по id:
    //создавать придётся именно так:
    QQmlEngine engine;
    QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:/main.qml")));
    QObject *object = component.create();
    
    //получаем созданный на стороне  QML истанс класса AppCore
    AppCore* appCore = object->findChild<AppCore*>("appCoreId");


    Более подробно можно почитать тут:
    doc.qt.io/qt-5/qtqml-cppintegration-topic.html
    Ответ написан
    1 комментарий
  • Где можно почитать про MVC парадигму в QML для чайников?

    MaxQwerty
    @MaxQwerty
    Linux, C++, Pyton, ML
    Если есть знание английского, загляните сюда:
    https://qmlbook.github.io/en/ch06/index.html
    Вообще, монументальный труд, раскрывающий очень много сторон в QML.
    Ответ написан
  • Как обработать websocket в qml?

    MaxQwerty
    @MaxQwerty
    Linux, C++, Pyton, ML
    При срабатывании сигнала onClientConnected у вас есть объект webSocket - его-то и можно использовать для какого-нибудь ассоциативного контейнера, в котором будут хранится все соединённые сокеты-клиенты. Для инициализации такого контейнера лучше обработать сначала сигнал clientConnected.
    Ответ написан
    2 комментария