Qt / C ++:“static_cast”可以在这段代码中进行投射吗?

时间:2016-06-22 12:08:45

标签: c++ qt casting

我在Windows 7上使用Qt5。在我当前的应用程序中,我有以下一段代码可以改变某些按钮的背景颜色:

...
for(int i = 0; i < layout()->count(); i++)
{
    QPushButton * button = static_cast<QPushButton*>(layout()->itemAt(i)->widget());
    button->setStyleSheet(backgroundColor);
}

好吧,我对上述代码有2个问题:

  1. 使用static_cast是正确/正确还是我应该使用其他类型的投射?

  2. 是否可以使用foreach代替上面的for loop

3 个答案:

答案 0 :(得分:12)

您应该使用qobject_cast,以便检查演员表是否成功。如果演员表失败,则返回0。

QPushButton * button = qobject_cast<QPushButton*>(layout()->itemAt(i)->widget());
if(button)
    // cast ok
else
    // cast failed

您无法使用foreach,因为您需要一个容器。

答案 1 :(得分:2)

仅当您确定布局仅包含小工具项它们都包含static_cast时才使用QPushButton在技术上可接受。由于这在代码修改方面容易出错,我不建议这样做。

相反,最好使用layout iterator adapter在C ++ 11或foreach / Q_FOREACH中使用range-for。迭代器适配器还解决了只迭代所需类型元素的问题,并使代码在修改时安全。

然后您可以使用range-for,即使布局中没有QPushButton,此代码也是安全的,并且可以通过忽略它来优雅地处理任何类型的布局项:

for (auto button : IterableLayoutAdapter<QPushButton>(layout())) 
  button->setStyleSheet(backgroundColor);

答案 2 :(得分:1)

如果你确定所有的小部件都是QPushButtons,那么是的,static_cast是最好的选择(效率最高) 关于foreach,我不确定你可以将QLayoutItems作为标准容器,所以我不确定你能不能做到。