The Property System
语法是这样的:
Q_PROPERTY(type name
(READ getFunction [WRITE setFunction] |
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int | REVISION(int[, int])]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[BINDABLE bindableProperty]
[CONSTANT]
[FINAL]
[REQUIRED])
举个例子来说的话:
Q_PROPERTY(bool focus READ hasFocus)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)
上边是一些成员函数(通过成员函数来读写成员变量),如果是想要省略get/set函数的话可以直接对某一个成员变量加上”MEMBER”关键字。
Q_PROPERTY(QColor color MEMBER m_color NOTIFY colorChanged)
Q_PROPERTY(qreal spacing MEMBER m_spacing NOTIFY spacingChanged)
Q_PROPERTY(QString text MEMBER m_text NOTIFY textChanged)
...
signals:
void colorChanged();
void spacingChanged();
void textChanged(const QString &newText);
private:
QColor m_color;
qreal m_spacing;
QString m_text;
举一个现实的例子:
class MyClass : public QObject {
Q_OBJECT
Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)
public:
explicit MyClass(QObject *parent = nullptr) : QObject(parent), m_value(0) {}
int getValue() const { return m_value; }
void setValue(int val) {
if (m_value != val) {
m_value = val;
emit valueChanged(val);
}
}
signals:
void valueChanged(int);
private:
int m_value;
};
// 省略get/set的方式
class MyClass : public QObject {
Q_OBJECT
Q_PROPERTY(int value MEMBER m_value NOTIFY valueChanged)
public:
explicit MyClass(QObject *parent = nullptr) : QObject(parent), m_value(0) {}
signals:
void valueChanged(int); // 变量变化时通知
private:
int m_value;
};
int main(){
MyClass obj;
obj.setProperty("value", 42); // 设置属性
qDebug() << obj.property("value").toInt(); // 读取属性
return 0;
}
好理解吧!