0
C++のプロパティーをQML方式で接続するためのプロパティー・コネクターを作成します。メタオブジェクトから通知されたプロパティーを取得する
new PropConnector (receiver, "propName", sender, "propName");
propConnectorクラスは、親として送信者を使用して小QObjectをクラスであるプロパティ変更信号をリッスンし、受信機の適切なプロパティを設定します。それはこのようであってもよいです。このように:
唯一の問題は、聞きたいプロパティ名の正しい信号名を見つけることができますか?おそらく、可能ですが、私は今までメタオブジェクトのドキュメントを読むことで見つけられないと思います。
編集:私はこのクラスを実装することができました。
propconnector.h
#ifndef PROPCONNECTOR_H
#define PROPCONNECTOR_H
#include <QObject>
#include <QString>
class PropConnector : public QObject
{
Q_OBJECT
private:
QObject *_sender;
QObject *_receiver;
QString _senderProperty;
QString _receiverProperty;
public:
PropConnector(QObject *sender, QString senderProperty, QObject *receiver, QString receiverProperty);
private slots:
void forward();
};
#endif // PROPCONNECTOR_H
propconnector.cpp
#include "propconnector.h"
#include <QMetaObject>
#include <QMetaProperty>
PropConnector::PropConnector(QObject *sender, QString senderProperty, QObject *receiver, QString receiverProperty) :
QObject(sender)
,_sender(sender)
,_receiver(receiver)
,_senderProperty(senderProperty)
,_receiverProperty(receiverProperty)
{
const QMetaObject *senderMeta = sender->metaObject();
const int index = senderMeta->indexOfProperty(senderProperty.toUtf8().constData());
if (index != -1) {
const QMetaProperty p = senderMeta->property(index);
if (p.hasNotifySignal()) {
const QMetaMethod s = p.notifySignal();
QString sig = QString("2%1").arg(s.signature());
const char *ssig = SLOT(forward());
bool ok = connect(sender, sig.toStdString().c_str() , this, SLOT(forward()));
int i=0;
i++;
}
}
}
void PropConnector::forward()
{
_receiver->setProperty(_receiverProperty.toStdString().c_str(), _sender->property(_senderProperty.toStdString().c_str()));
}
クール、それは助けた。接続は一方向のみであるため、受信機信号は重要ではありません。信号はコネクタークラス自体から発せられます。 私は質問編集にコードを掲載しました。 –