作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不确定这样的事情是否可行,但我正在尝试根据已注册到 Qt 属性系统中的属性动态生成 GUI。我的假设是,由于我以这种方式使用 Q_PROPERTY() 注册了一个属性:
Q_PROPERTY(propertyType propertyName WRITE setPropertyName READ getPropertyName NOTIFY propertynameSignal)
class MyObject : public QObject
{
Q_OBJECT
Q_PROPERTY(bool someBool READ getBool WRITE setBool)
public:
bool someBool;
bool getBool();
void setBool(bool);
}
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
}
}
}
最佳答案
要检索 QObject 方法(信号、槽等)的签名,您可以使用元对象 ( QMetaObject
) 信息。例如,以下代码(取自 Qt 文档)提取对象的所有方法签名:
const QMetaObject* metaObject = obj->metaObject();
QStringList methods;
for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i)
methods << QString::fromLatin1(metaObject->method(i).signature());
QMetaMethod::methodType()
功能。签名使用
QMetaMethod::signature()
(引用上面的例子)。
class MyDialog : public QDialog
{
[..]
private:
/// Mapping between widget and the corresponding property index.
QMap<QObject *, int> m_propertyMap;
};
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
// Store the property and widget mapping.
connect(checkBox, SIGNAL(stateChanged(int)),
this, SLOT(onCheckBoxChanged(int)));
m_propertyMap[checkBox] = i;
}
}
}
void MyDialog::onCheckBoxChanged(int state)
{
QObject *checkBox = sender();
QMetaObject* metaObject = _MyObjectPtr->metaObject();
int propertyIndex = m_propertyMap.value(checkBox);
QMetaProperty property = metaObject->property(i);
// Update the property
_MyObjectPtr->setProperty(property.name(), bool(state == Qt::Checked));
}
关于qt - 将信号连接到 QMetaProperty 的插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793735/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!