C++ 如何构建一个通用方法,将不同Q_属性类型的notifySignal从属性char*name连接到一个空槽(QVariant)?
我正在尝试编写一个方法,它有两个参数:C++ 如何构建一个通用方法,将不同Q_属性类型的notifySignal从属性char*name连接到一个空槽(QVariant)?,c++,qt,qt5,signals-slots,qproperty,C++,Qt,Qt5,Signals Slots,Qproperty,我正在尝试编写一个方法,它有两个参数:Q_属性名称(char*)和关联的QObject*,允许将Q_属性的notifySignal(如果存在)连接到void slot(QVariant),或者连接到动态构建的、将调用void方法的slot(QVariant)。信号的特征码可以根据参数的类型而变化 我如何在Qt5中实现这一点?也许这是不可能的,但我不会停止搜索,因为我不确定 因此,我认为我有3种解决方案: 使用旧的Qt连接方式,从信号名称动态构建信号的精确签名插槽,并调用其中的方法(QVaria
Q_属性
名称(char*
)和关联的QObject*
,允许将Q_属性
的notifySignal(如果存在)连接到void slot(QVariant)
,或者连接到动态构建的、将调用void方法的slot(QVariant)
。信号的特征码可以根据参数的类型而变化
我如何在Qt5中实现这一点?也许这是不可能的,但我不会停止搜索,因为我不确定
因此,我认为我有3种解决方案:
- 使用旧的Qt连接方式,从信号名称动态构建信号的精确签名插槽,并调用其中的方法(QVariant):
connect(sender, SIGNAL (valueChanged(QString,QString)), receiver, SLOT (updateValue(QString)) );
- 使用新的Qt 5连接系统:
connect(sender, &Sender::valueChanged,receiver, &Receiver::updateValue );
- 构建可与QVariant一起使用的所有插槽签名
QMetaMethod
检索函数指针;也许最后一个解决方案是最好的方法,而且很容易实现,但它有点极端
您对此有何看法?对于“动态构建插槽”,Qt中有专用API(请查找QMetaObjectBuilder或类似类)。但这并不能解决连接问题
请注意,QObject::connect
被重载,以将QMetaMethod
s作为信号和插槽。因此,您可以轻松构建一个“receiver”类对象(仅用于记住它所作用的属性):
在你的方法中连接它。对于“动态构建插槽”,Qt中有私有API(寻找QMetaObjectBuilder或类似的类)。但是,这并不能解决连接问题
请注意,QObject::connect
被重载,以将QMetaMethod
s作为信号和插槽。因此,您可以轻松构建一个“receiver”类对象(仅用于记住它所作用的属性):
用你的方法把它连接起来
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;
};