1

我正在尝试编写一个带有两个参数的方法:Q_PROPERTY名称(char *)和QObject *关联的,允许将 的 notifySignal(如果存在)连接Q_PROPERTY到 avoid slot(QVariant)或动态构建的将调用 a 的插槽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,我不知道如何动态构建一个为第一个解决方案调用指定方法的插槽;对于第二种解决方案,我不知道如何从QMetaMethodnotifySignal 中检索函数指针;也许最后一个解决方案是最好的方法,并且很容易实现,但它有点极端。

你怎么看待这件事?

4

1 回答 1

0

对于“动态构建插槽”,Qt 中有私有 API(查找 QMetaObjectBuilder 或类似类)。但是,这并不能解决连接问题。

请注意,它QObject::connect被重载以将QMetaMethods 作为信号和插槽。因此,您可以轻松构建一个“接收器”类对象(仅用于记住它作用于哪个属性):

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;
};

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

于 2015-06-17T22:54:13.930 回答