【发布时间】:2010-03-08 06:49:18
【问题描述】:
首先,我使用的是 Qt 4 库和 C++。
当QObject 上的属性(动态或其他)发生变化时,是否有办法通知(信号、事件、?)?
我无法修改 QObject 类,因为它是 Qt4 库的一部分。更多关于QObjecthere的信息。
【问题讨论】:
标签: qt4 properties qobject
首先,我使用的是 Qt 4 库和 C++。
当QObject 上的属性(动态或其他)发生变化时,是否有办法通知(信号、事件、?)?
我无法修改 QObject 类,因为它是 Qt4 库的一部分。更多关于QObjecthere的信息。
【问题讨论】:
标签: qt4 properties qobject
对于动态属性,可以使用QDynamicPropertyChangeEvent。
希望对你有帮助!
【讨论】:
您可以在 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);
//...
【讨论】:
我不熟悉“语言”,但总的来说,您想要做的事情遵循观察者设计模式。你看,在这个模式中,你所做的是将观察者注册到可观察对象,即 QObjects。在 Observable 对象中,您将跟踪其观察者的列表。当 QObjects 的状态发生变化时,您可以使用它拥有的观察者列表通知所有观察者......本质上,您创建了一个观察者可以实现的接口......这个接口将成为您通知对象的方式可观察对象的不同观察者。只是一个想法!
【讨论】: