如何构建一个泛型方法,将不同Q_PROPERTY类型的 notifySignal 从属性 char * 名称连接到空槽



我正在尝试编写一个方法,有两个参数: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;
};

并将其连接到您的方法中。

相关内容

  • 没有找到相关文章