比较QWidgets

时间:2013-07-22 09:30:02

标签: c++ qt

我如何比较QWidgets? 假设我有一个列表,并希望更改仅QPushButton的小部件的大小:

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

QList<QLayoutItem *> itemList;

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

3 个答案:

答案 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::classNameQObject元类型信息,您可以使用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