我如何比较 QWidgets?假设我有一个列表,并且想更改小部件的大小,这些小部件只有QPushButton
:
例如,是否有任何功能或方法可以做到这一点?
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 支持。
当然还有需要启用 RTTI 支持的标准 C++ dynamic_cast:
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() 函数时无法检查这一点,因此代码将继续编译而不会出现问题,但它在运行时不起作用。
如果它有元类型信息,您可以使用QMetaObject::className
它来获取类类型,这应该。有关此处文档的更多信息: QMetaObject className。QObject
QPushButton
标准 C++ 方法是使用dynamic_cast<QPushButton*>(widget)
.
Qt 通过它的元对象系统提供了替代方案。一个是qobject_cast
,它的工作方式类似于dynamic_cast
但可能更可取。
或者,您可以通过其元对象获取任何 QObject 的类名。例如:
if( strcmp(widget->metaObject()->className(), "QPushButton") == 0 )
有关 Qt 元对象的更多信息,请参见此处。