首页 > 解决方案 > 如何集成 c++ 和 qml。不能使用来自 QML 的属性

问题描述

错误:无法分配给不存在的属性“setScale”

这是我的课。

C++ 头文件

#include <QObject>
#include <QtQuick>

class Scene : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(int scale READ scale WRITE setScale)
public:
Scene();
void scaleChanged(int _val);

int scale() const;
void setScale(const int &scale);

protected:
int m_scale;

};

C++ 源代码

#include "Scene.h"

void Scene::scaleChanged(int _val)
{
m_scale = _val;
qDebug()<<_val;
update();
}

int Scene::scale() const
{
return m_scale;
}

void Scene::setScale(const int &scale)
{
m_scale = scale;
qDebug()<<scale;
}

qml文件

 Rectangle {
    id: drawArea
    color: "#ffffff"
    Scene {
        id: drawScene
        anchors.fill: parent
        anchors.centerIn: parent
        scale: 1
    }
}

Slider {
    id: slider
    value: 1
    onMoved: drawScene.setScale = value
}

我尝试使用滑块更改 Paint 的比例,但出现错误 qrc:/Page1Form.ui.qml:64: Error: Cannot assign to non-existent property "setScale" F

标签: c++qtqml

解决方案


drawScene.setScale应该是drawScene.scale:该属性被命名scalesetScale是它的二传手。

scaleChanged应该是一个信号,您必须将其添加到您的属性中(使用NOTIFY)。当scale的值发生变化时,它将被发出。

Q_PROPERTY(int scale READ scale WRITE setScale NOTIFY scaleChanged)
signals:
void scaleChanged(int val);

slots:
void debugScale(int val);

接着:

QObject::connect(this, &Scene::valueChanged,
                     this, &Scene::debugScale);

void Scene::debugScale(int val)
{
qDebug()<<_val;
update();
}

推荐阅读