Qt:如何在 C++ 端而不是 QML 上监视 Q_PROPERTY 更改
Qt : How to monitor a Q_PROPERTY change on C++ side instead of QML
我正在使用 Qt 5.9.3。我在我的应用的 main.qml
中声明了以下 属性
代码:
//main.qml
MyQuickItem {
property color nextColor
onNextColorChanged: {
console.log("The next color will be: " + nextColor.toString())
}
}
// MyQuickItem.h
class MyQuickItem : public QQuickItem {
}
问题:
如何在 C++ 端定义 onNextColorChanged
?
我知道我也可以在 C++ class MyQuickItem
中将 nextColor
作为 属性。像这样
// MyQuickItem.h
class MyQuickItem : public QQuickItem {
Q_PROPERTY(QColor nextColor READ nextColor WRITE setNextColor NOTIFY nextColorChanged)
}
是否可以在MyQuickItem
内部监控OnNextColorChanged
?
我们可以使用QMetaObject获取属性和信号,然后我们通过旧的方式连接它:
#ifndef MYQUICKITEM_H
#define MYQUICKITEM_H
#include <QQuickItem>
#include <QDebug>
class MyQuickItem : public QQuickItem
{
Q_OBJECT
public:
MyQuickItem(QQuickItem *parent = Q_NULLPTR): QQuickItem(parent){}
protected:
void componentComplete(){
int index =metaObject()->indexOfProperty("nextColor");
const QMetaProperty property = metaObject()->property(index);
if (property.hasNotifySignal()){
const QMetaMethod s = property.notifySignal();
QString sig = QString("2%1").arg(QString(s.methodSignature()));
connect(this, sig.toStdString().c_str() , this, SLOT(onNextColorChanged()));
}
}
private slots:
void onNextColorChanged(){
int index =metaObject()->indexOfProperty("nextColor");
const QMetaProperty property = metaObject()->property(index);
qDebug()<<"color" << property.read(this);
}
};
#endif // MYQUICKITEM_H
完整的例子可以在下面link.
中找到
我正在使用 Qt 5.9.3。我在我的应用的 main.qml
代码:
//main.qml
MyQuickItem {
property color nextColor
onNextColorChanged: {
console.log("The next color will be: " + nextColor.toString())
}
}
// MyQuickItem.h
class MyQuickItem : public QQuickItem {
}
问题:
如何在 C++ 端定义 onNextColorChanged
?
我知道我也可以在 C++ class MyQuickItem
中将 nextColor
作为 属性。像这样
// MyQuickItem.h
class MyQuickItem : public QQuickItem {
Q_PROPERTY(QColor nextColor READ nextColor WRITE setNextColor NOTIFY nextColorChanged)
}
是否可以在MyQuickItem
内部监控OnNextColorChanged
?
我们可以使用QMetaObject获取属性和信号,然后我们通过旧的方式连接它:
#ifndef MYQUICKITEM_H
#define MYQUICKITEM_H
#include <QQuickItem>
#include <QDebug>
class MyQuickItem : public QQuickItem
{
Q_OBJECT
public:
MyQuickItem(QQuickItem *parent = Q_NULLPTR): QQuickItem(parent){}
protected:
void componentComplete(){
int index =metaObject()->indexOfProperty("nextColor");
const QMetaProperty property = metaObject()->property(index);
if (property.hasNotifySignal()){
const QMetaMethod s = property.notifySignal();
QString sig = QString("2%1").arg(QString(s.methodSignature()));
connect(this, sig.toStdString().c_str() , this, SLOT(onNextColorChanged()));
}
}
private slots:
void onNextColorChanged(){
int index =metaObject()->indexOfProperty("nextColor");
const QMetaProperty property = metaObject()->property(index);
qDebug()<<"color" << property.read(this);
}
};
#endif // MYQUICKITEM_H
完整的例子可以在下面link.
中找到