4

我如何比较 QWidgets?假设我有一个列表,并且想更改小部件的大小,这些小部件只有QPushButton

例如,是否有任何功能或方法可以做到这一点?

QList<QLayoutItem *> itemList;

if(itemList->Items->type() == QPushButton)
{
  item.setGeometry(newRect);
}
4

3 回答 3

6

实际上,有几种方法可以做到这一点。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() 函数时无法检查这一点,因此代码将继续编译而不会出现问题,但它在运行时不起作用。

于 2013-07-22T09:53:41.277 回答
2

如果它有元类型信息,您可以使用QMetaObject::className它来获取类类型,这应该。有关此处文档的更多信息: QMetaObject classNameQObjectQPushButton

于 2013-07-22T09:48:44.603 回答
0

标准 C++ 方法是使用dynamic_cast<QPushButton*>(widget).

Qt 通过它的元对象系统提供了替代方案。一个是qobject_cast,它的工作方式类似于dynamic_cast但可能更可取。

或者,您可以通过其元对象获取任何 QObject 的类名。例如:

if( strcmp(widget->metaObject()->className(), "QPushButton") == 0 )

有关 Qt 元对象的更多信息,请参见此处

于 2013-07-22T09:49:59.893 回答