我正在尝试编写一个方法,有两个参数:Q_PROPERTY
名称(char *
)和与之关联的QObject *
,允许将Q_PROPERTY
的notifySignal(如果存在)连接到void slot(QVariant)
,或动态构建的将调用void method(QVariant)
的插槽。信号的签名可能因参数类型而异。
如何在Qt 5中实现这一目标?也许这是不可能的,但我不会在不确定的时候停止搜索。
所以我想我有 3 个解决方案:
-
从信号名称动态构建信号确切签名的插槽,并使用旧的Qt连接方式在其中调用方法(QVariant):
connect(sender, SIGNAL (valueChanged(QString,QString)), receiver, SLOT (updateValue(QString)) );
-
使用新的Qt 5连接系统:
connect(sender, &Sender::valueChanged,receiver, &Receiver::updateValue );
-
构建可与 QVariant 一起使用的所有插槽签名。
Althougt,我不知道如何动态构建一个为第一个解决方案调用指定方法的插槽;我不知道如何从通知信号的QMetaMethod
检索函数指针,对于第二个解决方案;也许最后一个解决方案是最好的方法,并且很容易实现,但它有点极端。
对此,你怎么看?
对于"动态构建插槽",Qt中有私有API(查找QMetaObjectBuilder或类似的类)。但是,这并不能解决连接问题。
请注意,QObject::connect
被重载以将 QMetaMethod
s 作为信号和插槽。因此,您可以轻松构建一个"接收器"类对象(唯一目的是记住它正在作用于哪个属性):
class Receiver : public QObject {
Q_OBJECT
public:
explicit Receiver(const char *property, QObject *parent = 0)
: QObject(parent),
m_property(property)
{}
signals:
void propertyChangedForObject(const char *property, QObject *object);
public slots:
void onPropertyChanged() {
emit propertyChangedForObject(m_property, sender());
}
private:
const char * const m_property;
};
并将其连接到您的方法中。