Qt/C++ : "static_cast"可以在此代码片段中进行转换吗?

Qt/C++ : Is "static_cast" ok for casting in this snippet of code?

本文关键字:片段 代码 转换 C++ static Qt cast      更新时间:2023-10-16

我在Windows 7上使用QT5。在我当前的应用程序中,我有以下代码会更改某些按钮的背景颜色:

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

好吧,我有两个有关上述代码的问题:

  1. 使用static_cast是否可以/正确?还是我应该使用其他类型的铸造?

  2. 是否可以使用foreach而不是上面的for loop

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

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

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

在技术上可以接受static_cast,仅当您确定布局仅包含小部件时,它们都包含QPushButton。由于面对代码修改,这是错误的错误,所以我不建议这样做。

相反,希望通过使用布局迭代器适配器在C 11或foreach/Q_FOREACH中使用范围。迭代器适配器还解决了仅迭代您想要的类型元素的问题,并使您的代码面对修改。

然后您可以使用范围,即使没有QPushButton s在布局中,此代码也是安全的,并且可以按照应有的方式来优雅地应对任何形式的布局项目:

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

如果您确定所有小部件都是qpushbuttons,那么static_cast是最佳选择(最有效)关于foreach,我不确定您是否可以将qlayoutitems作为一些标准容器,所以我不确定您可以做到。