我不确定是否可能做到这样的事情,但我尝试根据已注册到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指向的实际对象。
model = new QPropertyModel(pObject); mapper = new QDataWidgetMapper(model); mapper->setModel(model); mapper->addMapping(aTextEdit, model.column("property name"));
- Harvey