Qt动态属性值改变时调用方法

DjA*_*dyC 3 c++ qt

我已经使用this->setProperty("FOV", QVariant(54));如何告诉它在更改此属性的值时调用方法(如在我的程序界面中更新它时那样)动态地向对象添加一个属性 ?

jpo*_*o38 5

您可以在 QObject 实例上安装事件过滤器

class Watcher : public QObject
{
    Q_OBJECT
public:
    Watcher(QObject *parent) : QObject(parent) 
    {
    }

signals:
    void propertyChanged();

protected:
    bool eventFilter(QObject *obj, QEvent *event)
    { 
        if(event->type()==QEvent::DynamicPropertyChange) 
        {
            QDynamicPropertyChangeEvent *const propEvent = qobject_cast<QDynamicPropertyChangeEvent*>(event);
            // see comment, static_cast should also work and be faster
            // in case of static_cast you don't need to check propEvent to be not null
            if(propEvent)
            {
                // did not test that, but it should work:
                QString propName = QString::fromAscii(propEvent->propertyName().data());
                if ( propName == "FOV")
                {
                    // emit signal to notify specific property was changed
                    emit propertyChanged();
                }
            }
        } 
        return QObject::eventFilter(obj, event);
    }
};

//...
QObject *const objectToWatch = ...;
QObject *const whoWantToBeNotified = ...;
QObject *const watcher = new Watcher(objectToWatch);
whoWantToBeNotified->connect(
    watcher, 
    SIGNAL(propertyChanged()), 
    SLOT(onPropertyChanged()));
objectToWatch->installEventFilter(watcher);

//...
Run Code Online (Sandbox Code Playgroud)