我在Windows 7上使用Qt5。在我当前的应用程序中,我有以下一段代码可以改变某些按钮的背景颜色:
...
for(int i = 0; i < layout()->count(); i++)
{
QPushButton * button = static_cast<QPushButton*>(layout()->itemAt(i)->widget());
button->setStyleSheet(backgroundColor);
}
好吧,我对上述代码有2个问题:
使用static_cast
是正确/正确还是我应该使用其他类型的投射?
是否可以使用foreach
代替上面的for loop
?
答案 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作为标准容器,所以我不确定你能不能做到。