我如何比较QWidgets?
假设我有一个列表,并希望更改仅QPushButton
的小部件的大小:
例如,有没有任何功能或方法可以做到这一点?
QList<QLayoutItem *> itemList;
if(itemList->Items->type() == QPushButton)
{
item.setGeometry(newRect);
}
答案 0 :(得分:5)
实际上有几种方法可以做到这一点。 QObject::inherits()是一个:
for (int i = 0; i < itemList.size(); ++i) {
if (itemList[i]->inherits("QPushButton")) {
itemList[i]->setGeometry(newRect);
}
}
另一种方法是使用qobject_cast,这是我推荐的。如果对象没有从您投射到的类继承(直接或不是),它返回一个空指针:
for (int i = 0; i < itemList.size(); ++i) {
if (qobject_cast<QPushButton*>(itemList[i])) {
itemList[i]->setGeometry(newRect);
}
}
请注意,qobject_cast 不需要在编译器中启用RTTI支持。
当然,标准的C ++ dynamic_cast确实需要启用RTTI支持:
for (int i = 0; i < itemList.size(); ++i) {
if (dynamic_cast<QPushButton*>(itemList[i])) {
itemList[i]->setGeometry(newRect);
}
}
乍一看似乎没问题,但最终不应该在这种情况下使用的另一种方法是QMetaObject :: className()。不要使用它,因为你会得到QPushButton子类的错误否定。
我推荐qobject_cast的原因是因为它允许编译器检查typename。更改类的名称时这很重要。编译器在使用基于字符串的QObject :: inherits()函数时无法检查,因此代码将继续编译而不会出现问题,但它在运行时无法正常工作。
答案 1 :(得分:2)
如果QMetaObject::className
有QObject
元类型信息,您可以使用QPushButton
获取类类型。有关文档here: QMetaObject className的更多信息。
答案 2 :(得分:0)
标准C ++方式是使用dynamic_cast<QPushButton*>(widget)
。
Qt通过它的元对象系统提供替代方案。一个是qobject_cast
,其作用与dynamic_cast
类似,但可能更合适。
或者,您可以通过其元对象获取任何QObject的类名。例如:
if( strcmp(widget->metaObject()->className(), "QPushButton") == 0 )
有关Qt元对象的更多信息,请参阅here。