Qt/C++ : "static_cast"可以在此代码片段中进行转换吗?
Qt/C++ : Is "static_cast" ok for casting in this snippet of code?
我在Windows 7上使用QT5。在我当前的应用程序中,我有以下代码会更改某些按钮的背景颜色:
...
for(int i = 0; i < layout()->count(); i++)
{
QPushButton * button = static_cast<QPushButton*>(layout()->itemAt(i)->widget());
button->setStyleSheet(backgroundColor);
}
好吧,我有两个有关上述代码的问题:
使用
static_cast
是否可以/正确?还是我应该使用其他类型的铸造?是否可以使用
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作为一些标准容器,所以我不确定您可以做到。
相关文章:
- 这个带有模板<类 Vector 的C++代码片段有什么问题>
- 这两个代码片段相似,但显示的结果不同
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如果我在下面的代码片段中添加"delete[] d;",为什么我得到零?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 任何人都可以解释一下我是否需要 & 在第一个代码片段中
- 提取狮身人面像文档中的C++代码片段
- 为什么此代码片段有效?如何取消引用空点?
- 无法在这个基本的Qt代码片段中找到错误,但我被告知它肯定存在?
- 这个代码片段中会发生死锁吗?为什么
- 这个代码片段中的while循环是如何工作的
- 在给定的代码中,有人可以解释一下(int i = 0; i<len; i++)count[str[i]]++的代码片段;
- 为什么我的C++代码在以下打印链表的代码片段中显示分段错误?
- 为什么这两个代码片段具有相同的效果?
- 以下代码片段的时间复杂度是多少?
- 为什么以下代码片段存在编译错误
- 如何在此代码片段中创建 begin() 指针
- 为什么这个简短的模板代码片段有效
- 无法理解代码的特定片段:这是一个函数,只是一行还是什么
- "Observable behaviour"和编译器自由消除/转换片段 C++ 代码