如何比较QWidgets?
可以说我有一个列表,想更改仅QPushButton
的Widget的大小:
例如,是否有任何功能或方法可以做到这一点?
QList<QLayoutItem *> itemList;
if(itemList->Items->type() == QPushButton)
{
item.setGeometry(newRect);
}
最佳答案
实际上,有几种方法可以做到这一点。 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是因为它允许编译器检查类型名。在更改类的名称时,这一点很重要。使用基于字符串的QObject::inherits()函数时,编译器无法检查,因此代码将继续编译而不会出现问题,但在运行时将无法运行。
关于c++ - 比较QWidgets,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17784055/