You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 03:10:37