QML游戏教程中调用Controller类的moveLeft/moveRight函数触发TypeError错误求助
QML游戏教程中调用Controller类的moveLeft/moveRight函数触发TypeError错误求助
我仔细看了你的代码,问题根源出在Controller类的成员访问权限设置上!QML无法直接调用C++类的私有成员函数,而你把和属性相关的读取/设置函数,以及moveLeft()、moveRight()这两个可调用函数,都放在了类的默认私有区域里,这就导致QML找不到这些函数,触发了TypeError。
修复后的controller.h代码:
#ifndef CONTROLLER_H #define CONTROLLER_H #include <QObject> class Controller : public QObject { Q_OBJECT Q_PROPERTY(double x READ x WRITE setX NOTIFY xChanged) Q_PROPERTY(double y READ y WRITE setY NOTIFY yChanged) public: Controller(QObject *parent = nullptr); // 属性读取和设置函数放到public区域 double x(){return m_x;} double y(){return m_y;} void setX(double val){if(m_x != val){m_x = val;emit xChanged();}} void setY(double val){if(m_y != val){m_y = val;emit yChanged();}} // Q_INVOKABLE函数也放到public区域,让QML可以访问 Q_INVOKABLE void moveLeft(){setX(m_x - m_xSpeed);} Q_INVOKABLE void moveRight(){setX(m_x + m_xSpeed);} signals: void xChanged(); void yChanged(); private: double m_x; // current position on x axis double m_y; // current position on y axis double m_xSpeed; //speed of movement on x }; #endif // CONTROLLER_H
关键修改点说明:
- 在类中添加了
public:访问修饰符,把构造函数、属性的读写函数,以及Q_INVOKABLE标记的moveLeft()、moveRight()都放到了公共区域。 - C++类中,默认的成员访问权限是
private,所以必须显式声明public才能让外部(包括QML)访问这些成员。
其他部分的代码(main.cpp、main.qml、CMakeLists.txt)都是没问题的,修改完controller.h之后,重新编译运行,按下A/D键应该就能正常触发左右移动的逻辑了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

