Есть ли способ получить уведомление, когда свойство изменяется в QObject?

Во-первых, я использую библиотеки Qt 4 и C++.

Есть ли способ получить уведомление (сигнал, событие,?), Когда свойство (динамическое или иное) изменяется на QObject?

Я не могу изменить QObject класс как часть библиотеки Qt4. Подробнее о QObject здесь

3 ответа

Решение

Вы можете установить фильтр событий на экземпляры QObject.
Поэтому, если вы хотите получать уведомления об изменениях в 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);

//...

Для динамических свойств вы можете использовать QDynamicPropertyChangeEvent.

Надеюсь, поможет!

Я не знаком с "языком", но в целом то, что вы хотите сделать, следует шаблону проектирования Observer. В этом паттерне вы видите, что вы регистрируете Observers для Observable Objects, т.е. QObjects. Внутри объекта Observable вы будете отслеживать список его наблюдателей. Когда произошло изменение в состоянии объекта QObjects, вы могли бы уведомить всех наблюдателей, используя список наблюдателей, который у него есть... По сути, вы создаете интерфейс, который могут реализовать наблюдатели... Этот интерфейс станет вашим способом уведомления разные наблюдатели наблюдаемого объекта. просто мысль!

Другие вопросы по тегам