1

私は2つのパラメータを持つメソッドを書き込もうとしています. name Q_PROPERTY( char *) とQObject *関連する. 信号のシグネチャは、パラメータのタイプによって異なります。Q_PROPERTYvoid 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 で使用できるすべてのスロット シグネチャを構築します。

ただし、最初のソリューションで指定されたメソッドを呼び出すスロットを動的に構築する方法はわかりません。QMetaMethod2 番目の解決策として、notifySignalから関数ポインタを取得する方法がわかりません。おそらく最後の解決策が最良の方法であり、簡単に達成できますが、少し極端です。

あなたはそれについてどう思いますか?

4

1 に答える 1

0

「スロットを動的に構築する」ために、Qt にはプライベート API があります (QMetaObjectBuilder または同様のクラスを探してください)。ただし、接続の問題は解決しません。

s をシグナルとスロットとしてQObject::connect受け取るようにオーバーロードされていることに注意してください。QMetaMethodそのため、「レシーバー」クラス オブジェクトを簡単に作成できます (作用するプロパティを記憶するためだけに):

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 に答える