有没有办法在 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 库的一部分。更多关于QObject
here的信息。
【问题讨论】:
【参考方案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 类属性
列表中的项目属性从 EF 源更改值 - 有没有办法“分离”它?
QObject::connect: 没有这样的信号(类名)(信号名)(属性)