QML: использование сигнала cpp в QML всегда приводит к выводу «Невозможно назначить не -существующее свойство"
К сожалению, это не помогло. (Как и любое другое решение, которое я мог найти на форумах stackoverflow/google/qt и т. д.)
Я постоянно получал следующие две ошибки:
qrc:/view.qml:30:9: Соединения QML: невозможно назначить несуществующему
свойству "onNewFrameReceived" qrc:/view.qml:31: ReferenceError:
imageProvide не определен
Вот мой код (отредактированный до превратите его в «Минимальный рабочий пример»).
Важными должны быть только следующие файлы:
- main.cpp
- view.qml
- imageprovidervm.cpp
- imageprovidervm.h
Вопрос 1. Итак, я не понимаю, почему даже после установки свойства context в main.cpp, появляется следующая ошибка.
qrc:/view.qml:31: ReferenceError: imageProvide не определено
Что смешно, intellisense/autocomplete, кажется, полностью правильно определяет imageProvide.
Q2. Несмотря на то, что в моем imageprovider.h я добавлены свойства (newimage) и сигналы (newFrameReceived), которые должны быть видны в файле qml, но я все равно получаю следующую ошибку. Кроме того, Qt intellisense/autocomplete не может показать здесь определенный мной сигнал (onNewFrameReceived).
qrc:/view.qml:30:9 : QML-соединения: невозможно назначить несуществующему
свойству "onNewFrameReceived"
- Дополнительная информация: Отладка и остановка на точке останова в файле qml в строке 31 показывает в «локальных значениях и выражениях» qtcreator, что здесь доступны только 2 сигнала, а именно "objectNameChanged" и "targetChanged".
Почему ???
#include
#include
#include
#include "imageprovidervm.h"
#include "imagesource.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
QQmlContext *context = new QQmlContext(engine.rootContext());
auto model = std::make_shared();
auto vm = new ImageProviderVM(model);
engine.addImageProvider(QLatin1String("imageProvider"), vm);
context->setContextProperty("imageProvide", vm );
model->generateImages();
engine.load(QUrl(QStringLiteral("qrc:/view.qml")));
return app.exec();
}
view.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQml.Models 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Window 2.0
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("&Open")
onTriggered: console.log("Open action triggered");
}
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}
Rectangle {
Connections {
target: imageProvide
onNewFrameReceived: image.reload();
}
anchors.fill: parent
Column {
Image {
id: image
source: "image://imageProvider/images.jpeg?id=" + Math.random()
cache: false
asynchronous: true
function reload() {
var oldSource = source;
source = "";
source = oldSource;
}
}
}
}
Label {
text: qsTr("Hello World")
anchors.centerIn: parent
}
}
imageprovidervm.h
#ifndef IMAGEPROVIDERVM_H
#define IMAGEPROVIDERVM_H
#include
#include
#include "imagesource.h"
class ImageProviderVM : public QObject, public QQuickImageProvider
{
Q_OBJECT
public:
ImageProviderVM(std::shared_ptr model);
~ImageProviderVM();
virtual QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override;
virtual QImage requestImage(const QString & id, QSize * size, const QSize & requestedSize) override;
// Properties
Q_PROPERTY(QImage newimage READ getNewImage NOTIFY newFrameReceived)
// Signals
signals:
void newFrameReceived();
private:
QImage getNewImage() const;
QPixmap m_pixmap;
QImage m_image;
std::shared_ptr m_model;
};
#endif // IMAGEPROVIDERVM_H
imageprovidervm.cpp
#include "imageprovidervm.h"
#include
#include
#include
ImageProviderVM::ImageProviderVM()
: QQuickImageProvider(QQuickImageProvider::Image)
{
}
ImageProviderVM::ImageProviderVM(std::shared_ptr model)
: QQuickImageProvider (QQuickImageProvider::Image)
, m_pixmap()
, m_model(model)
{
m_model->subscribeNewPixMap([this](QPixmap pixmap) {
qDebug()
Подробнее здесь: https://stackoverflow.com/questions/433 ... opposite-b