Есть ли способ получить уведомление, когда свойство изменяется в 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, вы могли бы уведомить всех наблюдателей, используя список наблюдателей, который у него есть... По сути, вы создаете интерфейс, который могут реализовать наблюдатели... Этот интерфейс станет вашим способом уведомления разные наблюдатели наблюдаемого объекта. просто мысль!