|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
4 ** All rights reserved. |
|
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 ** |
|
7 ** This file is part of the documentation of the Qt Toolkit. |
|
8 ** |
|
9 ** $QT_BEGIN_LICENSE:LGPL$ |
|
10 ** No Commercial Usage |
|
11 ** This file contains pre-release code and may not be distributed. |
|
12 ** You may use this file in accordance with the terms and conditions |
|
13 ** contained in the Technology Preview License Agreement accompanying |
|
14 ** this package. |
|
15 ** |
|
16 ** GNU Lesser General Public License Usage |
|
17 ** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 ** General Public License version 2.1 as published by the Free Software |
|
19 ** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 ** packaging of this file. Please review the following information to |
|
21 ** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 ** |
|
24 ** In addition, as a special exception, Nokia gives you certain additional |
|
25 ** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 ** |
|
28 ** If you have questions regarding the use of this file, please contact |
|
29 ** Nokia at qt-info@nokia.com. |
|
30 ** |
|
31 ** |
|
32 ** |
|
33 ** |
|
34 ** |
|
35 ** |
|
36 ** |
|
37 ** |
|
38 ** $QT_END_LICENSE$ |
|
39 ** |
|
40 ****************************************************************************/ |
|
41 |
|
42 /*! |
|
43 \group appearance |
|
44 \title Widget Appearance and Style |
|
45 \brief Classes used for customizing UI appearance and style. |
|
46 */ |
|
47 |
|
48 /*! |
|
49 \page style-reference.html |
|
50 \title Implementing Styles and Style Aware Widgets |
|
51 \brief An overview of styles and the styling of widgets. |
|
52 |
|
53 \ingroup frameworks-technologies |
|
54 |
|
55 \previouspage Widget Classes |
|
56 \contentspage Widgets and Layouts |
|
57 \nextpage {Qt Style Sheets}{Style sheets} |
|
58 |
|
59 Styles (classes that inherit QStyle) draw on behalf of widgets |
|
60 and encapsulate the look and feel of a GUI. The QStyle class is |
|
61 an abstract base class that encapsulates the look and feel of a |
|
62 GUI. Qt's built-in widgets use it to perform nearly all of their |
|
63 drawing, ensuring that they look exactly like the equivalent |
|
64 native widgets. |
|
65 |
|
66 Several styles are built into Qt (e.g., windows style and motif style). |
|
67 Other styles are only available on specific platforms (such as |
|
68 the windows XP style). Custom styles are made available as plugins |
|
69 or by creating an instance of the style class in an application and |
|
70 setting it with QApplication::setStyle(). |
|
71 |
|
72 To implement a new style, you inherit one of Qt's existing styles |
|
73 - the one most resembling the style you want to create - and |
|
74 reimplement a few virtual functions. This process is somewhat |
|
75 involved, and we therefore provide this overview. We give a |
|
76 step-by-step walkthrough of how to style individual Qt widgets. |
|
77 We will examine the QStyle virtual functions, member variables, |
|
78 and enumerations. |
|
79 |
|
80 The part of this document that does not concern the styling of |
|
81 individual widgets is meant to be read sequentially because later |
|
82 sections tend to depend on earlier ones. The description of the |
|
83 widgets can be used for reference while implementing a style. |
|
84 However, you may need to consult the Qt source code in some cases. |
|
85 The sequence in the styling process should become clear after |
|
86 reading this document, which will aid you in locating relevant code. |
|
87 |
|
88 To develop style aware widgets (i.e., widgets that conform to |
|
89 the style in which they are drawn), you need to draw them using the |
|
90 current style. This document shows how widgets draw themselves |
|
91 and which possibilities the style gives them. |
|
92 |
|
93 \tableofcontents |
|
94 |
|
95 \section1 Classes for Widget Styling |
|
96 |
|
97 These classes are used to customize an application's appearance and |
|
98 style. |
|
99 |
|
100 \annotatedlist appearance |
|
101 |
|
102 \section1 The QStyle implementation |
|
103 |
|
104 The API of QStyle contains functions that draw the widgets, static |
|
105 helper functions to do common and difficult tasks (e.g., |
|
106 calculating the position of slider handles) and functions to do |
|
107 the various calculations necessary while drawing (e.g., for the |
|
108 widgets to calculate their size hints). The style also help some |
|
109 widgets with the layout of their contents. In addition, it creates |
|
110 a QPalette that contains \l{QBrush}es to draw with. |
|
111 |
|
112 QStyle draws graphical elements; an element is a widget or a |
|
113 widget part like a push button bevel, a window frame, or a scroll |
|
114 bar. Most draw functions now take four arguments: |
|
115 |
|
116 \list |
|
117 \o an enum value specifying which graphical element to draw |
|
118 \o a QStyleOption specifying how and where to render that element |
|
119 \o a QPainter that should be used to draw the element |
|
120 \o a QWidget on which the drawing is performed (optional) |
|
121 \endlist |
|
122 |
|
123 When a widget asks a style to draw an element, it provides the style |
|
124 with a QStyleOption, which is a class that contains the information |
|
125 necessary for drawing. Thanks to QStyleOption, it is possible to make |
|
126 QStyle draw widgets without linking in any code for the widget. This |
|
127 makes it possible to use \l{QStyle}'s draw functions on any paint |
|
128 device, i.e., you can draw a combobox on any widget, not just on a |
|
129 QComboBox. |
|
130 |
|
131 The widget is passed as the last argument in case the style needs |
|
132 it to perform special effects (such as animated default buttons on |
|
133 Mac OS X), but it isn't mandatory. |
|
134 |
|
135 We will in the course of this section look at the style elements, |
|
136 the style options, and the functions of QStyle. Finally, we describe |
|
137 how the palette is used. |
|
138 |
|
139 Items in item views is drawn by \l{Delegate Classes}{delegates} in |
|
140 Qt. The item view headers are still drawn by the style. Qt's |
|
141 default delegate, QStyledItemDelegate, draws its items partially |
|
142 through the current style; it draws the check box indicators and |
|
143 calculate bounding rectangles for the elements of which the item |
|
144 consists. In this document, we only describe how to implement a |
|
145 QStyle subclass. If you wish to add support for other datatypes |
|
146 than those supported by the QStyledItemDelegate, you need to |
|
147 implement a custom delegate. Note that delegates must be set |
|
148 programmatically for each individual widget (i.e., default |
|
149 delegates cannot be provided as plugins). |
|
150 |
|
151 \section2 The Style Elements |
|
152 |
|
153 A style element is a graphical part of a GUI. A widget consists |
|
154 of a hierarchy (or tree) of style elements. For instance, when a |
|
155 style receives a request to draw a push button (from QPushButton, |
|
156 for example), it draws a label (text and icon), a button bevel, |
|
157 and a focus frame. The button bevel, in turn, consists of a frame |
|
158 around the bevel and two other elements, which we will look at |
|
159 later. Below is a conceptual illustration of the push button |
|
160 element tree. We will see the actual tree for QPushButton when we |
|
161 go through the individual widgets. |
|
162 |
|
163 \image javastyle/conceptualpushbuttontree.png |
|
164 |
|
165 Widgets are not necessarily drawn by asking the style to draw |
|
166 only one element. Widgets can make several calls to the style to |
|
167 draw different elements. An example is QTabWidget, which draws its |
|
168 tabs and frame individually. |
|
169 |
|
170 There are three element types: primitive elements, control |
|
171 elements, and complex control elements. The elements are defined |
|
172 by the \l{QStyle::}{ComplexControl}, \l{QStyle::}{ControlElement}, |
|
173 and \l{QStyle::}{PrimitiveElement} enums. The values of |
|
174 each element enum has a prefix to identify their type: \c{CC_} for |
|
175 complex elements, \c{CE_} for control elements, and \c{PE_} for |
|
176 primitive elements. We will in the following three sections see what |
|
177 defines the different elements and see examples of widgets that use |
|
178 them. |
|
179 |
|
180 The QStyle class description contains a list of these elements and |
|
181 their roles in styling widgets. We will see how they are used when |
|
182 we style individual widgets. |
|
183 |
|
184 \section3 Primitive Elements |
|
185 |
|
186 Primitive elements are GUI elements that are common and often used |
|
187 by several widgets. Examples of these are frames, button bevels, |
|
188 and arrows for spin boxes, scroll bars, and combo boxes. |
|
189 Primitive elements cannot exist on their own: they are always part |
|
190 of a larger construct. They take no part in the interaction with |
|
191 the user, but are passive decorations in the GUI. |
|
192 |
|
193 \section3 Control Elements |
|
194 |
|
195 A control element performs an action or displays information |
|
196 to the user. Examples of control elements are push buttons, check |
|
197 boxes, and header sections in tables and tree views. Control |
|
198 elements are not necessarily complete widgets such as push |
|
199 buttons, but can also be widget parts such as tab bar tabs and |
|
200 scroll bar sliders. They differ from primitive elements in that |
|
201 they are not passive, but fill a function in the interaction with |
|
202 the user. Controls that consist of several elements often use the |
|
203 style to calculate the bounding rectangles of the elements. The |
|
204 available sub elements are defined by the \l{QStyle::}{SubElement} |
|
205 enum. This enum is only used for calculating bounding rectangles, |
|
206 and sub elements are as such not graphical elements to be drawn |
|
207 like primitive, control, and complex elements. |
|
208 |
|
209 \section3 Complex Control Elements |
|
210 |
|
211 Complex control elements contain sub controls. Complex controls |
|
212 behave differently depending on where the user handles them with |
|
213 the mouse and which keyboard keys are pressed. This is dependent |
|
214 on which sub control (if any) that the mouse is over or received a |
|
215 mouse press. Examples of complex controls are scroll bars and |
|
216 combo boxes. With a scroll bar, you can use the mouse to move the |
|
217 slider and press the line up and line down buttons. The available |
|
218 sub controls are defined by the \l{QStyle}{SubControl} enum. |
|
219 |
|
220 In addition to drawing, the style needs to provide the widgets |
|
221 with information on which sub control (if any) a mouse press was |
|
222 made on. For instance, a QScrollBar needs to know if the user |
|
223 pressed the slider, the slider groove, or one of the buttons. |
|
224 |
|
225 Note that sub controls are not the same as the control elements |
|
226 described in the previous section. You cannot use the style to |
|
227 draw a sub control; the style will only calculate the bounding |
|
228 rectangle in which the sub control should be drawn. It is common, |
|
229 though, that complex elements use control and primitive elements |
|
230 to draw their sub controls, which is an approach that is |
|
231 frequently used by the built-in styles in Qt and also the Java |
|
232 style. For instance, the Java style uses PE_IndicatorCheckBox to |
|
233 draw the check box in group boxes (which is a sub control of |
|
234 CC_GroupBox). Some sub controls have an equivalent control element, |
|
235 e.g., the scroll bar slider (SC_SCrollBarSlider and |
|
236 CE_ScrollBarSlider). |
|
237 |
|
238 \section3 Other QStyle Tasks |
|
239 |
|
240 The style elements and widgets, as mentioned, use the style to |
|
241 calculate bounding rectangles of sub elements and sub controls, |
|
242 and pixel metrics, which is a style dependent size in screen |
|
243 pixels, for measures when drawing. The available rectangles and |
|
244 pixel metrics are represented by three enums in QStyle: |
|
245 \l{QStyle::}{SubElement}, \l{QStyle::}{SubControl}, and |
|
246 \l{QStyle::}{PixelMetric}. Values of the enums can easily by |
|
247 identified as they start with SE_, SC_ and PM_. |
|
248 |
|
249 The style also contain a set of style hints, which is |
|
250 represented as values in the \l{QStyle::}{StyleHint} enum. All |
|
251 widgets do not have the same functionality and look in the |
|
252 different styles. For instance, when the menu items in a menu do not |
|
253 fit in a single column on the screen, some styles support |
|
254 scrolling while others draw more than one column to fit all items. |
|
255 |
|
256 A style usually has a set of standard images (such as a warning, a |
|
257 question, and an error image) for message boxes, file dialogs, |
|
258 etc. QStyle provides the \l{QStyle::}{StandardPixmap} enum. Its |
|
259 values represent the standard images. Qt's widgets use these, so |
|
260 when you implement a custom style you should supply the images |
|
261 used by the style that is being implemented. |
|
262 |
|
263 The style calculates the spacing between widgets in layouts. There |
|
264 are two ways the style can handle these calculations. You can set |
|
265 the PM_LayoutHorizontalSpacing and PM_LayoutVerticalSpacing, which |
|
266 is the way the java style does it (through QCommonStyle). |
|
267 Alternatively, you can implement QStyle::layoutSpacing() and |
|
268 QStyle::layoutSpacingImplementation() if you need more control over |
|
269 this part of the layout. In these functions you can calculate the |
|
270 spacing based on control types (QSizePolicy::ControlType) for |
|
271 different size policies (QSizePolicy::Policy) and also the style |
|
272 option for the widget in question. |
|
273 |
|
274 \section2 Style Options |
|
275 |
|
276 The sub-classes of QStyleOption contain all information necessary |
|
277 to style the individual elements. Style options are instantiated - |
|
278 usually on the stack - and filled out by the caller of the QStyle |
|
279 function. Depending on what is drawn the style will expect |
|
280 different a different style option class. For example, the |
|
281 QStyle::PE_FrameFocusRect element expects a QStyleOptionFocusRect |
|
282 argument, and it's possible to create custom subclasses that a |
|
283 custom style can use. The style options keep public variables |
|
284 for performance reasons. |
|
285 |
|
286 The widgets can be in a number of different states, which are |
|
287 defined by the \l{QStyle::}{State} enum. Some of the state flags have |
|
288 different meanings depending on the widget, but others are common |
|
289 for all widgets like State_Disabled. It is QStyleOption that sets |
|
290 the common states with QStyleOption::initFrom(); the rest of the |
|
291 states are set by the individual widgets. |
|
292 |
|
293 Most notably, the style options contain the palette and bounding |
|
294 rectangles of the widgets to be drawn. Most widgets have |
|
295 specialized style options. QPushButton and QCheckBox, for |
|
296 instance, use QStyleOptionButton as style option, which contain |
|
297 the text, icon, and the size of their icon. The exact contents of |
|
298 all options are described when we go through individual widgets. |
|
299 |
|
300 When reimplementing QStyle functions that take a |
|
301 QStyleOption parameter, you often need to cast the |
|
302 QStyleOption to a subclass (e.g., QStyleOptionFocusRect). For |
|
303 safety, you can use qstyleoption_cast() to ensure that the |
|
304 pointer type is correct. If the object isn't of the right type, |
|
305 qstyleoption_cast() returns 0. For example: |
|
306 |
|
307 \snippet doc/src/snippets/code/doc_src_qt4-styles.qdoc 0 |
|
308 |
|
309 The following code snippet illustrates how to use QStyle to |
|
310 draw the focus rectangle from a custom widget's paintEvent(): |
|
311 |
|
312 \snippet doc/src/snippets/code/doc_src_qt4-styles.qdoc 1 |
|
313 |
|
314 The next example shows how to derive from an existing style to |
|
315 customize the look of a graphical element: |
|
316 |
|
317 \snippet doc/src/snippets/customstyle/customstyle.h 0 |
|
318 \codeline |
|
319 \snippet doc/src/snippets/customstyle/customstyle.cpp 2 |
|
320 \snippet doc/src/snippets/customstyle/customstyle.cpp 3 |
|
321 \snippet doc/src/snippets/customstyle/customstyle.cpp 4 |
|
322 |
|
323 \section2 QStyle Functions |
|
324 |
|
325 The QStyle class defines three functions for drawing the primitive, |
|
326 control, and complex elements: |
|
327 \l{QStyle::}{drawPrimitive()}, |
|
328 \l{QStyle::}{drawControl()}, and |
|
329 \l{QStyle::}{drawComplexControl()}. The functions takes the |
|
330 following parameters: |
|
331 |
|
332 \list |
|
333 \o the enum value of the element to draw |
|
334 \o a QStyleOption which contains the information needed to |
|
335 draw the element. |
|
336 \o a QPainter with which to draw the element. |
|
337 \o a pointer to a QWidget, typically the widget |
|
338 that the element is painted on. |
|
339 \endlist |
|
340 |
|
341 Not all widgets send a pointer to themselves. If the style |
|
342 option sent to the function does not contain the information you |
|
343 need, you should check the widget implementation to see if it |
|
344 sends a pointer to itself. |
|
345 |
|
346 The QStyle class also provides helper functions that are used |
|
347 when drawing the elements. The \l{QStyle::}{drawItemText()} |
|
348 function draws text within a specified rectangle and taking a |
|
349 QPalette as a parameter. The \l{QStyle::}{drawItemPixmap()} |
|
350 function helps to align a pixmap within a specified bounding |
|
351 rectangle. |
|
352 |
|
353 Other QStyle functions do various calculations for the |
|
354 functions that draw. The widgets also use these functions for |
|
355 calculating size hints and also for bounding rectangle |
|
356 calculations if they draw several style elements themselves. |
|
357 As with the functions that draw elements the helper functions |
|
358 typically takes the same arguments. |
|
359 |
|
360 \list |
|
361 \o The \l{QStyle::}{subElementRect()} function takes a |
|
362 \l{QStyle::}{SubElement} enum value, and calculates a bounding |
|
363 rectangle for a sub element. The style uses this function to |
|
364 know where to draw the different parts of an element. This is |
|
365 mainly done for reuse. If you create a new style, you can use |
|
366 the same location of sub elements as the super class. |
|
367 |
|
368 \o The \l{QStyle::}{subControlRect()} function is used to |
|
369 calculate bounding rectangles for sub controls in complex |
|
370 controls. When you implement a new style, you reimplement \c |
|
371 subControlRect() and calculate the rectangles that are different |
|
372 from the super class. |
|
373 |
|
374 \o The \l{QStyle::}{pixelMetric()} function returns a pixel |
|
375 metric, which is a style dependent size given in screen |
|
376 pixels. It takes a value of the \l{QStyle::}{PixelMetric} enum |
|
377 and returns the correct measure. Note that pixel metrics do |
|
378 not necessarily have to be static measures, but can be |
|
379 calculated with, for example, the style option. |
|
380 |
|
381 \o The \l{QStyle::}{hitTestComplexControl()} function returns the |
|
382 sub control that the mouse pointer is over in a complex control. |
|
383 Usually, this is simply a matter of using |
|
384 \l{QStyle::}{subControlRect()} to get the bounding rectangles of |
|
385 the sub controls, and see which rectangle contains the position of |
|
386 the cursor. |
|
387 \endlist |
|
388 |
|
389 QStyle also have the functions \l{QStyle::}{polish()} and |
|
390 \l{QStyle::}{unpolish()}. All widgets are sent to the \c polish() |
|
391 function before being shown and to \c unpolish() when they |
|
392 are hidden. You can use these functions to set attributes on the |
|
393 widgets or do other work that is required by your style. For |
|
394 instance, if you need to know when the mouse is hovering over the |
|
395 widget, you need to set the \l{Qt::}{WA_Hover} widget attribute. |
|
396 The State_MouseOver state flag will then be set in the widget's |
|
397 style options. |
|
398 |
|
399 QStyle has a few static helper functions that do some common and |
|
400 difficult tasks. They can calculate the position of a slider |
|
401 handle from the value of the slider and transform rectangles |
|
402 and draw text considering reverse layouts; see the QStyle |
|
403 class documentation for more details. |
|
404 |
|
405 The usual approach when one reimplements QStyle virtual |
|
406 functions is to do work on elements that are different from the |
|
407 super class; for all other elements, you can simply use the super |
|
408 class implementation. |
|
409 |
|
410 \section2 The Palette |
|
411 |
|
412 Each style provides a color - that is, QBrush - palette that |
|
413 should be used for drawing the widgets. There is one set of colors |
|
414 for the different widget states (QPalette::ColorGroup): active |
|
415 (widgets in the window that has keyboard focus), inactive (widgets |
|
416 used for other windows), and disabled (widgets that are set |
|
417 disabled). The states can be found by querying the State_Active |
|
418 and State_Enabled state flags. Each set contains color certain |
|
419 roles given by the QPalette::ColorRole enum. The roles describe in |
|
420 which situations the colors should be used (e.g., for painting |
|
421 widget backgrounds, text, or buttons). |
|
422 |
|
423 How the color roles are used is up to the style. For instance, if |
|
424 the style uses gradients, one can use a palette color and make it |
|
425 darker or lighter with QColor::darker() and QColor::lighter() to |
|
426 create the gradient. In general, if you need a brush that is not |
|
427 provided by the palette, you should try to derive it from one. |
|
428 |
|
429 QPalette, which provides the palette, stores colors for |
|
430 different widget states and color roles. The palette for a style |
|
431 is returned by \l{QStyle::}{standardPalette()}. The standard |
|
432 palette is not installed automatically when a new style is set |
|
433 on the application (QApplication::setStyle()) or widget |
|
434 (QWidget::setStyle()), so you must set the palette yourself |
|
435 with (QApplication::setPalette()) or (QWidget::setPalette()). |
|
436 |
|
437 It is not recommended to hard code colors as applications and |
|
438 individual widgets can set their own palette and also use the |
|
439 styles palette for drawing. Note that none of Qt's widgets set |
|
440 their own palette. The java style does hard code some colors, but |
|
441 its author looks past this in silence. Of course, it is not |
|
442 intended that the style should look good with any palette. |
|
443 |
|
444 \section2 Implementation Issues |
|
445 |
|
446 When you implement styles, there are several issues to |
|
447 consider. We will give some hints and advice on implementation |
|
448 here. |
|
449 |
|
450 When implementing styles, it is necessary to look through the |
|
451 code of the widgets and code of the base class and its ancestors. |
|
452 This is because the widgets use the style differently, because the |
|
453 implementation in the different styles virtual functions can |
|
454 affect the state of the drawing (e.g., by altering the QPainter |
|
455 state without restoring it and drawing some elements without using |
|
456 the appropriate pixel metrics and sub elements). |
|
457 |
|
458 It is recommended that the styles do not alter the proposed size |
|
459 of widgets with the QStyle::sizeFromContents() function but let |
|
460 the QCommonStyle implementation handle it. If changes need to be |
|
461 made, you should try to keep them small; application development |
|
462 may be difficult if the layout of widgets looks considerably |
|
463 different in the various styles. |
|
464 |
|
465 We recommend using the QPainter directly for drawing, i.e., not |
|
466 use pixmaps or images. This makes it easier for the style conform |
|
467 to the palette (although you can set your own color table on a |
|
468 QImage with \l{QImage::}{setColorTable()}). |
|
469 |
|
470 It is, naturally, possible to draw elements without using the |
|
471 style to draw the sub elements as intended by Qt. This is |
|
472 discouraged as custom widgets may depend on these sub elements to |
|
473 be implemented correctly. The widget walkthrough shows how Qt |
|
474 uses the sub elements. |
|
475 |
|
476 \section1 Java Style |
|
477 |
|
478 We have implemented a style that resembles the Java default look |
|
479 and feel (previously known as Metal). We have done this as it is |
|
480 relatively simple to implement and we wanted to build a style for |
|
481 this overview document. To keep it simple and not to extensive, we |
|
482 have simplified the style somewhat, but Qt is perfectly able to |
|
483 make an exact copy of the style. However, there are no concrete |
|
484 plans to implement the style as a part of Qt. |
|
485 |
|
486 In this section we will have a look at some implementation |
|
487 issues. Finally, we will see a complete example on the styling of |
|
488 a Java widget. We will continue to use the java style |
|
489 throughout the document for examples and widget images. The |
|
490 implementation itself is somewhat involved, and it is not |
|
491 intended that you should read through it. |
|
492 |
|
493 \section2 Design and Implementation |
|
494 |
|
495 The first step in designing the style was to select the base |
|
496 class. We chose to subclass QWindowsStyle. This class implements |
|
497 most of the functionality we need other than performing the actual |
|
498 drawing. Also, windows and java share layout of sub controls for |
|
499 several of the complex controls (which reduces the amount of code |
|
500 required considerably). |
|
501 |
|
502 The style is implemented in one class. We have done this |
|
503 because we find it convenient to keep all code in one file. Also, |
|
504 it is an advantage with regards to optimization as we instantiate |
|
505 less objects. We also keep the number of functions at a minimum by |
|
506 using switches to identify which element to draw in the functions. |
|
507 This results in large functions, but since we divide the code for |
|
508 each element in the switches, the code should still be easy to |
|
509 read. |
|
510 |
|
511 \section2 Limitations and Differences from Java |
|
512 |
|
513 We have not fully implemented every element in the Java style. |
|
514 This way, we have reduced the amount and complexity of the code. |
|
515 In general, the style was intended as a practical example for |
|
516 this style overview document, and not to be a part of Qt |
|
517 itself. |
|
518 |
|
519 Not all widgets have every state implemented. This goes for |
|
520 states that are common, e.g., State_Disabled. Each state is, |
|
521 however, implemented for at least one widget. |
|
522 |
|
523 We have only implemented ticks below the slider. Flat push |
|
524 buttons are also left out. We do not handle the case where the |
|
525 title bars and dock window titles grows to small for their |
|
526 contents, but simply draw sub controls over each other. |
|
527 |
|
528 We have not tried to emulate the Java fonts. Java and Qt use very |
|
529 different font engines, so we don't consider it worth the effort |
|
530 as we only use the style as an example for this overview. |
|
531 |
|
532 We have hardcoded the colors (we don't use the QPalette) for |
|
533 the linear gradients, which are used, for example, for button |
|
534 bevels, tool bars, and check boxes. This is because the Java |
|
535 palette cannot produce these colors. Java does not change these |
|
536 colors based on widget color group or role anyway (they are not |
|
537 dependent on the palette), so it does not present a problem in any |
|
538 case. |
|
539 |
|
540 It is Qt's widgets that are styled. Some widgets do not exist |
|
541 at all in Java, e.g., QToolBox. Others contain elements that the |
|
542 Java widgets don't. The tree widget is an example of the latter in |
|
543 which Java's JTree does not have a header. |
|
544 |
|
545 The style does not handle reverse layouts. We assume that the |
|
546 layout direction is left to right. QWindowsStyle handles reverse |
|
547 widgets; if we implemented reverse layouts, widgets that we change |
|
548 the position of sub elements, or handle text alignment in labels |
|
549 our selves would need to be updated. |
|
550 |
|
551 \section2 Styling Java Check Boxes |
|
552 |
|
553 As an example, we will examine the styling of check boxes in the |
|
554 java style. We describe the complete process and print all code in |
|
555 both the java style and Qt classes involved. In the rest of this |
|
556 document, we will not examine the source code of the individual |
|
557 widgets. Hopefully, this will give you an idea on how to search |
|
558 through the code if you need to check specific implementation |
|
559 details; most widgets follow the same structure as the check |
|
560 boxes. We have edited the QCommonStyle code somewhat to remove |
|
561 code that is not directly relevant for check box styling. |
|
562 |
|
563 We start with a look at how QCheckBox builds it style option, |
|
564 which is QStyleOptionButton for checkboxes: |
|
565 |
|
566 \snippet doc/src/snippets/code/doc_src_styles.qdoc 0 |
|
567 |
|
568 First we let QStyleOption set up the option with the information |
|
569 that is common for all widgets with \c initFrom(). We will look at |
|
570 this shortly. |
|
571 |
|
572 The down boolean is true when the user press the box down; this is |
|
573 true whether the box is checked or not of the checkbox. The |
|
574 State_NoChange state is set when we have a tristate checkbox and |
|
575 it is partially checked. It has State_On if the box is checked and |
|
576 State_Off if it is unchecked. State_MouseOver is set if the mouse |
|
577 hovers over the checkbox and the widget has attribute Qt::WA_Hover |
|
578 set - you set this in QStyle::polish(). In addition, the style |
|
579 option also contains the text, icon, and icon size of the button. |
|
580 |
|
581 \l{QStyleOption::}{initFrom()} sets up the style option with the |
|
582 attributes that are common for all widgets. We print its |
|
583 implementation here: |
|
584 |
|
585 \snippet doc/src/snippets/code/doc_src_styles.qdoc 1 |
|
586 |
|
587 The State_Enabled is set when the widget is enabled. When the |
|
588 widget has focus the State_HasFocus flag is set. Equally, the |
|
589 State_Active flag is set when the widget is a child of the active |
|
590 window. The State_MouseOver will only be set if the widget has |
|
591 the WA_HoverEnabled windows flag set. Notice that keypad |
|
592 navigation must be enabled in Qt for the State_HasEditFocus to |
|
593 be included; it is not included by default. |
|
594 |
|
595 In addition to setting state flags the QStyleOption contains |
|
596 other information about the widget: \c direction is the layout |
|
597 direction of the layout, \c rect is the bounding rectangle of the |
|
598 widget (the area in which to draw), \c palette is the QPalette |
|
599 that should be used for drawing the widget, and \c fontMetrics is |
|
600 the metrics of the font that is used by the widget. |
|
601 |
|
602 We give an image of a checkbox and the style option to match |
|
603 it. |
|
604 |
|
605 \image javastyle/checkboxexample.png A java style checkbox |
|
606 |
|
607 The above checkbox will have the following state flags in its |
|
608 style option: |
|
609 |
|
610 \table 90% |
|
611 \header |
|
612 \o State flag |
|
613 \o Set |
|
614 \row |
|
615 \o State_Sunken |
|
616 \o Yes |
|
617 \row |
|
618 \o State_NoChange |
|
619 \o No |
|
620 \row |
|
621 \o State_On |
|
622 \o Yes |
|
623 \row |
|
624 \o State_Off |
|
625 \o No |
|
626 \row |
|
627 \o State_MouseOver |
|
628 \o Yes |
|
629 \row |
|
630 \o State_Enabled |
|
631 \o Yes |
|
632 \row |
|
633 \o State_HasFocus |
|
634 \o Yes |
|
635 \row |
|
636 \o State_KeyboardFocusChange |
|
637 \o No |
|
638 \row |
|
639 \o State_Active |
|
640 \o Yes |
|
641 \endtable |
|
642 |
|
643 The QCheckBox paints itself in QWidget::paintEvent() with |
|
644 style option \c opt and QStylePainter \c p. The QStylePainter |
|
645 class is a convenience class to draw style elements. Most |
|
646 notably, it wraps the methods in QStyle used for painting. The |
|
647 QCheckBox draws itself as follows: |
|
648 |
|
649 \snippet doc/src/snippets/code/doc_src_styles.qdoc 2 |
|
650 |
|
651 QCommonStyle handles the CE_CheckBox element. The QCheckBox |
|
652 has two sub elements: SE_CheckBoxIndicator (the checked indicator) |
|
653 and SE_CheckBoxContents (the contents, which is used for the |
|
654 checkbox label). QCommonStyle also implements these sub element |
|
655 bounding rectangles. We have a look at the QCommonStyle code: |
|
656 |
|
657 \snippet doc/src/snippets/code/doc_src_styles.qdoc 3 |
|
658 |
|
659 As can be seen from the code extract, the common style gets |
|
660 the bounding rectangles of the two sub elements of |
|
661 CE_CheckBox, and then draws them. If the checkbox has focus, |
|
662 the focus frame is also drawn. |
|
663 |
|
664 The java style draws CE_CheckBoxIndicator, while QCommonStyle |
|
665 handles CE_CheckboxLabel. We will examine each implementation and |
|
666 start with CE_CheckBoxLabel: |
|
667 |
|
668 \snippet doc/src/snippets/code/doc_src_styles.qdoc 4 |
|
669 |
|
670 \l{QStyle::}{visualAlignment()} adjusts the alignment of text |
|
671 according to the layout direction. We then draw an icon if it |
|
672 exists, and adjust the space left for the text. |
|
673 \l{QStyle::}{drawItemText()} draws the text taking alignment, |
|
674 layout direction, and the mnemonic into account. It also uses the |
|
675 palette to draw the text in the right color. |
|
676 |
|
677 The drawing of labels often get somewhat involved. Luckily, it |
|
678 can usually be handled by the base class. The java style |
|
679 implements its own push button label since Java-contrary to |
|
680 windows-center button contents also when the button has an icon. |
|
681 You can examine that implementation if you need an example of |
|
682 reimplementing label drawing. |
|
683 |
|
684 We take a look at the java implementation |
|
685 of CE_CheckBoxIndicator in \c drawControl(): |
|
686 |
|
687 \snippet doc/src/snippets/javastyle.cpp 0 |
|
688 |
|
689 We first save the state of the painter. This is not always |
|
690 necessary but in this case the QWindowsStyle needs the painter in |
|
691 the same state as it was when PE_IndicatorCheckBox was called (We |
|
692 could also set the state with function calls, of course). We then |
|
693 use \c drawButtonBackground() to draw the background of the check |
|
694 box indicator. This is a helper function that draws the background |
|
695 and also the frame of push buttons and check boxes. We take a look |
|
696 at that function below. We then check if the mouse is hovering |
|
697 over the checkbox. If it is, we draw the frame java checkboxes |
|
698 have when the box is not pressed down and the mouse is over it. |
|
699 You may note that java does not handle tristate boxes, so we have |
|
700 not implemented it. |
|
701 |
|
702 Here we use a png image for our indicator. We could also check |
|
703 here if the widget is disabled. We would then have to use |
|
704 another image with the indicator in the disabled color. |
|
705 |
|
706 \snippet doc/src/snippets/javastyle.cpp 1 |
|
707 |
|
708 We have seen how check boxes are styled in the java style from the |
|
709 widget gets a paint request to the style is finished painting. To |
|
710 learn in detail how each widget is painted, you need to go through |
|
711 the code step-by-step as we have done here. However, it is |
|
712 usually enough to know which style elements the widgets draw. The |
|
713 widget builds a style option and calls on the style one or more |
|
714 times to draw the style elements of which it consists. Usually, |
|
715 it is also sufficient to know the states a widget can be in and the |
|
716 other contents of the style option, i.e., what we list in the next |
|
717 section. |
|
718 |
|
719 \section1 Widget Walkthrough |
|
720 |
|
721 In this section, we will examine how most of Qt's widgets are |
|
722 styled. Hopefully, this will save you some time and effort while |
|
723 developing your own styles and widgets. You will not find |
|
724 information here that is not attainable elsewhere (i.e., by |
|
725 examining the source code or the class descriptions for the style |
|
726 related classes). |
|
727 |
|
728 We mostly use java style widgets as examples. The java style does not |
|
729 draw every element in the element trees. This is because they are |
|
730 not visible for that widget in the java style. We still make sure |
|
731 that all elements are implemented in a way that conforms with the |
|
732 java style as custom widgets might need them (this does not |
|
733 exclude leaving implementations to QWindowsStyle though). |
|
734 |
|
735 The following is given for each widget: |
|
736 |
|
737 \list |
|
738 \o A table with the members (variables, etc.) of its style option. |
|
739 \o A table over the state flags (QStyle::StateFlag) that |
|
740 can be set on the widget and when the states are set. |
|
741 \o Its element tree (see section \l{The Style Elements}). |
|
742 \o An image of the widget in which the elements are outlined. |
|
743 \omit This is not written yet - probably never will be |
|
744 either |
|
745 \o List of style hints that should be checked for the |
|
746 widget. |
|
747 \o List of standard pixmaps that could be used by the |
|
748 elements. |
|
749 \endomit |
|
750 \endlist |
|
751 |
|
752 The element tree contains the primitive, control, and complex |
|
753 style elements. By doing a top-down traversal of the element tree, |
|
754 you get the sequence in which the elements should be drawn. In the |
|
755 nodes, we have written the sub element rectangles, sub control |
|
756 elements, and pixel metrics that should be considered when drawing |
|
757 the element of the node. |
|
758 |
|
759 Our approach on styling center on the drawing of the widgets. The |
|
760 calculations of sub elements rectangles, sub controls, and pixel |
|
761 metrics used \bold during drawing is only listed as contents in |
|
762 the element trees. Note that there are rectangles and pixel |
|
763 metrics that are only used by widgets. This leaves these |
|
764 calculations untreated in the walkthrough. For instance, the |
|
765 \l{QStyle::}{subControlRect()} and |
|
766 \l{QStyle::}{sizeFromContents()} functions often call |
|
767 \l{QStyle::}{subElementRect()} to calculate their bounding |
|
768 rectangles. We could draw trees for this as well. However, how |
|
769 these calculations are done is completely up to the individual |
|
770 styles, and they do not have to follow a specific structure (Qt |
|
771 does not impose a specific structure). You should still make sure |
|
772 that you use the appropriate pixel metrics, though. To limit the |
|
773 size of the document, we have therefore chosen not to include |
|
774 trees or describe the calculations made by the Java (or any other) |
|
775 style. |
|
776 |
|
777 You may be confused about how the different pixel metrics, sub |
|
778 element rectangles, and sub control rectangles should be used when |
|
779 examining the trees. If you are in doubt after reading the QStyle |
|
780 enum descriptions, we suggest that you examine the QCommonStyle |
|
781 and QWindowsStyle implementations. |
|
782 |
|
783 Some of the bounding rectangles that we outline in the widget |
|
784 images are equal. Reasons for this are that some elements draw |
|
785 backgrounds while others draw frames and labels. If in doubt, |
|
786 check the description of each element in QStyle. Also, some |
|
787 elements are there to layout, i.e., decide where to draw, other |
|
788 elements. |
|
789 |
|
790 \section2 Common Widget Properties |
|
791 |
|
792 Some states and variables are common for all widgets. These are |
|
793 set with QStyleOption::initFrom(). Not all elements use this function; |
|
794 it is the widgets that create the style options, and for some |
|
795 elements the information from \l{QStyleOption::}{initFrom()} is not |
|
796 necessary. |
|
797 |
|
798 A table with the common states follows: |
|
799 |
|
800 \table 90% |
|
801 \header |
|
802 \o State |
|
803 \o State Set When |
|
804 \row |
|
805 \o State_Enabled |
|
806 \o Set if the widget is not disabled (see |
|
807 QWidget::setEnabled()) |
|
808 \row |
|
809 \o State_Focus |
|
810 \o Set if the widget has focus (see |
|
811 QWidget::hasFocus()) |
|
812 \row |
|
813 \o State_KeyobordFocusChange |
|
814 \o Set when the user changes focus with the keyboard |
|
815 (see Qt::WA_KeyboardFocusChange) |
|
816 \row |
|
817 \o State_MouseOver |
|
818 \o Set if the mouse cursor is over the widget |
|
819 \row |
|
820 \o State_Active |
|
821 \o Set if the widget is a child of the active window. |
|
822 \row |
|
823 \o State_HasEditFocus |
|
824 \o Set if the widget has the edit focus |
|
825 \endtable |
|
826 |
|
827 The other common members for widgets are: |
|
828 |
|
829 \table 90% |
|
830 \header |
|
831 \o Member |
|
832 \o Content |
|
833 \row |
|
834 \o rect |
|
835 \o The bounding rectangle of the element to draw. This |
|
836 is set to the widget bounding rectangle |
|
837 (QWidget::rect()). |
|
838 \row |
|
839 \o direction |
|
840 \o The layout direction; a value of the |
|
841 Qt::LayoutDirection enum. |
|
842 \row |
|
843 \o palette |
|
844 \o The QPalette to use when drawing the element. This |
|
845 is set to the widgets palette (QWidget::palette()). |
|
846 \row |
|
847 \o fontMetrics |
|
848 \o The QFontMetrics to use when drawing text on the |
|
849 widget. |
|
850 \endtable |
|
851 |
|
852 The complex style options (classes that inherit |
|
853 QStyleOptionComplex) used for complex style elements share two |
|
854 variables: \l{QStyleOptionComplex::}{subControls} and |
|
855 \l{QStyleOptionComplex::}{activeSubControls}. Both variables are |
|
856 an OR'ed combination of QStyle::SubControl enum values. They |
|
857 indicate which sub controls the complex control consists of and |
|
858 which of these controls are currently active. |
|
859 |
|
860 As mentioned, the style calculates the size of the widgets |
|
861 contents, which the widgets calculate their size hints from. In |
|
862 addition, complex controls also use the style to test which |
|
863 sub-controls the mouse is over. |
|
864 |
|
865 \section2 Widget Reference |
|
866 |
|
867 Without further delay, we present the widget walkthrough; each |
|
868 widget has its own sub-section. |
|
869 |
|
870 \section3 Push Buttons |
|
871 |
|
872 The style structure for push buttons is shown below. By doing a |
|
873 top-down traversal of the tree, you get the sequence in which the |
|
874 elements should be drawn. |
|
875 |
|
876 \image javastyle/pushbutton.png The style structure for push buttons |
|
877 |
|
878 The layout of the buttons, with regard element bounds, varies from |
|
879 style to style. This makes it difficult to show conceptual images |
|
880 of this. Also, elements may - even be intended to - have the same |
|
881 bounds; the PE_PushButtonBevel, for instance, is used in |
|
882 QCommonStyle to draw the elements that contains it: |
|
883 PE_FrameDefaultButton, PE_FrameButtonBevel, and |
|
884 PE_PanelButtonCommand, all of which have the same bounds in common |
|
885 and windows style. PE_PushButtonBevel is also responsible for |
|
886 drawing the menu indicator (QCommonStyle draws |
|
887 PE_IndicatorArrowDown). |
|
888 |
|
889 An image of a push button in the java style that show the bounding |
|
890 rectangles of the elements is given below. Colors are used to |
|
891 separate the bounding rectangles in the image; they do not fill |
|
892 any other purpose. This is also true for similar images for the |
|
893 other widgets. |
|
894 |
|
895 \image javastyle/button.png |
|
896 |
|
897 The java style, as well as all other styles implemented in Qt, |
|
898 does not use PE_FrameButtonBevel. It is usual that a button |
|
899 with a PE_DefaultFrame adjusts the PE_PanelButtonCommand's |
|
900 rectangle by PM_ButtonDefaultIndicator. The CE_PushButtonLabel |
|
901 is found by adjusting the rect by PM_DefaultFrameWidth. |
|
902 |
|
903 We will now examine the style option for push |
|
904 buttons - QStyleOptionButton. A table for the states that |
|
905 QPushButton can set on the style option follows: |
|
906 |
|
907 \table 90% |
|
908 \header |
|
909 \o State |
|
910 \o State Set When |
|
911 \row |
|
912 \o State_Sunken |
|
913 \o Button is down or menu is pressed shown |
|
914 \row |
|
915 \o State_On |
|
916 \o Button is checked |
|
917 \row |
|
918 \o State_Raised |
|
919 \o Button is not flat and not pressed down |
|
920 \endtable |
|
921 |
|
922 Other members of QStyleOptionButton is: |
|
923 |
|
924 \table 90% |
|
925 \header |
|
926 \o Member |
|
927 \o Content |
|
928 \row |
|
929 \o features |
|
930 \o Flags of the QStyleOptionButton::ButtonFeatures enum, |
|
931 which describes various button properties (see enum) |
|
932 \row |
|
933 \o icon |
|
934 \o The buttons QIcon (if any) |
|
935 \row |
|
936 \o iconSize |
|
937 \o The QSize of the icon |
|
938 \row |
|
939 \o text |
|
940 \o a QString with the buttons text |
|
941 \endtable |
|
942 |
|
943 \section3 Check and Radio Buttons |
|
944 |
|
945 The structures for radio and check buttons are identical. |
|
946 We show the structure using QCheckBox element and pixel |
|
947 metric names: |
|
948 |
|
949 \image javastyle/checkbox.png |
|
950 |
|
951 QStyleOptionButton is used as the style option for both check |
|
952 and radio buttons. We first give a table of the states that |
|
953 can be set in the option: |
|
954 |
|
955 \table 90% |
|
956 \header |
|
957 \o State |
|
958 \o State Set When |
|
959 \row |
|
960 \o State_sunken |
|
961 \o The box is pressed down |
|
962 \row |
|
963 \o State_NoChange |
|
964 \o The box is partially checked (for tristate |
|
965 checkboxes.) |
|
966 \row |
|
967 \o State_On |
|
968 \o The box is checked |
|
969 \row |
|
970 \o State_Off |
|
971 \o The box is unchecked |
|
972 \endtable |
|
973 |
|
974 See \l{Push Buttons} for a table over other members in the |
|
975 QStyleOptionButtonClass. |
|
976 |
|
977 \section3 Tabs |
|
978 |
|
979 In Qt, QTabBar uses the style to draw its tabs. Tabs exist either |
|
980 in a QTabWidget, which contains a QTabBar, or as a separate bar. |
|
981 If the bar is not part of a tab widget, it draws its own base. |
|
982 |
|
983 QTabBar lays out the tabs, so the style does not have control over |
|
984 tab placement. However, while laying out its tabs, the bar asks |
|
985 the style for PM_TabBarTabHSpace and PM_TabBarTabVSpace, which is |
|
986 extra width and height over the minimum size of the tab bar tab |
|
987 label (icon and text). The style can also further influence the |
|
988 tab size before it is laid out, as the tab bar asks for |
|
989 CT_TabBarTab. The bounding rectangle of the bar is decided by the |
|
990 tab widget when it is part of the widget (still considering |
|
991 CT_TabBarTab). |
|
992 |
|
993 The tab bar is responsible for drawing the buttons that appear on |
|
994 the tab bar when all tabs do not fit. Their placement is not |
|
995 controlled by the style, but the buttons are \l{QToolButton}s |
|
996 and are therefore drawn by the style. |
|
997 |
|
998 Here is the style structure for QTabWidget and QTabBar: |
|
999 |
|
1000 \image javastyle/tab.png |
|
1001 |
|
1002 The dotted lines indicate that the QTabWidget contains a tab bar, |
|
1003 but does not draw it itself, that QTabBar only draws its base line |
|
1004 when not part of a tab widget, and that the tab bar keeps two tool |
|
1005 buttons that scroll the bar when all tabs do not fit; see \l{Tool |
|
1006 Buttons} for their element tree. Also note that since the buttons |
|
1007 are children of the tab bar, they are drawn after the bar. The |
|
1008 tabs bounding rectangles overlap the base by PM_TabBarBaseOverlap. |
|
1009 |
|
1010 Here is a tab widget in the java style: |
|
1011 |
|
1012 \image javastyle/tabwidget.png |
|
1013 |
|
1014 In the java style (and also windows), the tab bar shape and label |
|
1015 have the same bounding rectangle as CE_TabBarTab. Notice that the |
|
1016 tabs overlap with the tab widget frame. The base of the tab bar |
|
1017 (if drawn) is the area where the tabs and frame overlap. |
|
1018 |
|
1019 The style option for tabs (QStyleOptionTab) contains the necessary |
|
1020 information for drawing tabs. The option contains the position of |
|
1021 the tab in the tab bar, the position of the selected tab, the |
|
1022 shape of the tab, the text, and icon. After Qt 4.1 the option |
|
1023 should be cast to a QStyleOptionTabV2, which also contains the |
|
1024 icons size. |
|
1025 |
|
1026 As the java style tabs don't overlap, we also present an image of |
|
1027 a tab widget in the windows style. Note that if you want the tabs |
|
1028 to overlap horizontally, you do that when drawing the tabs in |
|
1029 CE_TabBarTabShape; the tabs bounding rectangles will not be |
|
1030 altered by the tab bar. The tabs are drawn from left to right in a |
|
1031 north tab bar shape, top to bottom in an east tab bar shape, etc. |
|
1032 The selected tab is drawn last, so that it is easy to draw it over |
|
1033 the other tabs (if it is to be bigger). |
|
1034 |
|
1035 \image javastyle/windowstabimage.png |
|
1036 |
|
1037 A table of the states a tab bar can set on its tabs follows: |
|
1038 |
|
1039 \table 90% |
|
1040 \header |
|
1041 \o State |
|
1042 \o State Set When |
|
1043 \row |
|
1044 \o State_Sunken |
|
1045 \o The tab is pressed on with the mouse. |
|
1046 \row |
|
1047 \o State_Selected |
|
1048 \o If it is the current tab. |
|
1049 \row |
|
1050 \o State_HasFocus |
|
1051 \o The tab bar has focus and the tab is selected |
|
1052 \endtable |
|
1053 |
|
1054 Note that individual tabs may be disabled even if the tab bar |
|
1055 is not. The tab will be active if the tab bar is active. |
|
1056 |
|
1057 Here follows a table of QStyleOptionTabV2's members: |
|
1058 |
|
1059 \table 90% |
|
1060 \header |
|
1061 \o Member |
|
1062 \o Content |
|
1063 \row |
|
1064 \o cornerWidgets |
|
1065 \o Is flags of the CornerWidget enum, which indicate |
|
1066 if and which corner widgets the tab bar has. |
|
1067 \row |
|
1068 \o icon |
|
1069 \o The QIcon of the tab |
|
1070 \row |
|
1071 \o iconSize |
|
1072 \o The QSize of the icon |
|
1073 \row |
|
1074 \o position |
|
1075 \o A TabPosition enum value that indicates the tabs |
|
1076 position on the bar relative to the other tabs. |
|
1077 \row |
|
1078 \o row |
|
1079 \o holds which row the tab is in |
|
1080 \row |
|
1081 \o selectedPosition |
|
1082 \o A value of the SelectedPosition enum that indicates |
|
1083 whether the selected tab is adjacent to or is the |
|
1084 tab. |
|
1085 \row |
|
1086 \o shape |
|
1087 \o A value of the QTabBar::Shape enum indication |
|
1088 whether the tab has rounded or triangular corners |
|
1089 and the orientation of the tab. |
|
1090 \row |
|
1091 \o text |
|
1092 \o The tab text |
|
1093 \endtable |
|
1094 |
|
1095 The frame for tab widgets use QStyleOptionTabWidgetFrame as |
|
1096 style option. We list its members here. It does not have |
|
1097 states set besides the common flags. |
|
1098 |
|
1099 \table 90% |
|
1100 \header |
|
1101 \o Member |
|
1102 \o content |
|
1103 \row |
|
1104 \o leftCornerWidgetSize |
|
1105 \o The QSize of the left corner widget (if any). |
|
1106 \row |
|
1107 \o rightCornerWidgetSize |
|
1108 \o The QSize of the right corner widget (if any). |
|
1109 \row |
|
1110 \o lineWidth |
|
1111 \o holds the line with for drawing the panel. |
|
1112 \row |
|
1113 \o midLineWith |
|
1114 \o this value is currently always 0. |
|
1115 \row |
|
1116 \o shape |
|
1117 \o The shape of the tabs on the tab bar. |
|
1118 \row |
|
1119 \o tabBarSize |
|
1120 \o The QSize of the tab bar. |
|
1121 \endtable |
|
1122 |
|
1123 \section3 Scroll Bars |
|
1124 |
|
1125 Here is the style structure for scrollBars: |
|
1126 |
|
1127 \image javastyle/scrollbar.png |
|
1128 |
|
1129 QScrollBar simply creates its style option and then draws |
|
1130 CC_ScrollBar. Some styles draw the background of add page and sub |
|
1131 page with PE_PanelButtonBevel and also use indicator arrows to |
|
1132 draw the arrows in the nest and previous line indicators; we have |
|
1133 not included these in the tree as their use is up to the |
|
1134 individual style. The style's PM_MaximumDragDistance is the |
|
1135 maximum distance in pixels the mouse can move from the bounds |
|
1136 of the scroll bar and still move the handle. |
|
1137 |
|
1138 Here is an image of a scrollbar in the java style: |
|
1139 |
|
1140 \image javastyle/scrollbarimage.png |
|
1141 |
|
1142 You may notice that the scrollbar is slightly different from |
|
1143 Java's as it has two line up indicators. We have done this to show |
|
1144 how that you can have two separate bounding rectangles for a |
|
1145 single sub control. The scroll bar is an example of a widget that |
|
1146 is entirely implemented by the java style - neither QWindowsStyle |
|
1147 nor QCommonStyle are involved in the drawing. |
|
1148 |
|
1149 We have a look at the different states a scroll bar can set on |
|
1150 the style option: |
|
1151 |
|
1152 \table 90% |
|
1153 \header |
|
1154 \o State |
|
1155 \o State Set When |
|
1156 \row |
|
1157 \o State_Horizontal |
|
1158 \o The scroll bar is horizontal |
|
1159 \endtable |
|
1160 |
|
1161 The style option of QScrollBar is QStyleOptionSlider. Its |
|
1162 members are listed in the following table. The option is used |
|
1163 by all \l{QAbstractSlider}s; we only describe the members |
|
1164 relevant for scroll bars here. |
|
1165 |
|
1166 \table 90% |
|
1167 \header |
|
1168 \o Member |
|
1169 \o Content |
|
1170 \row |
|
1171 \o maximum |
|
1172 \o the maximum value of the scroll bar |
|
1173 \row |
|
1174 \o minimum |
|
1175 \o the minimum value of the scroll bar |
|
1176 \row |
|
1177 \o notchTarget |
|
1178 \o the number of pixels between notches |
|
1179 \row |
|
1180 \o orientation |
|
1181 \o a value of the Qt::Orientation enum that specifies |
|
1182 whether the scroll bar is vertical or horizontal |
|
1183 \row |
|
1184 \o pageStep |
|
1185 \o the number to increase or decrease the sliders |
|
1186 value (relative to the size of the slider and its value |
|
1187 range) on page steps. |
|
1188 \row |
|
1189 \o singleStep |
|
1190 \o the number to increase or decrease the sliders |
|
1191 value on single (or line) steps |
|
1192 \row |
|
1193 \o sliderValue |
|
1194 \o The value of the slider |
|
1195 \row |
|
1196 \o sliderPosition |
|
1197 \o the position of the slider handle. This is the same |
|
1198 as \c sliderValue if the scroll bar is |
|
1199 QAbstractSlider::tracking. If not, the scroll |
|
1200 bar does not update its value before the mouse |
|
1201 releases the handle. |
|
1202 \row |
|
1203 \o upsideDown |
|
1204 \o holds the direction in which the scroll bar |
|
1205 increases its value. This is used instead of |
|
1206 QStyleOption::direction for all abstract sliders. |
|
1207 \endtable |
|
1208 |
|
1209 \section3 Sliders |
|
1210 |
|
1211 When calculating the sliders size hint, PM_SliderTickness and |
|
1212 PM_SliderLength is queried from the style. As with scroll bars, |
|
1213 the QSlider only lets the user move the handle if the mouse is |
|
1214 within PM_MaximumDragDistance from the slider bounds. When it |
|
1215 draws itself it creates the style option and calls \c |
|
1216 drawComplexControl() with CC_Slider: |
|
1217 |
|
1218 \image javastyle/slider.png |
|
1219 |
|
1220 We also show a picture of a slider in the java style. We show |
|
1221 the bounding rectangles of the sub elements as all drawing is done |
|
1222 in CC_Slider. |
|
1223 |
|
1224 \image javastyle/sliderimage.png |
|
1225 |
|
1226 QSlider uses QStyleOptionSlider as all \l{QAbstractSlider}s do. We |
|
1227 present a table with the members that affect QSlider: |
|
1228 |
|
1229 \table 90% |
|
1230 \header |
|
1231 \o Member |
|
1232 \o Content |
|
1233 \row |
|
1234 \o maximum |
|
1235 \o the maximum value of the slider |
|
1236 \row |
|
1237 \o minimum |
|
1238 \o the minimum value of the slider |
|
1239 \row |
|
1240 \o notchTarget |
|
1241 \o this is the number of pixels between each notch |
|
1242 \row |
|
1243 \o orientation |
|
1244 \o a Qt::Orientation enum value that gives whether the |
|
1245 slider is vertical or horizontal. |
|
1246 \row |
|
1247 \o pageStep |
|
1248 \o a number in slider value to increase or decrease |
|
1249 for page steps |
|
1250 \row |
|
1251 \o singleStep |
|
1252 \o the number to increase or decrease the sliders |
|
1253 value on single (or line) steps. |
|
1254 \row |
|
1255 \o sliderValue |
|
1256 \o the value of the slider. |
|
1257 \row |
|
1258 \o sliderPosition |
|
1259 \o the position of the slider given as a slider value. |
|
1260 This will be equal to the \c sliderValue if the |
|
1261 slider is \l{QAbstractSlider::}{tracking}; if |
|
1262 not, the sliders value will not change until the handle is |
|
1263 released with the mouse. |
|
1264 \row |
|
1265 \o upsideDown |
|
1266 \o this member is used instead of QStyleOption::direction |
|
1267 for all abstract sliders. |
|
1268 \endtable |
|
1269 |
|
1270 You should note that the slider does not use direction for |
|
1271 reverse layouts; it uses \c upsideDown. |
|
1272 |
|
1273 \section3 Spin Boxes |
|
1274 |
|
1275 When QSpinBox paints itself it creates a QStyleOptionSpinBox and |
|
1276 asks the style to draw CC_SpinBox. The edit field is a line |
|
1277 edit that is a child of the spin box. The dimensions of the |
|
1278 field is calculated by the style with SC_SpinBoxEditField. |
|
1279 |
|
1280 Here follows the style tree for spin boxes. It is not |
|
1281 required that a style uses the button panel primitive to paint |
|
1282 the indicator backgrounds. You can see an image below the tree |
|
1283 showing the sub elements in QSpinBox in the java style. |
|
1284 |
|
1285 \image javastyle/spinbox.png |
|
1286 |
|
1287 \image javastyle/spinboximage.png |
|
1288 |
|
1289 The QStyleOptionSpinBox, which is the style option for spin |
|
1290 boxes. It can set the following states on the spin box.: |
|
1291 |
|
1292 \table 90% |
|
1293 \header |
|
1294 \o State |
|
1295 \o State Set When |
|
1296 \row |
|
1297 \o State_Sunken |
|
1298 \o Is set if one of the sub controls CC_SpinUp or |
|
1299 CC_SpinDown is pressed on with the mouse. |
|
1300 \endtable |
|
1301 |
|
1302 The rest of the members in the spin boxes style options are: |
|
1303 |
|
1304 \table 90% |
|
1305 \header |
|
1306 \o Property |
|
1307 \o Function |
|
1308 \row |
|
1309 \o frame |
|
1310 \o boolean that is true if the spin box is to draw a |
|
1311 frame. |
|
1312 \row |
|
1313 \o buttonSymbols |
|
1314 \o Value of the ButtonSymbols enum that decides the |
|
1315 symbol on the up/down buttons. |
|
1316 \row |
|
1317 \o stepEnabled |
|
1318 \o A value of the StepEnabled indication which of the |
|
1319 spin box buttons are pressed down. |
|
1320 \endtable |
|
1321 |
|
1322 \section3 Title Bar |
|
1323 |
|
1324 The title bar complex control, CC_TitleBar, is used to draw |
|
1325 the title bars of internal windows in QMdiArea. It typically |
|
1326 consists of a window title and close, minimize, system menu, and |
|
1327 maximize buttons. Some styles also provide buttons for shading |
|
1328 the window, and a button for context sensitive help. |
|
1329 |
|
1330 The bar is drawn in CC_TitleBar without using any sub elements. |
|
1331 How the individual styles draw their buttons is individual, but |
|
1332 there are standard pixmaps for the buttons that the style should |
|
1333 provide. |
|
1334 |
|
1335 \image javastyle/titlebar.png |
|
1336 |
|
1337 In an image over a title bar in the java style, we show the |
|
1338 bounding rectangles of the sub elements supported by the java style |
|
1339 (all of which are drawn with standard pixmaps). It is usual to |
|
1340 draw the button backgrounds using PE_PanelButtonTool, but it's no |
|
1341 rule. |
|
1342 |
|
1343 \image javastyle/titlebarimage.png |
|
1344 |
|
1345 The style option for title bars is QStyleOptionTitleBar. It's |
|
1346 members are: |
|
1347 |
|
1348 \table 90% |
|
1349 \header |
|
1350 \o Member |
|
1351 \o Content |
|
1352 \row |
|
1353 \o icon |
|
1354 \o The title bars icon |
|
1355 \row |
|
1356 \o text |
|
1357 \o the text for the title bar's label |
|
1358 \row |
|
1359 \o windowFlags |
|
1360 \o flags of the Qt::WindowFlag enum. The window flags |
|
1361 used by QMdiArea for window management. |
|
1362 \row |
|
1363 \o titleBarState |
|
1364 \o this is the QWidget::windowState() of the window |
|
1365 that contains the title bar. |
|
1366 \endtable |
|
1367 |
|
1368 \section3 Combo Box |
|
1369 |
|
1370 A QComboBox uses the style to draw the button and label of |
|
1371 non-editable boxes with CC_ComboBox and CE_ComboBoxLabel. |
|
1372 |
|
1373 The list that pops up when the user clicks on the combo box is |
|
1374 drawn by a \l{Delegate Classes}{delegate}, which we do not cover |
|
1375 in this overview. You can, however, use the style to control the |
|
1376 list's size and position with the sub element |
|
1377 SC_ComboBoxListBoxPopup. The style also decides where the edit |
|
1378 field for editable boxes should be with SC_ComboBoxEditField; the |
|
1379 field itself is a QLineEdit that is a child of the combo box. |
|
1380 |
|
1381 \image javastyle/combobox.png |
|
1382 |
|
1383 We show an image over a java style combo box in which we have |
|
1384 outlined its sub elements and sub element rectangles: |
|
1385 |
|
1386 \image javastyle/comboboximage.png |
|
1387 |
|
1388 Java combo boxes do not use the focus rect; it changes its |
|
1389 background color when it has focus. The SC_ComboBoxEdit field is |
|
1390 used both by QComboBox to calculate the size of the edit field and |
|
1391 the style for calculating the size of the combo box label. |
|
1392 |
|
1393 The style option for combo boxes is QStyleOptionComboBox. It |
|
1394 can set the following states: |
|
1395 |
|
1396 \table 90% |
|
1397 \header |
|
1398 \o State |
|
1399 \o Set When |
|
1400 \row |
|
1401 \o State_Selected |
|
1402 \o The box is not editable and has focus |
|
1403 \row |
|
1404 \o State_Sunken |
|
1405 \o SC_ComboBoxArrow is active |
|
1406 \row |
|
1407 \o State_on |
|
1408 \o The container (list) of the box is visible |
|
1409 \endtable |
|
1410 |
|
1411 The style options other members are: |
|
1412 |
|
1413 \table |
|
1414 \header |
|
1415 \o Member |
|
1416 \o Content |
|
1417 \row |
|
1418 \o currentIcon |
|
1419 \o the icon of the current (selected) item of the |
|
1420 combo box. |
|
1421 \row |
|
1422 \o currentText |
|
1423 \o the text of the current item in the box. |
|
1424 \row |
|
1425 \o editable |
|
1426 \o holds whether the combo box is editable or not |
|
1427 \row |
|
1428 \o frame |
|
1429 \o holds whether the combo box has a frame or not |
|
1430 \row |
|
1431 \o iconSize |
|
1432 \o the size of the current items icon. |
|
1433 \row |
|
1434 \o popupRect |
|
1435 \o the bounding rectangle of the combo box's popup |
|
1436 list. |
|
1437 \endtable |
|
1438 |
|
1439 \section3 Group Boxes |
|
1440 |
|
1441 When calculating the size hint, QGroupBox fetches three pixel |
|
1442 metrics from the style: PM_IndicatorWidth, |
|
1443 PM_CheckBoxLabelSpacing, and PM_IndicatorHeight. QGroupBox has |
|
1444 the following style element tree: |
|
1445 |
|
1446 \image javastyle/groupbox.png |
|
1447 |
|
1448 Qt does not impose restrictions on how the check box is drawn; the |
|
1449 java style draws it with CE_IndicatorCheckBox. See \l{Check and |
|
1450 Radio Buttons} for the complete tree. |
|
1451 |
|
1452 We also give an image of the widget with the sub controls and |
|
1453 sub control rectangles drawn: |
|
1454 |
|
1455 \image javastyle/groupboximage.png |
|
1456 |
|
1457 The style option for group boxes are QStyleOptionGroupBox. The |
|
1458 following states can be set on it: |
|
1459 |
|
1460 \table 90% |
|
1461 \header |
|
1462 \o State |
|
1463 \o Set When |
|
1464 \row |
|
1465 \o State_On |
|
1466 \o The check box is checked |
|
1467 \row |
|
1468 \o State_Sunken |
|
1469 \o The checkbox is pressed down |
|
1470 \row |
|
1471 \o State_Off |
|
1472 \o The check box is unchecked (or there is no check box) |
|
1473 \endtable |
|
1474 |
|
1475 The remaining members of QStyleOptionGroupBox are: |
|
1476 |
|
1477 \table |
|
1478 \header |
|
1479 \o Member |
|
1480 \o Content |
|
1481 \row |
|
1482 \o features |
|
1483 \o flags of the QStyleOptionFrameV2::FrameFeatures |
|
1484 enum describing the frame of the group box. |
|
1485 \row |
|
1486 \o lineWidth |
|
1487 \o the line width with which to draw the panel. This |
|
1488 is always 1. |
|
1489 \row |
|
1490 \o text |
|
1491 \o the text of the group box. |
|
1492 \row |
|
1493 \o textAlignment |
|
1494 \o the alignment of the group box title |
|
1495 \row |
|
1496 \o textColor |
|
1497 \o the QColor of the text |
|
1498 \endtable |
|
1499 |
|
1500 \section3 Splitters |
|
1501 |
|
1502 As the structure of splitters are simple and do not contain any |
|
1503 sub elements, we do not include image of splitters. CE_Splitter |
|
1504 does not use any other elements or metrics. |
|
1505 |
|
1506 For its style option, Splitters uses the base class QStyleOption. |
|
1507 It can set the following state flags on it: |
|
1508 |
|
1509 \table 90% |
|
1510 \header |
|
1511 \o State |
|
1512 \o Set When |
|
1513 \row |
|
1514 \o State_Horizontal |
|
1515 \o Set if it is a horizontal splitter |
|
1516 \endtable |
|
1517 |
|
1518 QSplitter does not use \l{QStyleOption::}{initFrom()} to set up its |
|
1519 option; it sets the State_MouseOver and State_Disabled flags |
|
1520 itself. |
|
1521 |
|
1522 \section3 Progress Bar |
|
1523 |
|
1524 The CE_ProgressBar element is used by QProgressBar, and it is the |
|
1525 only element used by this widget. We start with looking at the |
|
1526 style structure: |
|
1527 |
|
1528 \image javastyle/progressbar.png |
|
1529 |
|
1530 Here is a progress bar in the windows style (the java style |
|
1531 bounding rectangles are equal): |
|
1532 |
|
1533 \image javastyle/progressbarimage.png |
|
1534 |
|
1535 The style option for QProgressBar is QStyleOptionProgressBarV2. |
|
1536 The bar does not set any state flags, but the other members of the |
|
1537 option are: |
|
1538 |
|
1539 \table 90% |
|
1540 \header |
|
1541 \o Member |
|
1542 \o Content |
|
1543 \row |
|
1544 \o minimum |
|
1545 \o The minimum value of the bar |
|
1546 \row |
|
1547 \o maximum |
|
1548 \o The maximum value of the bar |
|
1549 \row |
|
1550 \o progress |
|
1551 \o The current value of the bar |
|
1552 \row |
|
1553 \o textAlignment |
|
1554 \o How the text is aligned in the label |
|
1555 \row |
|
1556 \o textVisible |
|
1557 \o Whether the label is drawn |
|
1558 \row |
|
1559 \o text |
|
1560 \o The label text |
|
1561 \row |
|
1562 \o orientation |
|
1563 \o Progress bars can be vertical or horizontal |
|
1564 \row |
|
1565 \o invertedAppearance |
|
1566 \o The progress is inverted (i.e., right to left in a |
|
1567 horizontal bar) |
|
1568 \row |
|
1569 \o bottomToTop |
|
1570 \o Boolean that if true, turns the label of vertical |
|
1571 progress bars 90 degrees. |
|
1572 \endtable |
|
1573 |
|
1574 \section3 Tool Buttons |
|
1575 |
|
1576 Tool buttons exist either independently or as part of tool bars. |
|
1577 They are drawn equally either way. The QToolButton draws only one |
|
1578 style element: CC_ToolButton. |
|
1579 |
|
1580 As you must be used to by now (at least if you have read this |
|
1581 document sequentially), we have a tree of the widget's style |
|
1582 structure: |
|
1583 |
|
1584 \image javastyle/toolbutton.png |
|
1585 |
|
1586 Note that PE_FrameButtonTool and PE_IndicatorArrowDown are |
|
1587 included in the tree as the java style draws them, but they can |
|
1588 safely be omitted if you prefer it. The structure may also be |
|
1589 different. QWindowsStyle, for instance, draws both |
|
1590 PE_IndicatorButtonDropDown and PE_IndicatorArrowDown in |
|
1591 CE_ToolButton. |
|
1592 |
|
1593 We also have an image of a tool button where we have outlined |
|
1594 the sub element bounding rectangles and sub controls. |
|
1595 |
|
1596 \image javastyle/toolbuttonimage.png |
|
1597 |
|
1598 Here is the states table for tool buttons: |
|
1599 |
|
1600 \table 90% |
|
1601 \header |
|
1602 \o State |
|
1603 \o Set When |
|
1604 \row |
|
1605 \o State_AutoRise |
|
1606 \o the tool button has the autoRise property set |
|
1607 \row |
|
1608 \o State_raised |
|
1609 \o the button is not sunken (i.e., by being checked or |
|
1610 pressed on with the mouse). |
|
1611 \row |
|
1612 \o State_Sunken |
|
1613 \o the button is down |
|
1614 \row |
|
1615 \o State_On |
|
1616 \o the button is checkable and checked. |
|
1617 \endtable |
|
1618 |
|
1619 QStyleOptionToolButton also contains the following members: |
|
1620 |
|
1621 \table |
|
1622 \header |
|
1623 \o Member |
|
1624 \o Content |
|
1625 \row |
|
1626 \o arrowType |
|
1627 \o a Qt::ArrowType enum value, which contains the |
|
1628 direction of the buttons arrow (if an arrow is to |
|
1629 be used in place of an icon) |
|
1630 \row |
|
1631 \o features |
|
1632 \o flags of the QStyleOptionToolButton::ButtonFeature |
|
1633 enum describing if the button has an arrow, a menu, |
|
1634 and/or has a popup-delay. |
|
1635 \row |
|
1636 \o font |
|
1637 \o the QFont of the buttons label |
|
1638 \row |
|
1639 \o icon |
|
1640 \o the QIcon of the tool button |
|
1641 \row |
|
1642 \o iconSize |
|
1643 \o the icon size of the button's icon |
|
1644 \row |
|
1645 \o pos |
|
1646 \o the position of the button, as given by |
|
1647 QWidget::pos() |
|
1648 \row |
|
1649 \o text |
|
1650 \o the text of the button |
|
1651 \row |
|
1652 \o toolButtonStyle |
|
1653 \o a Qt::ToolButtonStyle enum value which decides |
|
1654 whether the button shows the icon, the text, or both. |
|
1655 \endtable |
|
1656 |
|
1657 \section3 Toolbars |
|
1658 |
|
1659 Toolbars are part of the \l{QMainWindow}{main window framework} |
|
1660 and cooperates with the QMainWindow to which it belongs while it |
|
1661 builds its style option. A main window has 4 areas that toolbars |
|
1662 can be placed in. They are positioned next to the four sides of |
|
1663 the window (i.e., north, south, west, and east). Within each area |
|
1664 there can be more than one line of toolbars; a line consists of |
|
1665 toolbars with equal orientation (vertical or horizontal) placed |
|
1666 next to each other. |
|
1667 |
|
1668 \l{QToolbar}{QToolbar}s in Qt consists of three elements |
|
1669 CE_ToolBar, PE_IndicatorToolBarHandle, and |
|
1670 PE_IndicatorToolBarSeparator. It is QMainWindowLayout that |
|
1671 calculates the bounding rectangles (i.e., position and size of the |
|
1672 toolbars and their contents. The main window also uses the \c |
|
1673 sizeHint() of the items in the toolbars when calculating the size |
|
1674 of the bars. |
|
1675 |
|
1676 Here is the element tree for QToolBar: |
|
1677 |
|
1678 \image javastyle/toolbar.png |
|
1679 |
|
1680 The dotted lines indicate that the QToolBar keeps an instance of |
|
1681 QToolBarLayout and that QToolBarSeparators are kept by |
|
1682 QToolBarLayout. When the toolbar is floating (i.e., has its own |
|
1683 window) the PE_FrameMenu element is drawn, else QToolbar draws |
|
1684 CE_ToolBar. |
|
1685 |
|
1686 Here is an image of a toolbar in the java style: |
|
1687 |
|
1688 \image javastyle/toolbarimage.png |
|
1689 |
|
1690 QToolBarSaparator uses QStyleOption for their style option. It |
|
1691 sets the State_horizontal flag if the toolbar they live in is |
|
1692 horizontal. Other than that, they use \l{QStyleOption::}{initFrom()}. |
|
1693 |
|
1694 The style option for QToolBar is QStyleOptionToolBar. The only |
|
1695 state flag set (besides the common flags) is State_Horizontal |
|
1696 if the bar is horizontal (i.e., in the north or south toolbar area). |
|
1697 The member variables of the style option are: |
|
1698 |
|
1699 \table 90% |
|
1700 \header |
|
1701 \o Member |
|
1702 \o Content |
|
1703 \row |
|
1704 \o features |
|
1705 \o Holds whether the bar is movable in a value of the |
|
1706 ToolBarFeature, which is either Movable or None. |
|
1707 \row |
|
1708 \o lineWidth |
|
1709 \o The width of the tool bar frame. |
|
1710 \row |
|
1711 \o midLineWidth |
|
1712 \o This variable is currently not used and is always |
|
1713 0. |
|
1714 \row |
|
1715 \o positionOfLine |
|
1716 \o The position of the toolbar line within the toolbar |
|
1717 area to which it belongs. |
|
1718 \row |
|
1719 \o positionWithinLine |
|
1720 \o The position of the toolbar within the toolbar line. |
|
1721 \row |
|
1722 \o toolBarArea |
|
1723 \o The toolbar area in which the toolbar lives. |
|
1724 \endtable |
|
1725 |
|
1726 \section3 Menus |
|
1727 |
|
1728 Menus in Qt are implemented in QMenu. The QMenu keeps a list of |
|
1729 action, which it draws as menu items. When QMenu receives paint |
|
1730 events ,it calculates the size of each menu item and draws them |
|
1731 individually with CE_MenuItem. (Menu items do not have a separate |
|
1732 element for their label (contents), so all drawing is done in |
|
1733 CE_MenuItem. The menu also draws the frame of the menu with |
|
1734 PE_FrameMenu. It also draws CE_MenuScroller if the style supports |
|
1735 scrolling. CE_MenuTearOff is drawn if the menu is to large for its |
|
1736 bounding rectangle. |
|
1737 |
|
1738 In the style structure tree, we also include QMenu as it also does |
|
1739 styling related work. The bounding rectangles of menu items are |
|
1740 calculated for the menus size hint and when the menu is displayed |
|
1741 or resized. |
|
1742 |
|
1743 \image javastyle/menu.png |
|
1744 |
|
1745 The CE_MenuScroller and CE_MenuTearOff elements are handled by |
|
1746 QCommonStyle and are not shown unless the menu is to large to fit |
|
1747 on the screen. PE_FrameMenu is only drawn for pop-up menus. |
|
1748 |
|
1749 QMenu calculates rectangles based on its actions and calls |
|
1750 CE_MenuItem and CE_MenuScroller if the style supports that. |
|
1751 |
|
1752 It is also usual to use PE_IndicatorCheckBox (instead of using |
|
1753 PE_IndicatorMenuCheckMark) and PE_IndicatorRadioButton for drawing |
|
1754 checkable menu items; we have not included them in the style tree |
|
1755 as this is optional and varies from style to style. |
|
1756 |
|
1757 \image javastyle/menuimage.png |
|
1758 |
|
1759 The style option for menu items is QStyleOptionMenuItem. The |
|
1760 following tables describe its state flags and other members. |
|
1761 |
|
1762 \table 90% |
|
1763 \header |
|
1764 \o State |
|
1765 \o Set When |
|
1766 \row |
|
1767 \o State_Selected |
|
1768 \o The mouse is over the action and the action is not |
|
1769 a separator. |
|
1770 \row |
|
1771 \o State_Sunken |
|
1772 \o The mouse is pressed down on the menu item. |
|
1773 \row |
|
1774 \o State_DownArrow |
|
1775 \o Set if the menu item is a menu scroller and it scrolls |
|
1776 the menu downwards. |
|
1777 \endtable |
|
1778 |
|
1779 \table 90% |
|
1780 \header |
|
1781 \o Member |
|
1782 \o Content |
|
1783 \row |
|
1784 \o checkType |
|
1785 \o A value of the \l{QStyleOptionMenuItem::}{CheckType} enum, |
|
1786 which is either NotCheckable, Exclusive, or |
|
1787 NonExclusive. |
|
1788 \row |
|
1789 \o checked |
|
1790 \o Boolean that is true if the menu item is checked. |
|
1791 \row |
|
1792 \o font |
|
1793 \o The QFont to use for the menu item's text. |
|
1794 \row |
|
1795 \o icon |
|
1796 \o the QIcon of the menu item. |
|
1797 \row |
|
1798 \o maxIconWidth |
|
1799 \o The maximum width allowed for the icon |
|
1800 \row |
|
1801 \o menuHasChecableItem |
|
1802 \o Boolean which is true if at least one item in the |
|
1803 menu is checkable. |
|
1804 \row |
|
1805 \o menuItemType |
|
1806 \o The type of the menu item. This a value of the |
|
1807 \l{QStyleOptionMenuItem::}{MenuItemType}. |
|
1808 \row |
|
1809 \o menuRect |
|
1810 \o The bounding rectangle for the QMenu that the menu |
|
1811 item lives in. |
|
1812 \row |
|
1813 \o tabWidth |
|
1814 \o This is the distance between the text of the menu |
|
1815 item and the shortcut. |
|
1816 \row |
|
1817 \o text |
|
1818 \o The text of the menu item. |
|
1819 \endtable |
|
1820 |
|
1821 The setup of the style option for CE_MenuTearOff and |
|
1822 CE_MenuScroller also uses QStyleOptionMenuItem; they only set the |
|
1823 \c menuRect variable in addition to the common settings with |
|
1824 QStyleOption's \l{QStyleOption::}{initFrom()}. |
|
1825 |
|
1826 \section3 Menu Bar |
|
1827 |
|
1828 QMenuBar uses the style to draw each menu bar item and the empty |
|
1829 area of the menu bar. The pull-down menus themselves are |
|
1830 \l{QMenu}s (see \l{Menus}). The style element tree for the menu |
|
1831 bar follows: |
|
1832 |
|
1833 \image javastyle/menubar.png |
|
1834 |
|
1835 The panel and empty area is drawn after the menu items. The |
|
1836 QPainter that the QMenuBar sends to the style has the bounding |
|
1837 rectangles of the items clipped out (i.e., clip region), so you |
|
1838 don't need to worry about drawing over the items. The pixel |
|
1839 metrics in QMenuBar is used when the bounding rectangles of the |
|
1840 menu bar items are calculated. |
|
1841 |
|
1842 \image javastyle/menubarimage.png |
|
1843 |
|
1844 QStyleOptionMenuItem is used for menu bar items. The members that |
|
1845 are used by QMenuBar is described in the following table: |
|
1846 |
|
1847 \table |
|
1848 \header |
|
1849 \o Member |
|
1850 \o Content |
|
1851 \row |
|
1852 \o menuRect |
|
1853 \o the bounding rectangle of the entire menu bar to |
|
1854 which the item belongs. |
|
1855 \row |
|
1856 \o text |
|
1857 \o the text of the item |
|
1858 \row |
|
1859 \o icon |
|
1860 \o the icon of the menu item (it is not common that |
|
1861 styles draw this icon) |
|
1862 \endtable |
|
1863 |
|
1864 QStyleOptionMenuItem is also used for drawing CE_EmptyMenuBarArea. |
|
1865 |
|
1866 QStyleOptionFrame is used for drawing the panel frame The |
|
1867 \l{QStyleOptionFrame::}{lineWidth} is set to PM_MenuBarPanelWidth. |
|
1868 The \l{QStyleOptionFrame::}{midLineWidth} is currently always set |
|
1869 to 0. |
|
1870 |
|
1871 \section3 Item View Headers |
|
1872 |
|
1873 It is the style that draws the headers of Qt's item views. The |
|
1874 item views keeps the dimensions on individual sections. Also |
|
1875 note that the delegates may use the style to paint decorations |
|
1876 and frames around items. QItemDelegate, for instance, draws |
|
1877 PE_FrameFocusRect and PE_IndicatorViewItemCheck. |
|
1878 |
|
1879 \image javastyle/header.png |
|
1880 |
|
1881 Here is a QTableWidget showing the bounding rects of a Java |
|
1882 header: |
|
1883 |
|
1884 \image javastyle/headerimage.png |
|
1885 |
|
1886 The QHeaderView uses CT_HeaderSection, PM_HeaderMargin and |
|
1887 PM_HeaderGripMargin for size and hit test calculations. The |
|
1888 PM_HeaderMarkSize is currently not used by Qt. QTableView draws |
|
1889 the button in the top-left corner (i.e., the area where the |
|
1890 vertical and horizontal headers intersect) as a CE_Header. |
|
1891 |
|
1892 The style option for header views is QStyleOptionHeader. The view |
|
1893 paints one header section at a time, so the data is for the |
|
1894 section being drawn. Its contents are: |
|
1895 |
|
1896 \table 90% |
|
1897 \header |
|
1898 \o Member |
|
1899 \o Content |
|
1900 \row |
|
1901 \o icon |
|
1902 \o the icon of the header (for section that is being |
|
1903 drawn). |
|
1904 \row |
|
1905 \o iconAlignment |
|
1906 \o the alignment (Qt::Alignment) of the icon in the header. |
|
1907 \row |
|
1908 \o orientation |
|
1909 \o a Qt::Orientation value deciding whether the header |
|
1910 is the horizontal header above the view or the |
|
1911 vertical header on the left. |
|
1912 \row |
|
1913 \o position |
|
1914 \o a QStyleOptionHeader::SectionPosition value |
|
1915 giving the header section's position relative to |
|
1916 the other sections. |
|
1917 \row |
|
1918 \o section |
|
1919 \o holds the section that is being drawn. |
|
1920 \row |
|
1921 \o selectedPosition |
|
1922 \o a QStyleOptionHeader::SelectedPosition value giving |
|
1923 the selected section's position relative to the |
|
1924 section that is being painted. |
|
1925 \row |
|
1926 \o sortIndicator |
|
1927 \o a QStyleOptionHeader::SortIndicator value that |
|
1928 describes the direction in which the section's sort |
|
1929 indicator should be drawn. |
|
1930 \row |
|
1931 \o text |
|
1932 \o the text of the currently drawn section. |
|
1933 \row |
|
1934 \o textAlignment |
|
1935 \o the Qt::Alignment of the text within the |
|
1936 headersection. |
|
1937 \endtable |
|
1938 |
|
1939 \section3 Tree Branch Indicators |
|
1940 |
|
1941 The branch indicators in a tree view is drawn by the style with |
|
1942 PE_IndicatorBranch. We think of indicators here as the indicators |
|
1943 that describe the relationship of the nodes in the tree. The |
|
1944 generic QStyleOption is sent to the style for drawing this |
|
1945 elements. The various branch types are described by states. Since |
|
1946 there are no specific style option, we simply present the states |
|
1947 table: |
|
1948 |
|
1949 \table 90% |
|
1950 \header |
|
1951 \o State |
|
1952 \o Set When |
|
1953 \row |
|
1954 \o State_Sibling |
|
1955 \o the node in the tree has a sibling (i.e., there is |
|
1956 another node in the same column). |
|
1957 \row |
|
1958 \o State_Item |
|
1959 \o this branch indicator has an item. |
|
1960 \row |
|
1961 \o State_Children |
|
1962 \o the branch has children (i.e., a new sub-tree can |
|
1963 be opened at the branch). |
|
1964 \row |
|
1965 \o State_Open |
|
1966 \o the branch indicator has an opened sub-tree. |
|
1967 \endtable |
|
1968 |
|
1969 The tree view (and tree widget) use the style to draw the branches |
|
1970 (or nodes if you will) of the tree. |
|
1971 |
|
1972 QStyleOption is used as the style for PE_IndicatorBranch has state |
|
1973 flags set depending on what type of branch it is. |
|
1974 |
|
1975 Since there is no tree structure for branch indicators, we only |
|
1976 present an image of a tree in the java style. Each state is marked |
|
1977 in the image with a rectangle in a specific color (i.e., these |
|
1978 rectangles are not bounding rectangles). All combinations of |
|
1979 states you must be aware of are represented in the image. |
|
1980 |
|
1981 \image javastyle/branchindicatorimage.png |
|
1982 |
|
1983 \section3 Tool Boxes |
|
1984 |
|
1985 PM_SmallIconSize for sizeHints. |
|
1986 |
|
1987 QToolBox is a container that keeps a collection of widgets. It has |
|
1988 one tab for each widget and display one of them at a time. The |
|
1989 tool box lays the components it displays (the tool box buttons |
|
1990 and selected widget) in a QVBoxLayout. The style tree for tool |
|
1991 boxes looks like this: |
|
1992 |
|
1993 \image javastyle/toolbox.png |
|
1994 |
|
1995 We show an image of a tool box in the Plastique style: |
|
1996 |
|
1997 \image javastyle/toolboximage.png |
|
1998 |
|
1999 All elements have the same bounding rectangles in the |
|
2000 Plastique as well as the other Qt built-in styles. |
|
2001 |
|
2002 The style option for tool boxes is QStyleOptionToolBox. It |
|
2003 contains the text and icon of the tool box contents. The only |
|
2004 state set by QToolBox is State_Sunken, which is set when the user |
|
2005 presses a tab down with the mouse. The rest of the |
|
2006 QStyleOptionToolBox members are: |
|
2007 |
|
2008 \table 90% |
|
2009 \header |
|
2010 \o Member |
|
2011 \o Content |
|
2012 \row |
|
2013 \o icon |
|
2014 \o the icon on the toolbox tab |
|
2015 \row |
|
2016 \o text |
|
2017 \o the text on the toolbox tab |
|
2018 \endtable |
|
2019 |
|
2020 \section3 Size Grip |
|
2021 |
|
2022 The size grip calculates its size hint with CT_SizeGrip. The pixel |
|
2023 metric PM_SizeGripSize is currently unused by Qt. The element tree |
|
2024 for and an image in the Plastique style of QSizeGrip follows: |
|
2025 |
|
2026 \image javastyle/sizegrip.png |
|
2027 |
|
2028 \image javastyle/sizegripimage.png |
|
2029 |
|
2030 We show the size grip in a \l{QMainWindow}'s bottom right |
|
2031 corner. |
|
2032 |
|
2033 The size grip style option, QStyleOptionSizeGrip, have one |
|
2034 member except the common members from QStyleOption: |
|
2035 |
|
2036 \table 90% |
|
2037 \header |
|
2038 \o Member |
|
2039 \o Content |
|
2040 \row |
|
2041 \o corner |
|
2042 \o a Qt::Corner value that describe which corner in a |
|
2043 window (or equivalent) the grip is located. |
|
2044 \endtable |
|
2045 |
|
2046 \section3 Rubber Band |
|
2047 |
|
2048 The \l{QRubberBand}'s style tree consists of two nodes. |
|
2049 |
|
2050 \image javastyle/rubberband.png |
|
2051 |
|
2052 We present an image of a Java style window being moved in a |
|
2053 QMdiArea with a rubber band: |
|
2054 |
|
2055 \image javastyle/rubberbandimage.png |
|
2056 |
|
2057 The style option for rubber bands is QStyleOptionRubberBand. |
|
2058 Its members are: |
|
2059 |
|
2060 \table |
|
2061 \header |
|
2062 \o Member |
|
2063 \o Content |
|
2064 \row |
|
2065 \o opaque |
|
2066 \o boolean that is true if the rubber band must be |
|
2067 drawn in an opaque style (i.e., color) |
|
2068 \row |
|
2069 \o shape |
|
2070 \o a QRubberBand::Shape enum value that holds the |
|
2071 shape of the band (which is either a rectangle or a |
|
2072 line) |
|
2073 \endtable |
|
2074 |
|
2075 \section3 Dock Widgets |
|
2076 |
|
2077 When the dock widget lays out its contents it asks the style for |
|
2078 these pixel metrics: PM_DockWidgetSeparatorExtent, |
|
2079 PM_DockWidgetTitleBarButtonMargin, PM_DockWidgetFrameWidth, and |
|
2080 PM_DockWidgetTitleMargin. It also calculates the bounding |
|
2081 rectangles of the float and close buttons with |
|
2082 SE_DockWidgetCloseButton and SE_DockWidgetFloatButton. |
|
2083 |
|
2084 \image javastyle/dockwidget.png |
|
2085 |
|
2086 The dotted lines indicate that the sender keeps instances of the |
|
2087 recipient of the arrow (i.e., it is not a style element to draw). |
|
2088 The dock widget only draws PE_frameDockWidget when it is detached |
|
2089 from its main window (i.e., it is a top level window). If it is |
|
2090 docked it draws the indicator dock widget resize handle. We show a |
|
2091 dock widget in both docked and floating state in the plastique |
|
2092 style: |
|
2093 |
|
2094 \image javastyle/dockwidgetimage.png |
|
2095 |
|
2096 The style option is QStyleOptionDockWidget: |
|
2097 |
|
2098 \table 90% |
|
2099 \header |
|
2100 \o Member |
|
2101 \o Content |
|
2102 \row |
|
2103 \o closeable |
|
2104 \o boolean that holds whether the dock window can be |
|
2105 closed |
|
2106 \row |
|
2107 \o floatable |
|
2108 \o boolean that holds whether the dock window can |
|
2109 float (i.e., detach from the main window in which |
|
2110 it lives) |
|
2111 \row |
|
2112 \o movable |
|
2113 \o boolean that holds whether the window is movable |
|
2114 (i.e., can move to other dock widget areas) |
|
2115 \row |
|
2116 \o title |
|
2117 \o the title text of the dock window |
|
2118 \endtable |
|
2119 |
|
2120 For the buttons, QStyleOptionButton is used (see \l{Tool Buttons} |
|
2121 for content description). The dock widget resize handle has a |
|
2122 plain QStyleOption. |
|
2123 */ |