有没有办法在 QObject 中的属性更改时得到通知?

Posted

技术标签:

【中文标题】有没有办法在 QObject 中的属性更改时得到通知?【英文标题】:Is there a way to be notified when a property changes in a QObject? 【发布时间】:2010-03-08 06:49:18 【问题描述】:

首先,我使用的是 Qt 4 库和 C++。

QObject 上的属性(动态或其他)发生变化时,是否有办法通知(信号、事件、?)?

我无法修改 QObject 类,因为它是 Qt4 库的一部分。更多关于QObjecthere的信息。

【问题讨论】:

【参考方案1】:

对于动态属性,可以使用QDynamicPropertyChangeEvent

希望对你有帮助!

【讨论】:

我试图查看 QWidget 的 windowTitle 属性,但由于它不是动态属性,因此不会触发该事件。我最终使用了一个动态事件来传递我的信息,它就像一个魅力。谢谢! 使用 setProperty(name, value) 设置属性,而不是使用属性设置器来获取属性更改通知。【参考方案2】:

您可以在 QObject 实例上安装 event filter。 因此,如果您想在 windowsTitle 更改时收到通知,您可以安装一个捕获 QEvent::WindowTitleChange 事件的事件过滤器。 例如:

class WindowsTitleWatcher : public QObject

    Q_OBJECT
public:
    WindowsTitleWatcher(QObject *parent) : QObject(parent) 
    

signals:
    void titleChanged(const QString& title);

protected:
    bool eventFilter(QObject *obj, QEvent *event) 
        if(event->type()==QEvent::WindowTitleChange) 
            QWidget *const window = qobject_cast<QWidget *>(obj);
            if(window)
                emit titleChanged(window->windowTitle());
         
        return QObject::eventFilter(obj, event);
    
;

//...
QDialog *const dialogToWatch = ...;
QObject *const whoWantToBeNotified = ...;
QObject *const titleWatcher = new WindowsTitleWatcher(dialogToWatch);
whoWantToBeNotified->connect(
    titleWatcher, 
    SIGNAL(titleChanged(QString)), 
    SLOT(onTitleChanged(QString)));
dialogToWatch->installEventFilter(titleWatcher);

//...

【讨论】:

哈,我一定是瞎了。我正在查看事件文档并阅读了除该事件之外的所有内容。谢谢。【参考方案3】:

我不熟悉“语言”,但总的来说,您想要做的事情遵循观察者设计模式。你看,在这个模式中,你所做的是将观察者注册到可观察对象,即 QObjects。在 Observable 对象中,您将跟踪其观察者的列表。当 QObjects 的状态发生变化时,您可以使用它拥有的观察者列表通知所有观察者......本质上,您创建了一个观察者可以实现的接口......这个接口将成为您通知对象的方式可观察对象的不同观察者。只是一个想法!

【讨论】:

这是正确的想法,但我无法更改 QObject,因为它是我正在使用的库的一部分。我编辑了我的问题以澄清这一事实。 但是你可以从中创建一个子类,:) 让子类成为你的 Observable 对象... 在Qt中你可以使用内置的信号槽机制来实现观察者模式。 @TimW,现在我知道了,tnx 但不是我问这个问题... :)

以上是关于有没有办法在 QObject 中的属性更改时得到通知?的主要内容,如果未能解决你的问题,请参考以下文章

QML - 访问存储在 QList 中的 QObject 类属性

有没有办法对 Oracle 中的更改通知进行故障排除?

列表中的项目属性从 EF 源更改值 - 有没有办法“分离”它?

QObject::connect: 没有这样的信号(类名)(信号名)(属性)

有没有办法通过从 Flutter 中的通知滑动来停止警报声音

我可以有两个具有相同属性名称的对象吗? [复制]