o
June 8, 2021, 3:46 p.m.

Model не определяется в QQuickWidget

QML, QQuickWidget, Model

проектный файл

  1. QT += core gui quickwidgets widgets
  2.  
  3. CONFIG += c++11
  4.  
  5. # You can make your code fail to compile if it uses deprecated APIs.
  6. # In order to do so, uncomment the following line.
  7. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
  8.  
  9.  
  10. HEADERS += \
  11. widget.h
  12.  
  13. SOURCES += \
  14. main.cpp \
  15. widget.cpp
  16.  
  17. RESOURCES += qml.qrc
  18.  
  19.  
  20. # Additional import path used to resolve QML modules in Qt Creator's code model
  21. QML_IMPORT_PATH =
  22.  
  23. # Additional import path used to resolve QML modules just for Qt Quick Designer
  24. QML_DESIGNER_IMPORT_PATH =
  25.  
  26. # Default rules for deployment.
  27. qnx: target.path = /tmp/$${TARGET}/bin
  28. else: unix:!android: target.path = /opt/$${TARGET}/bin
  29. !isEmpty(target.path): INSTALLS += target
  30.  
  31.  

хедер виджета

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QObject>
  5. #include <QWidget>
  6. #include <QGridLayout>
  7. #include <QStringListModel>
  8.  
  9. #include <QQuickWidget>
  10. #include <QQmlContext>
  11. #include <QQuickItem>
  12.  
  13.  
  14. class Widget : public QWidget
  15. {
  16. Q_OBJECT
  17.  
  18. public:
  19. explicit Widget(QWidget *parent = 0);
  20. ~Widget();
  21.  
  22. private:
  23. QGridLayout *gridLayout;
  24. QQuickWidget *quickWidget;
  25. };
  26.  
  27. #endif // WIDGET_H
  28.  

реализация виджета

  1. #include "widget.h"
  2.  
  3. Widget::Widget(QWidget *parent) :
  4. QWidget(parent)
  5. , gridLayout(new QGridLayout(this))
  6. , quickWidget (new QQuickWidget(this))
  7. {
  8. quickWidget->setSource(QUrl("qrc:/main.qml"));
  9. quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
  10. gridLayout->addWidget(quickWidget, 1, 0);
  11.  
  12. // Добавление модели в qml
  13. QQmlContext *rootQMLcontext = quickWidget->rootContext();
  14. QQuickItem *rootObj = quickWidget->rootObject();
  15. QObject *objListView = rootObj->findChild<QObject *>("ListView");
  16.  
  17.  
  18. if (objListView)
  19. {
  20. QStringList lst;
  21.  
  22. for (int i = 0; i < 100; ++i)
  23. {
  24. lst << "Item" + QString::number(i);
  25. }
  26. QStringListModel *pmodel = new QStringListModel(quickWidget);
  27. pmodel->setStringList(lst);
  28.  
  29. rootQMLcontext->setContextProperty("myModel", pmodel);
  30. }
  31.  
  32. this->setLayout(gridLayout);
  33.  
  34. }
  35.  
  36. Widget::~Widget()
  37. {
  38.  
  39. }
  40.  

main.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 2.1
  3. import QtQuick.Layouts 1.12
  4.  
  5. Item {
  6.  
  7. anchors.fill: parent
  8.  
  9. GridLayout
  10. {
  11. id: grid
  12. x: 20
  13. y: 20
  14. columnSpacing: 10
  15. rows: 10
  16. columns: 1
  17. Button{
  18. id: button
  19. text: "hello!"
  20. Layout.row: 0
  21. Layout.column: 0
  22. }
  23.  
  24. ListView {
  25. objectName: "ListView"
  26. model: myModel
  27. delegate: Text {text: model.display}
  28. Layout.row: 1
  29. Layout.column: 0
  30. Layout.rowSpan: 8
  31. }
  32. }
  33.  
  34. }

main.cpp

  1. #include <QApplication>
  2. #include <QMainWindow>
  3. #include "widget.h"
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication app(argc, argv);
  8. QMainWindow m;
  9. auto qmlMainWidget = new Widget(&m);
  10. m.setCentralWidget(qmlMainWidget);
  11. m.show();
  12. return app.exec();
  13. }
  14.  

ошибка

  1. QML debugging is enabled. Only use this in a safe environment.
  2. qrc:/main.qml:14: ReferenceError: myModel is not defined

Почему есть ошибка?
ListView поверх кнопки, не смотря на GridLayout

2
The question is asked by the articleQML - Lesson 024. Custom QQuickItem – How to add QML object from C++

Do you like it? Share on social networks!

2
Алексей Внуков
  • June 8, 2021, 5:52 p.m.

c таким оформлением даже не хочу начинать смотреть код

    o
    • June 8, 2021, 6:27 p.m.

    на нет и суда нет.

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      • Last comments
      • AK
        April 1, 2025, 11:41 a.m.
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        March 9, 2025, 9:02 p.m.
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        March 9, 2025, 4:14 p.m.
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        Nov. 22, 2024, 9:51 p.m.
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      • Evgenii Legotckoi
        Oct. 31, 2024, 11:37 p.m.
        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup