o
Маусым 8, 2021, 3:46 Т.Қ.

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

QML, QQuickWidget, Model

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

QT += core gui quickwidgets widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


HEADERS += \
    widget.h

SOURCES += \
        main.cpp \
        widget.cpp

RESOURCES += qml.qrc


# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


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

#ifndef WIDGET_H
#define WIDGET_H

#include <QObject>
#include <QWidget>
#include <QGridLayout>
#include <QStringListModel>

#include <QQuickWidget>
#include <QQmlContext>
#include <QQuickItem>


class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    QGridLayout *gridLayout;
    QQuickWidget *quickWidget;
};

#endif // WIDGET_H

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

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
  , gridLayout(new QGridLayout(this))
  , quickWidget (new QQuickWidget(this))
{
    quickWidget->setSource(QUrl("qrc:/main.qml"));
    quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
    gridLayout->addWidget(quickWidget, 1, 0);

    // Добавление модели в qml
    QQmlContext *rootQMLcontext = quickWidget->rootContext();
    QQuickItem *rootObj = quickWidget->rootObject();
    QObject *objListView = rootObj->findChild<QObject *>("ListView");


    if (objListView)
    {
        QStringList  lst;

        for (int i = 0; i < 100; ++i)
        {
            lst << "Item" + QString::number(i);
        }
        QStringListModel *pmodel = new QStringListModel(quickWidget);
        pmodel->setStringList(lst);

        rootQMLcontext->setContextProperty("myModel", pmodel);
    }

    this->setLayout(gridLayout);

}

Widget::~Widget()
{

}

main.qml

import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.12

Item {

    anchors.fill:  parent

    GridLayout
    {
        id: grid
        x: 20
        y: 20
        columnSpacing: 10
        rows: 10
        columns: 1
        Button{
            id: button
            text: "hello!"
            Layout.row: 0
            Layout.column: 0
        }

        ListView {
                    objectName: "ListView"
                    model: myModel
                    delegate: Text {text: model.display}
                    Layout.row: 1
                    Layout.column: 0
                    Layout.rowSpan: 8
                }
       }

}

main.cpp

#include <QApplication>
#include <QMainWindow>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QMainWindow  m;
    auto qmlMainWidget = new Widget(&m);
    m.setCentralWidget(qmlMainWidget);
    m.show();
    return app.exec();
}

ошибка

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

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

2
Сұрақ мақалада қойыладыQML - 024-сабақ. Custom QQuickItem - C ++ тілінен QML-ге нысан қосу

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

2
Алексей Внуков
  • Маусым 8, 2021, 5:52 Т.Қ.

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

    o
    • Маусым 8, 2021, 6:27 Т.Қ.

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

      Пікірлер

      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
      Кіріңіз немесе Тіркеліңіз