סטנלי גרונן
סטנלי גרונן

Reputation: 3007

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

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:

  1. Is it ok/correct to use static_cast or should I use some other type of casting?

  2. Is it possible to use foreach instead of the for loop above?

Upvotes: 2

Views: 5776

Answers (3)

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 QPushButtons 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

gbehar
gbehar

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

thuga
thuga

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

Related Questions