Styled custom widgets

Thomas Lübking thomas.luebking at web.de
Thu Sep 4 14:56:11 BST 2008


Am Thursday 04 September 2008 schrieb Girish Ramakrishnan:
> Well, instead of reserving enumerations in KStyle, you are now reserving
> strings. We need to make sure that strings used by different
> applications don't conflict. But that is easily overcome with a string
> format like "appname.element".
yupp.

> As for your solution, at this point, I would like to point out adding
> support for custom widgets in QStyle is not about adding PE_X, CE_X
> enums. One needs to add support for querying element positions, hit
> testing, sizes etc (which involves adding more enums like SC_, CC_, SE_).
for complex widgets, yes...
currently i'd be happy to impat the look at all though ;-)

> Give that, you are going to have add support to query all the above
> dynamically.
semi-dynamically (as mentioned: on construction and style change is enough, if 
you expect many instances, you can also carry static QMap's<QStyle*, int> as 
cache)

> I still prefer the SH_SupportsXX approach :) but I don't
> really know about the release dynamics. So, if you still want to do a
> dynamic string -> enum lookup, I would suggest:
> 1. Make sure the strings are namespaced ("appname.widget")
> 2. Create,
>    struct KCustomWidgetStyleOption: public QStyleOption
>    {
>         QString widgetName;
>    };
>
>    struct KCustomWidgetHintReturn : public QStyleHintReturn
>    {
>        QList<int> primtiveElements; // well defined order
>        QList<int> subcontrolElements;
>        // .. and so on ..
>    };
>
>    In the widget,
>
>    style()->styleHint(SH_CustomWidget, &customWidgetStypeOption, this,
>                       &returnData);

That means, that widgets and style must be (silently) in accordance about the 
returndata, yesno? ("well defined order" i.e. what listelement means what?)
I fear this will fail... :-\
So if introducing a new styleoption 
struct KCustomWidgetStyleOption: public QStyleOption
{
    QString elementName; // SEE THIS LINE =D
};
is less trouble than playing with the widgetname, i'd prefer:

KCustomWidgetStyleOption opt;
opt.elementName = "amarok.CC_Analyzer";
d.styleElements.cc_analyzer = style()->styleHint(SH_CustomWidget, 
&customWidgetStypeOption, this);

::paintEvent(.)
{
	if (d.styleElements.cc_analyzer)
		style()->drawComplexControl(.);
	else
		drawFallback();
}

(btw: Qt calls a stylehint everytime you type into a secret echo box... and 
couple of times painting every push/tool-button - it's probably not that much 
overhead ;-)

Thomas






More information about the kde-core-devel mailing list