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

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

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

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

【问题讨论】:

    标签: qt4 properties qobject


    【解决方案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 但不是我问这个问题... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多