Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
How to force a style sheet recalculation
I've got an application that has an application wide style sheet. In this there are some stylings for a specific button based on a Q_PROPERTY of that button. When I change the button property is there any way to force and update of the button.
From a Google search the best I can find is to use
But this is really excessive to set a huge application style on one widget, especially if the property changes several times. I've also tried polish and unpolish on the widget but that didn't help either.
every widget can also take a stylesheet, where you specify only those styles that will be used to customize the button
is this what you were looking for?
The problem is that if the style for the button is contained in the app wide style sheet, it doesn't get updated when a property of the button is changed unless you change the style sheet of the whole app, or apply the whole app style to the button.
I think the only solution is to have a separate style sheet for the button and use the setStyleSheet each time the property is changed...
yes its a perfectly valid scenario that you set a separate "small" style sheet for your button based on some application logic.
e.g., you could set 3 different colors to your button based on three different scenarios in your application ... then you just set three different stylesheets to your button ... depending on the logic flow
Well, I don't think the scenario is that valid to be honest. Steve wanted to use a property in the style sheet, and that is a valid approach. Forcing splitting up of the style, and even setting different styles depending on properties, defeats the purpose IMHO. There should be a valid way to trigger a redraw of a widget if a property affecting the style has been changed.
SteveKing: does your property emit a signal on change? That would be a minimum requirement to have the style respond to the change, I'd think. I am not at all sure it actually will if there is such a signal, but IMHO it should.
Andre: I think the property emits a signal, but I'll have a look at that and see if adding the signal makes any difference. I guess it wouldn't.
As for the different style sheets, this isn't an ideal solution but it's the best I can hope for in the short time I have available...
from the Qt Docs for Stylesheet syntax:
Warning: If the value of the Qt property changes after the style sheet has been set, it might be necessary to force a style sheet recomputation. One way to achieve this is to unset the style sheet and set it again.
Setting entire app style sheet is going to be costly and so you can setStyleSheet for specific widget. Why would Qt provide setStyleSheet at a widget level if that was not an optimal way to do things?
Also, see the "Property Selector" section in the stylesheet syntax doc for further info on how to set styles based on Q_PROPERTY.
I have read that part of the manual, and I understand that "One way to achieve this" is to set the style sheet (emphasis on the one way). I guess what I was asking is, is there another way that's less expensive...
From my web search and from the replies here it would seem that a better line in the docs would be "The ONLY way to do this..."
Anyway, I'm happy enough with the multiple style sheet solution so I guess it's problem solved.
That is "One way" to my knowledge .. and even I'm not sure if that is the ONLY way :)
Request if any Troll can clarify better ...
ogoffart last edited by
IIRC, calling buton->setStyleSheet("/* /"); should be enough to clear the caches for this widget and force a recomputation of the style.
(Notice "/ */" and not "" in order to avoid an empty stylesheet that would be ignored)
Hi Olivier, setStyleSheet line doesn't compile. It expects a string and if I convert it to regular quotes, the stylesheet is cleared.
ogoffart last edited by
"/* /" is a comment inside Quotes, that is, a string containing a comment. QString("/ */")
[quote author="SteveKing" date="1287412881"]Andre: I think the property emits a signal, but I'll have a look at that and see if adding the signal makes any difference. I guess it wouldn't.[/quote]
I fear so too, but you'd say that in an ideal world, it should. Also, I think it would be perfectly possible to do. If the rendering of a widget depends on a property, then a change of that property should, IMHO, cause a trigger to see if a re-render is needed. Just like hovering, getting focus etc. do. As long as there is a signal for the property change, this should be possible. Having to re-set the style sheet is a hackish workaround, IMHO.
I created a bugreport suggesting that property changes should trigger an update of the styling automatically: "http://bugreports.qt.nokia.com/browse/QTBUG-14601":http://bugreports.qt.nokia.com/browse/QTBUG-14601
[edit: fixed link / chetankjain]
genjix last edited by
wait, so there's no way to do style changes for hover/selecting a button? There should be :p
DenisKormalev last edited by
genjix, for hovering or clicking on a button there are pseudo-states in stylesheets.
Just for reference:
Here it is indicated that using a unpolish()/polish() pair of calls would be the fastest way to force the update.
When first being classified as "a sensible idea" and asking for more info, the JIRA ticket has now been closed as "Out of scope" because Qt is "more focussed on QML than in widgets" now.
I read in that: f*ck everybody who invested hundreds or thousands of developer hours into widget based applications; everybody who is not immediately jumping onto the immature Quick bandwagon is screwed.
I am really disapointed by this. While I see Quick as a very interesting technology for creating flashy touch UI's, conventional widgets have a huge invested base and do have their advantages. At least it is proven technology. I would have expected to see them live on side by side for quite a while, as there are use cases for both stacks. It seems I was wrong. :-(
karolyi last edited by
Coming here after googling, just a quick reply:
meanwhile, QStyle.polish() seems to apply the recomputed style on the change widget.
LeLev last edited by