Reputation: 3007
I am using Qt5 on Windows 7. In my current app I have the following piece of code that changes the background color of some push-buttons:
...
for(int i = 0; i < layout()->count(); i++)
{
QPushButton * button = static_cast<QPushButton*>(layout()->itemAt(i)->widget());
button->setStyleSheet(backgroundColor);
}
Well, I have 2 questions about the above code:
Is it ok/correct to use static_cast
or should I use some other type of casting?
Is it possible to use foreach
instead of the for loop
above?
Upvotes: 2
Views: 5776
Reputation: 98485
It is technically acceptable to use static_cast
only if you're sure that the layout only contains widget items and they all contain a QPushButton
. Since this is error prone in face of code modifications, I don't suggest doing it.
Instead, it is desirable to use range-for in C++11 or foreach
/Q_FOREACH
by using a layout iterator adapter. The iterator adapter also solves the problem of iterating only the elements of a type you desire and makes your code safe in face of modifications.
Your can then use range-for and this code is safe even if no QPushButton
s are in the layout, and will cope with any kind of layout item gracefully by ignoring it as it should:
for (auto button : IterableLayoutAdapter<QPushButton>(layout()))
button->setStyleSheet(backgroundColor);
Upvotes: 2
Reputation: 1299
If you are sure that all widgets are QPushButtons, then yes, static_cast is the best option (most efficient) Regarding the foreach, I'm not sure you can get the QLayoutItems as some standard container, so I'm not sure you can do it.
Upvotes: 1
Reputation: 12931
You should use qobject_cast
so you can check if the cast was successful. It returns 0 if the cast failed.
QPushButton * button = qobject_cast<QPushButton*>(layout()->itemAt(i)->widget());
if(button)
// cast ok
else
// cast failed
You can't use foreach
as you would need a container for that.
Upvotes: 13