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一起使用的所有插槽签名

尽管如此,对于第一个解决方案,我不知道如何动态构建一个调用指定方法的插槽;对于第二个解决方案,我不知道如何从notifySignal的
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;
};