我不确定这样的事情是否可行,但我正在尝试根据已注册到 Qt 属性系统中的属性动态生成 GUI。我的假设是,由于我以这种方式使用 Q_PROPERTY() 注册了一个属性:
Q_PROPERTY(propertyType propertyName WRITE setPropertyName READ getPropertyName NOTIFY propertynameSignal)
我应该能够使用 connect() 函数检索写入或读取函数的签名以进行连接。这样做的目的是让一个对话框连接到该对象以修改属性,但不必手写所有内容。这可能吗,我是不是走错了路,还是我应该对对话框进行硬编码?
编辑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 指向的实际对象。