このようなことが可能かどうかはわかりませんが、Qt のプロパティ システムに登録されているプロパティに基づいて GUI を動的に生成しようとしています。私の仮定は、この方法で Q_PROPERTY() を使用してプロパティを登録したためです。
Q_PROPERTY(propertyType propertyName WRITE setPropertyName READ getPropertyName NOTIFY propertynameSignal)
connect() 関数を使用して、接続用の書き込み関数または読み取り関数の署名を取得できるはずです。これの目的は、プロパティを変更するためにこのオブジェクトにダイアログを接続することですが、すべてを手書きする必要はありません。これは可能ですか、間違った方法で行っていますか、それともダイアログをハードコーディングする必要がありますか?
EDIT 1:私がやろうとしていることをより明確にするために、私が持っているコードの一部(削除されたもの)を共有します:
特定のクラスのクラス宣言:
class MyObject : public QObject
{
Q_OBJECT
Q_PROPERTY(bool someBool READ getBool WRITE setBool)
public:
bool someBool;
bool getBool();
void setBool(bool);
}
このオブジェクトを指す QDialog サブクラス:
void MyDialog::generateUI()
{
const QMetaObject* metaObject = _MyObjectPtr->metaObject();
for (int i = 0; i < metaObject->propertyCount(); ++i)
{
QMetaProperty property = metaObject->property(i);
if (!strcmp(property.typeName(), "bool")
{
QCheckBox* checkBox = new QCheckBox(this);
bool state = metaObject->property(property->name()).toBool();
checkBox->setCheckState((state) ? Qt::Checked : Qt::Unchecked);
// Add checkBox to QDialog layout widgets here
}
}
}
すべての My* の名前変更を許してください。ただし、実際のクラス/メンバー名は非公開にする必要があります。
MyObjectPtr が指すオブジェクトが適切に読み取られていることを確認できます。開始値は、変更したときに期待する値を反映しているためです。問題は、これをそのオブジェクトに接続することです。チェックボックスの GUI 側で値を変更できますが、_MyObjectPtr が指す実際のオブジェクトに値が送信されません。