如何比较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/

10-12 14:46