Подключите модуль C ++ к QML - ReferenceError: <blank>не определено - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть база данных, полная альбомов, и я хочу отобразить эти альбомы в GridView.Я создал файл qml, который использует персонализированный модуль (albumObject.h) для получения данных из базы данных.Поскольку у меня уже есть MainWindow в main.cpp, мне нужно отобразить GridView в QQuickWidget, который создан внутри файла mainwindow.cpp.Вот код:

albumObject.h

class AlbumObject : public QObject {
  Q_OBJECT

  Q_PROPERTY(QString artist READ getArtist)
  Q_PROPERTY(QString album READ getAlbum)
  Q_PROPERTY(QString date READ getDate)
  Q_PROPERTY(QString img READ getImg)

public:
  AlbumObject(QObject* parent = nullptr);

  const QString getArtist() const;
  const QString getAlbum() const;
  const QString getDate() const;
  const QString getImg() const;

  void setArtist(const QString& artist);
  void setAlbum(const QString& album);
  void setDate(const QString& date);
  void setImg(const QString& img);


private:
  QString m_artist;
  QString m_album;
  QString m_date;
  QString m_img;
};

mainwindow.cpp

Я использую это соединение внутриКонструктор MainWindow для обновления пользовательского интерфейса при добавлении всех альбомов в базу данных

  connect(&databaseManager, &DatabaseManager::albumAddedToDB,
          &databaseManager, [&]() {
    QList<QObject*> albums = databaseManager.getAlbumsFromDB();

    QQuickView view;
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    QQmlContext *ctxt = view.rootContext();
    ctxt->setContextProperty("albumModel", QVariant::fromValue(albums));
    ui->albumGrid->setSource(QUrl{"../Hallownest/Model/something.qml"});
    ui->albumGrid->createWindowContainer(&view, this);
  });

нечто.qml

import QtQuick 2.4

Rectangle {
    width: 800; height: 600

    Component {
        id: albumDelegate
        Item {
            width: grid.cellWidth; height: grid.cellHeight
            Column {
                anchors.fill: parent
                Text { text: artist; anchors.horizontalCenter:  parent.horizontalCenter }
                Text { text: album; anchors.horizontalCenter:  parent.horizontalCenter }
                Text { text: date; anchors.horizontalCenter:  parent.horizontalCenter }
            }
        }
    }

    GridView {
        id: grid
        anchors.fill: parent
        cellWidth: 150; cellHeight: 150

        model: albumModel
        delegate: albumDelegate
        highlight: Rectangle {color: "lightsteelblue"; radius: 5 }
        focus: true;
    }
}

Когда я запускаю программу, я получаю этоошибка:

ReferenceError: albumModel is not defined

В подобных вопросах у большинства пользователей возникает эта проблема, поскольку они устанавливают контекст после загрузки файла qml, но это не мой случай.

1 Ответ

0 голосов
/ 26 декабря 2018

Проблема в вашем случае заключается в том, что вы создаете QQuickView без необходимости думать, что таким образом вы получите QQmlContext, но это не правильно, у QQuikWidget уже есть свой собственный QQmlContext.С другой стороны, лучше, чтобы список был свойством и экспортировал MainWindow, чтобы вы могли получить к нему доступ.

*. H

class MainWindow : public QMainWindow
{
    Q_OBJECT
    Q_PROPERTY(QList<QObject *> albums READ getAlbums NOTIFY albumsChanged)

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QList<QObject *> getAlbums() const;
    void updateAlbums();
signals:
    void albumsChanged();
private:
    Ui::MainWindow *ui;
    QList<QObject *> m_albums;
    DatabaseManager databaseManager;
};

*. cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->albumGrid->rootContext()->setContextProperty("mainwindow", this);
    ui->albumGrid->setSource(QUrl{"../Hallownest/Model/something.qml"});
    connect(&databaseManager, &DatabaseManager::albumAddedToDB, this, &MainWindow::updateAlbums);
}

MainWindow::~MainWindow()
{
    delete ui;
}

QList<QObject *> MainWindow::getAlbums() const
{
    return m_albums;
}

void MainWindow::updateAlbums()
{
    qDeleteAll(m_albums);
    m_albums.clear();
    m_albums = databaseManager.getAlbumsFromDB();
    emit albumsChanged();
}

*. qml

import QtQuick 2.4

Rectangle {
    width: 800; height: 600

    Component {
        id: albumDelegate
        Item {
            width: grid.cellWidth; height: grid.cellHeight
            Column {
                anchors.fill: parent
                Text { text: modelData.artist; anchors.horizontalCenter:  parent.horizontalCenter }
                Text { text: modelData.album; anchors.horizontalCenter:  parent.horizontalCenter }
                Text { text: modelData.date; anchors.horizontalCenter:  parent.horizontalCenter }
            }
        }
    }

    GridView {
        id: grid
        anchors.fill: parent
        cellWidth: 150; cellHeight: 150
        model: mainwindow.albums
        delegate: albumDelegate
        highlight: Rectangle {color: "lightsteelblue"; radius: 5 }
        focus: true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...