Qt Quick:QML/C++表达式不能用作函数?

qnakjoqk  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(152)

你能看一下并解释一下,我在下面的代码中做错了什么吗?

#ifndef BACKEND_H
#define BACKEND_H

#include <QObject>
#include <QDebug>
#include <QtQml>

class BackEnd : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int player READ player WRITE player_change)
    QML_ELEMENT

    int player;                         
public:
    explicit BackEnd(QObject *parent = nullptr);

signals:
    int player_changed(int player);

public slots:
    int player_change(int player);

};

#endif // BACKEND_H

CPP:

#include "backend.h"

BackEnd::BackEnd(QObject *parent)
    : QObject{parent}
{

}

int BackEnd::player_change(int player)
{
    return (player == 1) ? 2 : 1;
}

错误:

Expression cannot be used as a function

自动编辑的moc文件中出现错误...
删除Q_PROPERTY会使其恢复正常...

nx7onnlm

nx7onnlm1#

错误指出Q_PROPERTY宏不能将成员player用作函数。
如果未指定MEMBER变量,则需要READ访问器函数。它用于阅读属性值。理想情况下,使用const函数来实现此目的,并且它必须返回属性的类型或对该类型的const引用。例如,QWidget::focus是具有READ函数的只读属性,QWidget::hasFocus()。
你需要创建一个getter并将其用作READ函数,或者你可以使用MEMBER
如果未指定READ访问器函数,则需要MEMBER变量关联。这使得给定的成员变量可读和可写,而无需创建READ和WRITE访问器函数。如果需要控制变量访问,除了MEMBER变量关联之外,还可以使用READ或WRITE访问器函数(但不能同时使用两者)。
看看这里。

#ifndef BACKEND_H
#define BACKEND_H

#include <QDebug>
#include <QObject>
#include <QtQml>

class BackEnd : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int foo READ foo WRITE setFoo NOTIFY fooChanged)
    Q_PROPERTY(int bar MEMBER bar NOTIFY barChanged)
    QML_ELEMENT

public:
    explicit BackEnd(QObject *parent = nullptr) : QObject{parent} {}

    int foo() const { return m_foo; }
    void setFoo(int val) { m_foo = val; emit fooChanged(); }   

signals:
    void fooChanged();
    void barChanged();

private:
    int m_foo;
    int bar;
};

#endif // BACKEND_H

相关问题