从元对象获取属性更改通知程序
Obtain property changed notifier from meta-object
我想编写一个属性连接器,用于以QML方式连接C++Qt中的属性。可能是这样的:
new PropConnector ( receiver, "propName", sender, "propName" );
propConnector 类是一个小型 QObject 类,它使用发送方作为父级,侦听属性更改的信号并设置接收方的适当属性。喜欢这个:
class PropConnector : public QObject
{
Q_OBJECT
private:
QObject *_sender;
QObject *_receiver;
QString _senderProp;
QString _receiverProp;
public:
PropConnector(QObject *sender, QObject *receiver, QString senderProp, QString receiverProp) :
QObject(sender)
,_sender(sender)
,_receiver(receiver)
,_senderProp(senderProp)
,_receiverProp(receiverProp)
{
// Is it possible to get the proper property-changed notifier signal?
//connect(sender, SIGNAL( on<PROPERTY>Changed() ), this, SLOT( forward ) );
}
private slots:
void forward()
{
_receiver->setProperty( receiverProp, _sender->property( senderProp ) );
}
};
唯一的问题是,如何找到我要收听的属性名称的正确信号名称?我想,这是可能的,但直到现在我才通过阅读元对象文档来发现。
编辑:在凯文的建议下,我能够实现该类。
propconnector.h
#ifndef PROPCONNECTOR_H
#define PROPCONNECTOR_H
#include <QObject>
#include <QString>
class PropConnector : public QObject
{
Q_OBJECT
private:
QObject *_sender;
QObject *_receiver;
QString _senderProperty;
QString _receiverProperty;
public:
PropConnector(QObject *sender, QString senderProperty, QObject *receiver, QString receiverProperty);
private slots:
void forward();
};
#endif // PROPCONNECTOR_H
支柱连接器.cpp
#include "propconnector.h"
#include <QMetaObject>
#include <QMetaProperty>
PropConnector::PropConnector(QObject *sender, QString senderProperty, QObject *receiver, QString receiverProperty) :
QObject(sender)
,_sender(sender)
,_receiver(receiver)
,_senderProperty(senderProperty)
,_receiverProperty(receiverProperty)
{
const QMetaObject *senderMeta = sender->metaObject();
const int index = senderMeta->indexOfProperty(senderProperty.toUtf8().constData());
if (index != -1) {
const QMetaProperty p = senderMeta->property(index);
if ( p.hasNotifySignal() ) {
const QMetaMethod s = p.notifySignal();
QString sig = QString("2%1").arg(s.signature());
const char *ssig = SLOT(forward());
bool ok = connect(sender, sig.toStdString().c_str() , this, SLOT(forward()));
int i=0;
i++;
}
}
}
void PropConnector::forward()
{
_receiver->setProperty( _receiverProperty.toStdString().c_str(), _sender->property( _senderProperty.toStdString().c_str() ) );
}
您可以从QMetaProperty
获取该信息
QMetaObject *senderMeta = sender->metaObject();
const int index = senderMeta->indexOfProperty(senderProperty.toUtf8().constData());
if (index != -1) {
const QMetaProperty property = senderMeta->property(index);
if (property.hasNotifySignal) {
const QMetaMethod notifySignal = property.notifySignal();
connect(sender, notifySignal, receiver, metaMethodOfSlot);
}
}
未经测试,可能无法编译。 metaMethodOfSlot
是接收器插槽的QMetaMethod
,请以类似的方式获取。
相关文章:
- 通知 Windows 系统应用程序字体已被卸载/删除
- C++应用程序通知 C# 应用程序
- 如何将控制台应用程序放入系统托盘通知C++?
- 如何处理Qt托盘应用程序中的会话更改通知
- 用户土地访问内核土地驱动程序系统通知
- 程序崩溃的原因可能是什么,恕不另行通知
- QSocketNotifier:不能从另一个线程启用或禁用套接字通知程序
- 从元对象获取属性更改通知程序
- 从桌面应用程序使用Windows 8 toast通知
- 当屏幕保护程序在Linux下启动或停止时,是否可以通知通知
- 当应用程序变为活动/非活动状态时获取通知
- 如何从 C Microsoft PC 应用程序向 iPhone 发送 APNS 推送通知
- C++:使用回调函数作为事件通知程序
- 在 Windows 中修改文件夹时通知我的应用程序
- 守护程序未与通知发送交互
- 当通知程序/信号超出范围时,在提升绑定中解除分配回调侦听器对象
- 是否可以编写一个windows应用程序,当在另一个窗口应用程序中选择文本时,该应用程序会收到通知
- 当mysql数据库发生更新或更改时,我如何通知我的C或C++应用程序
- 调试器分离时是否可以通知应用程序
- 从 NSNotificationServer 获取通知 C++ 程序