summaryrefslogtreecommitdiffstats
path: root/Python/Python-ast.c
blob: 725256350c315ec72fb3143f59e652a0f6646f5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
/* File automatically generated by Parser/asdl_c.py. */


/*
   __version__ 62078.

   This module must be committed separately after each AST grammar change;
   The __version__ number is set to the revision number of the commit
   containing the grammar change.
*/

#include "Python.h"
#include "Python-ast.h"

static PyTypeObject AST_type;
static PyTypeObject *mod_type;
static PyObject* ast2obj_mod(void*);
static PyTypeObject *Module_type;
static char *Module_fields[]={
        "body",
};
static PyTypeObject *Interactive_type;
static char *Interactive_fields[]={
        "body",
};
static PyTypeObject *Expression_type;
static char *Expression_fields[]={
        "body",
};
static PyTypeObject *Suite_type;
static char *Suite_fields[]={
        "body",
};
static PyTypeObject *stmt_type;
static char *stmt_attributes[] = {
        "lineno",
        "col_offset",
};
static PyObject* ast2obj_stmt(void*);
static PyTypeObject *FunctionDef_type;
static char *FunctionDef_fields[]={
        "name",
        "args",
        "body",
        "decorator_list",
        "returns",
};
static PyTypeObject *ClassDef_type;
static char *ClassDef_fields[]={
        "name",
        "bases",
        "keywords",
        "starargs",
        "kwargs",
        "body",
        "decorator_list",
};
static PyTypeObject *Return_type;
static char *Return_fields[]={
        "value",
};
static PyTypeObject *Delete_type;
static char *Delete_fields[]={
        "targets",
};
static PyTypeObject *Assign_type;
static char *Assign_fields[]={
        "targets",
        "value",
};
static PyTypeObject *AugAssign_type;
static char *AugAssign_fields[]={
        "target",
        "op",
        "value",
};
static PyTypeObject *For_type;
static char *For_fields[]={
        "target",
        "iter",
        "body",
        "orelse",
};
static PyTypeObject *While_type;
static char *While_fields[]={
        "test",
        "body",
        "orelse",
};
static PyTypeObject *If_type;
static char *If_fields[]={
        "test",
        "body",
        "orelse",
};
static PyTypeObject *With_type;
static char *With_fields[]={
        "context_expr",
        "optional_vars",
        "body",
};
static PyTypeObject *Raise_type;
static char *Raise_fields[]={
        "exc",
        "cause",
};
static PyTypeObject *TryExcept_type;
static char *TryExcept_fields[]={
        "body",
        "handlers",
        "orelse",
};
static PyTypeObject *TryFinally_type;
static char *TryFinally_fields[]={
        "body",
        "finalbody",
};
static PyTypeObject *Assert_type;
static char *Assert_fields[]={
        "test",
        "msg",
};
static PyTypeObject *Import_type;
static char *Import_fields[]={
        "names",
};
static PyTypeObject *ImportFrom_type;
static char *ImportFrom_fields[]={
        "module",
        "names",
        "level",
};
static PyTypeObject *Global_type;
static char *Global_fields[]={
        "names",
};
static PyTypeObject *Nonlocal_type;
static char *Nonlocal_fields[]={
        "names",
};
static PyTypeObject *Expr_type;
static char *Expr_fields[]={
        "value",
};
static PyTypeObject *Pass_type;
static PyTypeObject *Break_type;
static PyTypeObject *Continue_type;
static PyTypeObject *expr_type;
static char *expr_attributes[] = {
        "lineno",
        "col_offset",
};
static PyObject* ast2obj_expr(void*);
static PyTypeObject *BoolOp_type;
static char *BoolOp_fields[]={
        "op",
        "values",
};
static PyTypeObject *BinOp_type;
static char *BinOp_fields[]={
        "left",
        "op",
        "right",
};
static PyTypeObject *UnaryOp_type;
static char *UnaryOp_fields[]={
        "op",
        "operand",
};
static PyTypeObject *Lambda_type;
static char *Lambda_fields[]={
        "args",
        "body",
};
static PyTypeObject *IfExp_type;
static char *IfExp_fields[]={
        "test",
        "body",
        "orelse",
};
static PyTypeObject *Dict_type;
static char *Dict_fields[]={
        "keys",
        "values",
};
static PyTypeObject *Set_type;
static char *Set_fields[]={
        "elts",
};
static PyTypeObject *ListComp_type;
static char *ListComp_fields[]={
        "elt",
        "generators",
};
static PyTypeObject *SetComp_type;
static char *SetComp_fields[]={
        "elt",
        "generators",
};
static PyTypeObject *DictComp_type;
static char *DictComp_fields[]={
        "key",
        "value",
        "generators",
};
static PyTypeObject *GeneratorExp_type;
static char *GeneratorExp_fields[]={
        "elt",
        "generators",
};
static PyTypeObject *Yield_type;
static char *Yield_fields[]={
        "value",
};
static PyTypeObject *Compare_type;
static char *Compare_fields[]={
        "left",
        "ops",
        "comparators",
};
static PyTypeObject *Call_type;
static char *Call_fields[]={
        "func",
        "args",
        "keywords",
        "starargs",
        "kwargs",
};
static PyTypeObject *Num_type;
static char *Num_fields[]={
        "n",
};
static PyTypeObject *Str_type;
static char *Str_fields[]={
        "s",
};
static PyTypeObject *Bytes_type;
static char *Bytes_fields[]={
        "s",
};
static PyTypeObject *Ellipsis_type;
static PyTypeObject *Attribute_type;
static char *Attribute_fields[]={
        "value",
        "attr",
        "ctx",
};
static PyTypeObject *Subscript_type;
static char *Subscript_fields[]={
        "value",
        "slice",
        "ctx",
};
static PyTypeObject *Starred_type;
static char *Starred_fields[]={
        "value",
        "ctx",
};
static PyTypeObject *Name_type;
static char *Name_fields[]={
        "id",
        "ctx",
};
static PyTypeObject *List_type;
static char *List_fields[]={
        "elts",
        "ctx",
};
static PyTypeObject *Tuple_type;
static char *Tuple_fields[]={
        "elts",
        "ctx",
};
static PyTypeObject *expr_context_type;
static PyObject *Load_singleton, *Store_singleton, *Del_singleton,
*AugLoad_singleton, *AugStore_singleton, *Param_singleton;
static PyObject* ast2obj_expr_context(expr_context_ty);
static PyTypeObject *Load_type;
static PyTypeObject *Store_type;
static PyTypeObject *Del_type;
static PyTypeObject *AugLoad_type;
static PyTypeObject *AugStore_type;
static PyTypeObject *Param_type;
static PyTypeObject *slice_type;
static PyObject* ast2obj_slice(void*);
static PyTypeObject *Slice_type;
static char *Slice_fields[]={
        "lower",
        "upper",
        "step",
};
static PyTypeObject *ExtSlice_type;
static char *ExtSlice_fields[]={
        "dims",
};
static PyTypeObject *Index_type;
static char *Index_fields[]={
        "value",
};
static PyTypeObject *boolop_type;
static PyObject *And_singleton, *Or_singleton;
static PyObject* ast2obj_boolop(boolop_ty);
static PyTypeObject *And_type;
static PyTypeObject *Or_type;
static PyTypeObject *operator_type;
static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton,
*Div_singleton, *Mod_singleton, *Pow_singleton, *LShift_singleton,
*RShift_singleton, *BitOr_singleton, *BitXor_singleton, *BitAnd_singleton,
*FloorDiv_singleton;
static PyObject* ast2obj_operator(operator_ty);
static PyTypeObject *Add_type;
static PyTypeObject *Sub_type;
static PyTypeObject *Mult_type;
static PyTypeObject *Div_type;
static PyTypeObject *Mod_type;
static PyTypeObject *Pow_type;
static PyTypeObject *LShift_type;
static PyTypeObject *RShift_type;
static PyTypeObject *BitOr_type;
static PyTypeObject *BitXor_type;
static PyTypeObject *BitAnd_type;
static PyTypeObject *FloorDiv_type;
static PyTypeObject *unaryop_type;
static PyObject *Invert_singleton, *Not_singleton, *UAdd_singleton,
*USub_singleton;
static PyObject* ast2obj_unaryop(unaryop_ty);
static PyTypeObject *Invert_type;
static PyTypeObject *Not_type;
static PyTypeObject *UAdd_type;
static PyTypeObject *USub_type;
static PyTypeObject *cmpop_type;
static PyObject *Eq_singleton, *NotEq_singleton, *Lt_singleton, *LtE_singleton,
*Gt_singleton, *GtE_singleton, *Is_singleton, *IsNot_singleton, *In_singleton,
*NotIn_singleton;
static PyObject* ast2obj_cmpop(cmpop_ty);
static PyTypeObject *Eq_type;
static PyTypeObject *NotEq_type;
static PyTypeObject *Lt_type;
static PyTypeObject *LtE_type;
static PyTypeObject *Gt_type;
static PyTypeObject *GtE_type;
static PyTypeObject *Is_type;
static PyTypeObject *IsNot_type;
static PyTypeObject *In_type;
static PyTypeObject *NotIn_type;
static PyTypeObject *comprehension_type;
static PyObject* ast2obj_comprehension(void*);
static char *comprehension_fields[]={
        "target",
        "iter",
        "ifs",
};
static PyTypeObject *excepthandler_type;
static char *excepthandler_attributes[] = {
        "lineno",
        "col_offset",
};
static PyObject* ast2obj_excepthandler(void*);
static PyTypeObject *ExceptHandler_type;
static char *ExceptHandler_fields[]={
        "type",
        "name",
        "body",
};
static PyTypeObject *arguments_type;
static PyObject* ast2obj_arguments(void*);
static char *arguments_fields[]={
        "args",
        "vararg",
        "varargannotation",
        "kwonlyargs",
        "kwarg",
        "kwargannotation",
        "defaults",
        "kw_defaults",
};
static PyTypeObject *arg_type;
static PyObject* ast2obj_arg(void*);
static char *arg_fields[]={
        "arg",
        "annotation",
};
static PyTypeObject *keyword_type;
static PyObject* ast2obj_keyword(void*);
static char *keyword_fields[]={
        "arg",
        "value",
};
static PyTypeObject *alias_type;
static PyObject* ast2obj_alias(void*);
static char *alias_fields[]={
        "name",
        "asname",
};


static int
ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
{
    Py_ssize_t i, numfields = 0;
    int res = -1;
    PyObject *key, *value, *fields;
    fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields");
    if (!fields)
        PyErr_Clear();
    if (fields) {
        numfields = PySequence_Size(fields);
        if (numfields == -1)
            goto cleanup;
    }
    res = 0; /* if no error occurs, this stays 0 to the end */
    if (PyTuple_GET_SIZE(args) > 0) {
        if (numfields != PyTuple_GET_SIZE(args)) {
            PyErr_Format(PyExc_TypeError, "%.400s constructor takes %s"
                         "%zd positional argument%s",
                         Py_TYPE(self)->tp_name,
                         numfields == 0 ? "" : "either 0 or ",
                         numfields, numfields == 1 ? "" : "s");
            res = -1;
            goto cleanup;
        }
        for (i = 0; i < PyTuple_GET_SIZE(args); i++) {
            /* cannot be reached when fields is NULL */
            PyObject *name = PySequence_GetItem(fields, i);
            if (!name) {
                res = -1;
                goto cleanup;
            }
            res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
            Py_DECREF(name);
            if (res < 0)
                goto cleanup;
        }
    }
    if (kw) {
        i = 0;  /* needed by PyDict_Next */
        while (PyDict_Next(kw, &i, &key, &value)) {
            res = PyObject_SetAttr(self, key, value);
            if (res < 0)
                goto cleanup;
        }
    }
  cleanup:
    Py_XDECREF(fields);
    return res;
}

/* Pickling support */
static PyObject *
ast_type_reduce(PyObject *self, PyObject *unused)
{
    PyObject *res;
    PyObject *dict = PyObject_GetAttrString(self, "__dict__");
    if (dict == NULL) {
        if (PyErr_ExceptionMatches(PyExc_AttributeError))
            PyErr_Clear();
        else
            return NULL;
    }
    if (dict) {
        res = Py_BuildValue("O()O", Py_TYPE(self), dict);
        Py_DECREF(dict);
        return res;
    }
    return Py_BuildValue("O()", Py_TYPE(self));
}

static PyMethodDef ast_type_methods[] = {
    {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
    {NULL}
};

static PyTypeObject AST_type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "_ast.AST",
    sizeof(PyObject),
    0,
    0,                       /* tp_dealloc */
    0,                       /* tp_print */
    0,                       /* tp_getattr */
    0,                       /* tp_setattr */
    0,                       /* tp_compare */
    0,                       /* tp_repr */
    0,                       /* tp_as_number */
    0,                       /* tp_as_sequence */
    0,                       /* tp_as_mapping */
    0,                       /* tp_hash */
    0,                       /* tp_call */
    0,                       /* tp_str */
    PyObject_GenericGetAttr, /* tp_getattro */
    PyObject_GenericSetAttr, /* tp_setattro */
    0,                       /* tp_as_buffer */
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
    0,                       /* tp_doc */
    0,                       /* tp_traverse */
    0,                       /* tp_clear */
    0,                       /* tp_richcompare */
    0,                       /* tp_weaklistoffset */
    0,                       /* tp_iter */
    0,                       /* tp_iternext */
    ast_type_methods,        /* tp_methods */
    0,                       /* tp_members */
    0,                       /* tp_getset */
    0,                       /* tp_base */
    0,                       /* tp_dict */
    0,                       /* tp_descr_get */
    0,                       /* tp_descr_set */
    0,                       /* tp_dictoffset */
    (initproc)ast_type_init, /* tp_init */
    PyType_GenericAlloc,     /* tp_alloc */
    PyType_GenericNew,       /* tp_new */
    PyObject_Del,            /* tp_free */
};


static PyTypeObject* make_type(char *type, PyTypeObject* base, char**fields, int num_fields)
{
    PyObject *fnames, *result;
    int i;
    fnames = PyTuple_New(num_fields);
    if (!fnames) return NULL;
    for (i = 0; i < num_fields; i++) {
        PyObject *field = PyUnicode_FromString(fields[i]);
        if (!field) {
            Py_DECREF(fnames);
            return NULL;
        }
        PyTuple_SET_ITEM(fnames, i, field);
    }
    result = PyObject_CallFunction((PyObject*)&PyType_Type, "U(O){sOss}",
                    type, base, "_fields", fnames, "__module__", "_ast");
    Py_DECREF(fnames);
    return (PyTypeObject*)result;
}

static int add_attributes(PyTypeObject* type, char**attrs, int num_fields)
{
    int i, result;
    PyObject *s, *l = PyTuple_New(num_fields);
    if (!l) return 0;
    for(i = 0; i < num_fields; i++) {
        s = PyUnicode_FromString(attrs[i]);
        if (!s) {
            Py_DECREF(l);
            return 0;
        }
        PyTuple_SET_ITEM(l, i, s);
    }
    result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0;
    Py_DECREF(l);
    return result;
}

/* Conversion AST -> Python */

static PyObject* ast2obj_list(asdl_seq *seq, PyObject* (*func)(void*))
{
    int i, n = asdl_seq_LEN(seq);
    PyObject *result = PyList_New(n);
    PyObject *value;
    if (!result)
        return NULL;
    for (i = 0; i < n; i++) {
        value = func(asdl_seq_GET(seq, i));
        if (!value) {
            Py_DECREF(result);
            return NULL;
        }
        PyList_SET_ITEM(result, i, value);
    }
    return result;
}

static PyObject* ast2obj_object(void *o)
{
    if (!o)
        o = Py_None;
    Py_INCREF((PyObject*)o);
    return (PyObject*)o;
}
#define ast2obj_identifier ast2obj_object
#define ast2obj_string ast2obj_object

static PyObject* ast2obj_int(long b)
{
    return PyLong_FromLong(b);
}

/* Conversion Python -> AST */

static int obj2ast_object(PyObject* obj, PyObject** out, PyArena* arena)
{
    if (obj == Py_None)
        obj = NULL;
    if (obj)
        PyArena_AddPyObject(arena, obj);
    Py_XINCREF(obj);
    *out = obj;
    return 0;
}

#define obj2ast_identifier obj2ast_object
#define obj2ast_string obj2ast_object

static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
{
    int i;
    if (!PyLong_Check(obj)) {
        PyObject *s = PyObject_Repr(obj);
        if (s == NULL) return 1;
        PyErr_Format(PyExc_ValueError, "invalid integer value: %.400s",
                     PyBytes_AS_STRING(s));
        Py_DECREF(s);
        return 1;
    }

    i = (int)PyLong_AsLong(obj);
    if (i == -1 && PyErr_Occurred())
        return 1;
    *out = i;
    return 0;
}

static int add_ast_fields()
{
    PyObject *empty_tuple, *d;
    if (PyType_Ready(&AST_type) < 0)
        return -1;
    d = AST_type.tp_dict;
    empty_tuple = PyTuple_New(0);
    if (!empty_tuple ||
        PyDict_SetItemString(d, "_fields", empty_tuple) < 0 ||
        PyDict_SetItemString(d, "_attributes", empty_tuple) < 0) {
        Py_XDECREF(empty_tuple);
        return -1;
    }
    Py_DECREF(empty_tuple);
    return 0;
}


static int init_types(void)
{
        static int initialized;
        if (initialized) return 1;
        if (add_ast_fields() < 0) return 0;
        mod_type = make_type("mod", &AST_type, NULL, 0);
        if (!mod_type) return 0;
        if (!add_attributes(mod_type, NULL, 0)) return 0;
        Module_type = make_type("Module", mod_type, Module_fields, 1);
        if (!Module_type) return 0;
        Interactive_type = make_type("Interactive", mod_type,
                                     Interactive_fields, 1);
        if (!Interactive_type) return 0;
        Expression_type = make_type("Expression", mod_type, Expression_fields,
                                    1);
        if (!Expression_type) return 0;
        Suite_type = make_type("Suite", mod_type, Suite_fields, 1);
        if (!Suite_type) return 0;
        stmt_type = make_type("stmt", &AST_type, NULL, 0);
        if (!stmt_type) return 0;
        if (!add_attributes(stmt_type, stmt_attributes, 2)) return 0;
        FunctionDef_type = make_type("FunctionDef", stmt_type,
                                     FunctionDef_fields, 5);
        if (!FunctionDef_type) return 0;
        ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 7);
        if (!ClassDef_type) return 0;
        Return_type = make_type("Return", stmt_type, Return_fields, 1);
        if (!Return_type) return 0;
        Delete_type = make_type("Delete", stmt_type, Delete_fields, 1);
        if (!Delete_type) return 0;
        Assign_type = make_type("Assign", stmt_type, Assign_fields, 2);
        if (!Assign_type) return 0;
        AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3);
        if (!AugAssign_type) return 0;
        For_type = make_type("For", stmt_type, For_fields, 4);
        if (!For_type) return 0;
        While_type = make_type("While", stmt_type, While_fields, 3);
        if (!While_type) return 0;
        If_type = make_type("If", stmt_type, If_fields, 3);
        if (!If_type) return 0;
        With_type = make_type("With", stmt_type, With_fields, 3);
        if (!With_type) return 0;
        Raise_type = make_type("Raise", stmt_type, Raise_fields, 2);
        if (!Raise_type) return 0;
        TryExcept_type = make_type("TryExcept", stmt_type, TryExcept_fields, 3);
        if (!TryExcept_type) return 0;
        TryFinally_type = make_type("TryFinally", stmt_type, TryFinally_fields,
                                    2);
        if (!TryFinally_type) return 0;
        Assert_type = make_type("Assert", stmt_type, Assert_fields, 2);
        if (!Assert_type) return 0;
        Import_type = make_type("Import", stmt_type, Import_fields, 1);
        if (!Import_type) return 0;
        ImportFrom_type = make_type("ImportFrom", stmt_type, ImportFrom_fields,
                                    3);
        if (!ImportFrom_type) return 0;
        Global_type = make_type("Global", stmt_type, Global_fields, 1);
        if (!Global_type) return 0;
        Nonlocal_type = make_type("Nonlocal", stmt_type, Nonlocal_fields, 1);
        if (!Nonlocal_type) return 0;
        Expr_type = make_type("Expr", stmt_type, Expr_fields, 1);
        if (!Expr_type) return 0;
        Pass_type = make_type("Pass", stmt_type, NULL, 0);
        if (!Pass_type) return 0;
        Break_type = make_type("Break", stmt_type, NULL, 0);
        if (!Break_type) return 0;
        Continue_type = make_type("Continue", stmt_type, NULL, 0);
        if (!Continue_type) return 0;
        expr_type = make_type("expr", &AST_type, NULL, 0);
        if (!expr_type) return 0;
        if (!add_attributes(expr_type, expr_attributes, 2)) return 0;
        BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2);
        if (!BoolOp_type) return 0;
        BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3);
        if (!BinOp_type) return 0;
        UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2);
        if (!UnaryOp_type) return 0;
        Lambda_type = make_type("Lambda", expr_type, Lambda_fields, 2);
        if (!Lambda_type) return 0;
        IfExp_type = make_type("IfExp", expr_type, IfExp_fields, 3);
        if (!IfExp_type) return 0;
        Dict_type = make_type("Dict", expr_type, Dict_fields, 2);
        if (!Dict_type) return 0;
        Set_type = make_type("Set", expr_type, Set_fields, 1);
        if (!Set_type) return 0;
        ListComp_type = make_type("ListComp", expr_type, ListComp_fields, 2);
        if (!ListComp_type) return 0;
        SetComp_type = make_type("SetComp", expr_type, SetComp_fields, 2);
        if (!SetComp_type) return 0;
        DictComp_type = make_type("DictComp", expr_type, DictComp_fields, 3);
        if (!DictComp_type) return 0;
        GeneratorExp_type = make_type("GeneratorExp", expr_type,
                                      GeneratorExp_fields, 2);
        if (!GeneratorExp_type) return 0;
        Yield_type = make_type("Yield", expr_type, Yield_fields, 1);
        if (!Yield_type) return 0;
        Compare_type = make_type("Compare", expr_type, Compare_fields, 3);
        if (!Compare_type) return 0;
        Call_type = make_type("Call", expr_type, Call_fields, 5);
        if (!Call_type) return 0;
        Num_type = make_type("Num", expr_type, Num_fields, 1);
        if (!Num_type) return 0;
        Str_type = make_type("Str", expr_type, Str_fields, 1);
        if (!Str_type) return 0;
        Bytes_type = make_type("Bytes", expr_type, Bytes_fields, 1);
        if (!Bytes_type) return 0;
        Ellipsis_type = make_type("Ellipsis", expr_type, NULL, 0);
        if (!Ellipsis_type) return 0;
        Attribute_type = make_type("Attribute", expr_type, Attribute_fields, 3);
        if (!Attribute_type) return 0;
        Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
        if (!Subscript_type) return 0;
        Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
        if (!Starred_type) return 0;
        Name_type = make_type("Name", expr_type, Name_fields, 2);
        if (!Name_type) return 0;
        List_type = make_type("List", expr_type, List_fields, 2);
        if (!List_type) return 0;
        Tuple_type = make_type("Tuple", expr_type, Tuple_fields, 2);
        if (!Tuple_type) return 0;
        expr_context_type = make_type("expr_context", &AST_type, NULL, 0);
        if (!expr_context_type) return 0;
        if (!add_attributes(expr_context_type, NULL, 0)) return 0;
        Load_type = make_type("Load", expr_context_type, NULL, 0);
        if (!Load_type) return 0;
        Load_singleton = PyType_GenericNew(Load_type, NULL, NULL);
        if (!Load_singleton) return 0;
        Store_type = make_type("Store", expr_context_type, NULL, 0);
        if (!Store_type) return 0;
        Store_singleton = PyType_GenericNew(Store_type, NULL, NULL);
        if (!Store_singleton) return 0;
        Del_type = make_type("Del", expr_context_type, NULL, 0);
        if (!Del_type) return 0;
        Del_singleton = PyType_GenericNew(Del_type, NULL, NULL);
        if (!Del_singleton) return 0;
        AugLoad_type = make_type("AugLoad", expr_context_type, NULL, 0);
        if (!AugLoad_type) return 0;
        AugLoad_singleton = PyType_GenericNew(AugLoad_type, NULL, NULL);
        if (!AugLoad_singleton) return 0;
        AugStore_type = make_type("AugStore", expr_context_type, NULL, 0);
        if (!AugStore_type) return 0;
        AugStore_singleton = PyType_GenericNew(AugStore_type, NULL, NULL);
        if (!AugStore_singleton) return 0;
        Param_type = make_type("Param", expr_context_type, NULL, 0);
        if (!Param_type) return 0;
        Param_singleton = PyType_GenericNew(Param_type, NULL, NULL);
        if (!Param_singleton) return 0;
        slice_type = make_type("slice", &AST_type, NULL, 0);
        if (!slice_type) return 0;
        if (!add_attributes(slice_type, NULL, 0)) return 0;
        Slice_type = make_type("Slice", slice_type, Slice_fields, 3);
        if (!Slice_type) return 0;
        ExtSlice_type = make_type("ExtSlice", slice_type, ExtSlice_fields, 1);
        if (!ExtSlice_type) return 0;
        Index_type = make_type("Index", slice_type, Index_fields, 1);
        if (!Index_type) return 0;
        boolop_type = make_type("boolop", &AST_type, NULL, 0);
        if (!boolop_type) return 0;
        if (!add_attributes(boolop_type, NULL, 0)) return 0;
        And_type = make_type("And", boolop_type, NULL, 0);
        if (!And_type) return 0;
        And_singleton = PyType_GenericNew(And_type, NULL, NULL);
        if (!And_singleton) return 0;
        Or_type = make_type("Or", boolop_type, NULL, 0);
        if (!Or_type) return 0;
        Or_singleton = PyType_GenericNew(Or_type, NULL, NULL);
        if (!Or_singleton) return 0;
        operator_type = make_type("operator", &AST_type, NULL, 0);
        if (!operator_type) return 0;
        if (!add_attributes(operator_type, NULL, 0)) return 0;
        Add_type = make_type("Add", operator_type, NULL, 0);
        if (!Add_type) return 0;
        Add_singleton = PyType_GenericNew(Add_type, NULL, NULL);
        if (!Add_singleton) return 0;
        Sub_type = make_type("Sub", operator_type, NULL, 0);
        if (!Sub_type) return 0;
        Sub_singleton = PyType_GenericNew(Sub_type, NULL, NULL);
        if (!Sub_singleton) return 0;
        Mult_type = make_type("Mult", operator_type, NULL, 0);
        if (!Mult_type) return 0;
        Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL);
        if (!Mult_singleton) return 0;
        Div_type = make_type("Div", operator_type, NULL, 0);
        if (!Div_type) return 0;
        Div_singleton = PyType_GenericNew(Div_type, NULL, NULL);
        if (!Div_singleton) return 0;
        Mod_type = make_type("Mod", operator_type, NULL, 0);
        if (!Mod_type) return 0;
        Mod_singleton = PyType_GenericNew(Mod_type, NULL, NULL);
        if (!Mod_singleton) return 0;
        Pow_type = make_type("Pow", operator_type, NULL, 0);
        if (!Pow_type) return 0;
        Pow_singleton = PyType_GenericNew(Pow_type, NULL, NULL);
        if (!Pow_singleton) return 0;
        LShift_type = make_type("LShift", operator_type, NULL, 0);
        if (!LShift_type) return 0;
        LShift_singleton = PyType_GenericNew(LShift_type, NULL, NULL);
        if (!LShift_singleton) return 0;
        RShift_type = make_type("RShift", operator_type, NULL, 0);
        if (!RShift_type) return 0;
        RShift_singleton = PyType_GenericNew(RShift_type, NULL, NULL);
        if (!RShift_singleton) return 0;
        BitOr_type = make_type("BitOr", operator_type, NULL, 0);
        if (!BitOr_type) return 0;
        BitOr_singleton = PyType_GenericNew(BitOr_type, NULL, NULL);
        if (!BitOr_singleton) return 0;
        BitXor_type = make_type("BitXor", operator_type, NULL, 0);
        if (!BitXor_type) return 0;
        BitXor_singleton = PyType_GenericNew(BitXor_type, NULL, NULL);
        if (!BitXor_singleton) return 0;
        BitAnd_type = make_type("BitAnd", operator_type, NULL, 0);
        if (!BitAnd_type) return 0;
        BitAnd_singleton = PyType_GenericNew(BitAnd_type, NULL, NULL);
        if (!BitAnd_singleton) return 0;
        FloorDiv_type = make_type("FloorDiv", operator_type, NULL, 0);
        if (!FloorDiv_type) return 0;
        FloorDiv_singleton = PyType_GenericNew(FloorDiv_type, NULL, NULL);
        if (!FloorDiv_singleton) return 0;
        unaryop_type = make_type("unaryop", &AST_type, NULL, 0);
        if (!unaryop_type) return 0;
        if (!add_attributes(unaryop_type, NULL, 0)) return 0;
        Invert_type = make_type("Invert", unaryop_type, NULL, 0);
        if (!Invert_type) return 0;
        Invert_singleton = PyType_GenericNew(Invert_type, NULL, NULL);
        if (!Invert_singleton) return 0;
        Not_type = make_type("Not", unaryop_type, NULL, 0);
        if (!Not_type) return 0;
        Not_singleton = PyType_GenericNew(Not_type, NULL, NULL);
        if (!Not_singleton) return 0;
        UAdd_type = make_type("UAdd", unaryop_type, NULL, 0);
        if (!UAdd_type) return 0;
        UAdd_singleton = PyType_GenericNew(UAdd_type, NULL, NULL);
        if (!UAdd_singleton) return 0;
        USub_type = make_type("USub", unaryop_type, NULL, 0);
        if (!USub_type) return 0;
        USub_singleton = PyType_GenericNew(USub_type, NULL, NULL);
        if (!USub_singleton) return 0;
        cmpop_type = make_type("cmpop", &AST_type, NULL, 0);
        if (!cmpop_type) return 0;
        if (!add_attributes(cmpop_type, NULL, 0)) return 0;
        Eq_type = make_type("Eq", cmpop_type, NULL, 0);
        if (!Eq_type) return 0;
        Eq_singleton = PyType_GenericNew(Eq_type, NULL, NULL);
        if (!Eq_singleton) return 0;
        NotEq_type = make_type("NotEq", cmpop_type, NULL, 0);
        if (!NotEq_type) return 0;
        NotEq_singleton = PyType_GenericNew(NotEq_type, NULL, NULL);
        if (!NotEq_singleton) return 0;
        Lt_type = make_type("Lt", cmpop_type, NULL, 0);
        if (!Lt_type) return 0;
        Lt_singleton = PyType_GenericNew(Lt_type, NULL, NULL);
        if (!Lt_singleton) return 0;
        LtE_type = make_type("LtE", cmpop_type, NULL, 0);
        if (!LtE_type) return 0;
        LtE_singleton = PyType_GenericNew(LtE_type, NULL, NULL);
        if (!LtE_singleton) return 0;
        Gt_type = make_type("Gt", cmpop_type, NULL, 0);
        if (!Gt_type) return 0;
        Gt_singleton = PyType_GenericNew(Gt_type, NULL, NULL);
        if (!Gt_singleton) return 0;
        GtE_type = make_type("GtE", cmpop_type, NULL, 0);
        if (!GtE_type) return 0;
        GtE_singleton = PyType_GenericNew(GtE_type, NULL, NULL);
        if (!GtE_singleton) return 0;
        Is_type = make_type("Is", cmpop_type, NULL, 0);
        if (!Is_type) return 0;
        Is_singleton = PyType_GenericNew(Is_type, NULL, NULL);
        if (!Is_singleton) return 0;
        IsNot_type = make_type("IsNot", cmpop_type, NULL, 0);
        if (!IsNot_type) return 0;
        IsNot_singleton = PyType_GenericNew(IsNot_type, NULL, NULL);
        if (!IsNot_singleton) return 0;
        In_type = make_type("In", cmpop_type, NULL, 0);
        if (!In_type) return 0;
        In_singleton = PyType_GenericNew(In_type, NULL, NULL);
        if (!In_singleton) return 0;
        NotIn_type = make_type("NotIn", cmpop_type, NULL, 0);
        if (!NotIn_type) return 0;
        NotIn_singleton = PyType_GenericNew(NotIn_type, NULL, NULL);
        if (!NotIn_singleton) return 0;
        comprehension_type = make_type("comprehension", &AST_type,
                                       comprehension_fields, 3);
        if (!comprehension_type) return 0;
        excepthandler_type = make_type("excepthandler", &AST_type, NULL, 0);
        if (!excepthandler_type) return 0;
        if (!add_attributes(excepthandler_type, excepthandler_attributes, 2))
            return 0;
        ExceptHandler_type = make_type("ExceptHandler", excepthandler_type,
                                       ExceptHandler_fields, 3);
        if (!ExceptHandler_type) return 0;
        arguments_type = make_type("arguments", &AST_type, arguments_fields, 8);
        if (!arguments_type) return 0;
        arg_type = make_type("arg", &AST_type, arg_fields, 2);
        if (!arg_type) return 0;
        keyword_type = make_type("keyword", &AST_type, keyword_fields, 2);
        if (!keyword_type) return 0;
        alias_type = make_type("alias", &AST_type, alias_fields, 2);
        if (!alias_type) return 0;
        initialized = 1;
        return 1;
}

static int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena);
static int obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena);
static int obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena);
static int obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena*
                                arena);
static int obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena);
static int obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena);
static int obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena);
static int obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena);
static int obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena);
static int obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena*
                                 arena);
static int obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena*
                                 arena);
static int obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena);
static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena);
static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena);
static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena);

mod_ty
Module(asdl_seq * body, PyArena *arena)
{
        mod_ty p;
        p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Module_kind;
        p->v.Module.body = body;
        return p;
}

mod_ty
Interactive(asdl_seq * body, PyArena *arena)
{
        mod_ty p;
        p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Interactive_kind;
        p->v.Interactive.body = body;
        return p;
}

mod_ty
Expression(expr_ty body, PyArena *arena)
{
        mod_ty p;
        if (!body) {
                PyErr_SetString(PyExc_ValueError,
                                "field body is required for Expression");
                return NULL;
        }
        p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Expression_kind;
        p->v.Expression.body = body;
        return p;
}

mod_ty
Suite(asdl_seq * body, PyArena *arena)
{
        mod_ty p;
        p = (mod_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Suite_kind;
        p->v.Suite.body = body;
        return p;
}

stmt_ty
FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq *
            decorator_list, expr_ty returns, int lineno, int col_offset,
            PyArena *arena)
{
        stmt_ty p;
        if (!name) {
                PyErr_SetString(PyExc_ValueError,
                                "field name is required for FunctionDef");
                return NULL;
        }
        if (!args) {
                PyErr_SetString(PyExc_ValueError,
                                "field args is required for FunctionDef");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = FunctionDef_kind;
        p->v.FunctionDef.name = name;
        p->v.FunctionDef.args = args;
        p->v.FunctionDef.body = body;
        p->v.FunctionDef.decorator_list = decorator_list;
        p->v.FunctionDef.returns = returns;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, expr_ty
         starargs, expr_ty kwargs, asdl_seq * body, asdl_seq * decorator_list,
         int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!name) {
                PyErr_SetString(PyExc_ValueError,
                                "field name is required for ClassDef");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = ClassDef_kind;
        p->v.ClassDef.name = name;
        p->v.ClassDef.bases = bases;
        p->v.ClassDef.keywords = keywords;
        p->v.ClassDef.starargs = starargs;
        p->v.ClassDef.kwargs = kwargs;
        p->v.ClassDef.body = body;
        p->v.ClassDef.decorator_list = decorator_list;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Return(expr_ty value, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Return_kind;
        p->v.Return.value = value;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Delete(asdl_seq * targets, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Delete_kind;
        p->v.Delete.targets = targets;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, PyArena
       *arena)
{
        stmt_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Assign");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Assign_kind;
        p->v.Assign.targets = targets;
        p->v.Assign.value = value;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int
          col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!target) {
                PyErr_SetString(PyExc_ValueError,
                                "field target is required for AugAssign");
                return NULL;
        }
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for AugAssign");
                return NULL;
        }
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for AugAssign");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = AugAssign_kind;
        p->v.AugAssign.target = target;
        p->v.AugAssign.op = op;
        p->v.AugAssign.value = value;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int
    lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!target) {
                PyErr_SetString(PyExc_ValueError,
                                "field target is required for For");
                return NULL;
        }
        if (!iter) {
                PyErr_SetString(PyExc_ValueError,
                                "field iter is required for For");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = For_kind;
        p->v.For.target = target;
        p->v.For.iter = iter;
        p->v.For.body = body;
        p->v.For.orelse = orelse;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
      col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for While");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = While_kind;
        p->v.While.test = test;
        p->v.While.body = body;
        p->v.While.orelse = orelse;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int
   col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for If");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = If_kind;
        p->v.If.test = test;
        p->v.If.body = body;
        p->v.If.orelse = orelse;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body, int lineno,
     int col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!context_expr) {
                PyErr_SetString(PyExc_ValueError,
                                "field context_expr is required for With");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = With_kind;
        p->v.With.context_expr = context_expr;
        p->v.With.optional_vars = optional_vars;
        p->v.With.body = body;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Raise_kind;
        p->v.Raise.exc = exc;
        p->v.Raise.cause = cause;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, int lineno,
          int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = TryExcept_kind;
        p->v.TryExcept.body = body;
        p->v.TryExcept.handlers = handlers;
        p->v.TryExcept.orelse = orelse;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int col_offset,
           PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = TryFinally_kind;
        p->v.TryFinally.body = body;
        p->v.TryFinally.finalbody = finalbody;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for Assert");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Assert_kind;
        p->v.Assert.test = test;
        p->v.Assert.msg = msg;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Import(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Import_kind;
        p->v.Import.names = names;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
ImportFrom(identifier module, asdl_seq * names, int level, int lineno, int
           col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!module) {
                PyErr_SetString(PyExc_ValueError,
                                "field module is required for ImportFrom");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = ImportFrom_kind;
        p->v.ImportFrom.module = module;
        p->v.ImportFrom.names = names;
        p->v.ImportFrom.level = level;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Global(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Global_kind;
        p->v.Global.names = names;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Nonlocal(asdl_seq * names, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Nonlocal_kind;
        p->v.Nonlocal.names = names;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Expr(expr_ty value, int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Expr");
                return NULL;
        }
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Expr_kind;
        p->v.Expr.value = value;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Pass(int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Pass_kind;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Break(int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Break_kind;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

stmt_ty
Continue(int lineno, int col_offset, PyArena *arena)
{
        stmt_ty p;
        p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Continue_kind;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena
       *arena)
{
        expr_ty p;
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for BoolOp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = BoolOp_kind;
        p->v.BoolOp.op = op;
        p->v.BoolOp.values = values;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset,
      PyArena *arena)
{
        expr_ty p;
        if (!left) {
                PyErr_SetString(PyExc_ValueError,
                                "field left is required for BinOp");
                return NULL;
        }
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for BinOp");
                return NULL;
        }
        if (!right) {
                PyErr_SetString(PyExc_ValueError,
                                "field right is required for BinOp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = BinOp_kind;
        p->v.BinOp.left = left;
        p->v.BinOp.op = op;
        p->v.BinOp.right = right;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, PyArena
        *arena)
{
        expr_ty p;
        if (!op) {
                PyErr_SetString(PyExc_ValueError,
                                "field op is required for UnaryOp");
                return NULL;
        }
        if (!operand) {
                PyErr_SetString(PyExc_ValueError,
                                "field operand is required for UnaryOp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = UnaryOp_kind;
        p->v.UnaryOp.op = op;
        p->v.UnaryOp.operand = operand;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, PyArena
       *arena)
{
        expr_ty p;
        if (!args) {
                PyErr_SetString(PyExc_ValueError,
                                "field args is required for Lambda");
                return NULL;
        }
        if (!body) {
                PyErr_SetString(PyExc_ValueError,
                                "field body is required for Lambda");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Lambda_kind;
        p->v.Lambda.args = args;
        p->v.Lambda.body = body;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int col_offset,
      PyArena *arena)
{
        expr_ty p;
        if (!test) {
                PyErr_SetString(PyExc_ValueError,
                                "field test is required for IfExp");
                return NULL;
        }
        if (!body) {
                PyErr_SetString(PyExc_ValueError,
                                "field body is required for IfExp");
                return NULL;
        }
        if (!orelse) {
                PyErr_SetString(PyExc_ValueError,
                                "field orelse is required for IfExp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = IfExp_kind;
        p->v.IfExp.test = test;
        p->v.IfExp.body = body;
        p->v.IfExp.orelse = orelse;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Dict(asdl_seq * keys, asdl_seq * values, int lineno, int col_offset, PyArena
     *arena)
{
        expr_ty p;
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Dict_kind;
        p->v.Dict.keys = keys;
        p->v.Dict.values = values;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Set_kind;
        p->v.Set.elts = elts;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
ListComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
         PyArena *arena)
{
        expr_ty p;
        if (!elt) {
                PyErr_SetString(PyExc_ValueError,
                                "field elt is required for ListComp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = ListComp_kind;
        p->v.ListComp.elt = elt;
        p->v.ListComp.generators = generators;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
SetComp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset, PyArena
        *arena)
{
        expr_ty p;
        if (!elt) {
                PyErr_SetString(PyExc_ValueError,
                                "field elt is required for SetComp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = SetComp_kind;
        p->v.SetComp.elt = elt;
        p->v.SetComp.generators = generators;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int lineno, int
         col_offset, PyArena *arena)
{
        expr_ty p;
        if (!key) {
                PyErr_SetString(PyExc_ValueError,
                                "field key is required for DictComp");
                return NULL;
        }
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for DictComp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = DictComp_kind;
        p->v.DictComp.key = key;
        p->v.DictComp.value = value;
        p->v.DictComp.generators = generators;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int col_offset,
             PyArena *arena)
{
        expr_ty p;
        if (!elt) {
                PyErr_SetString(PyExc_ValueError,
                                "field elt is required for GeneratorExp");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = GeneratorExp_kind;
        p->v.GeneratorExp.elt = elt;
        p->v.GeneratorExp.generators = generators;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Yield(expr_ty value, int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Yield_kind;
        p->v.Yield.value = value;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, int lineno,
        int col_offset, PyArena *arena)
{
        expr_ty p;
        if (!left) {
                PyErr_SetString(PyExc_ValueError,
                                "field left is required for Compare");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Compare_kind;
        p->v.Compare.left = left;
        p->v.Compare.ops = ops;
        p->v.Compare.comparators = comparators;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty starargs,
     expr_ty kwargs, int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        if (!func) {
                PyErr_SetString(PyExc_ValueError,
                                "field func is required for Call");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Call_kind;
        p->v.Call.func = func;
        p->v.Call.args = args;
        p->v.Call.keywords = keywords;
        p->v.Call.starargs = starargs;
        p->v.Call.kwargs = kwargs;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Num(object n, int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        if (!n) {
                PyErr_SetString(PyExc_ValueError,
                                "field n is required for Num");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Num_kind;
        p->v.Num.n = n;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Str(string s, int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        if (!s) {
                PyErr_SetString(PyExc_ValueError,
                                "field s is required for Str");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Str_kind;
        p->v.Str.s = s;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Bytes(string s, int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        if (!s) {
                PyErr_SetString(PyExc_ValueError,
                                "field s is required for Bytes");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Bytes_kind;
        p->v.Bytes.s = s;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Ellipsis(int lineno, int col_offset, PyArena *arena)
{
        expr_ty p;
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Ellipsis_kind;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int lineno, int
          col_offset, PyArena *arena)
{
        expr_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Attribute");
                return NULL;
        }
        if (!attr) {
                PyErr_SetString(PyExc_ValueError,
                                "field attr is required for Attribute");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Attribute");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Attribute_kind;
        p->v.Attribute.value = value;
        p->v.Attribute.attr = attr;
        p->v.Attribute.ctx = ctx;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
          col_offset, PyArena *arena)
{
        expr_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Subscript");
                return NULL;
        }
        if (!slice) {
                PyErr_SetString(PyExc_ValueError,
                                "field slice is required for Subscript");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Subscript");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Subscript_kind;
        p->v.Subscript.value = value;
        p->v.Subscript.slice = slice;
        p->v.Subscript.ctx = ctx;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
        *arena)
{
        expr_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Starred");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Starred");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Starred_kind;
        p->v.Starred.value = value;
        p->v.Starred.ctx = ctx;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
     *arena)
{
        expr_ty p;
        if (!id) {
                PyErr_SetString(PyExc_ValueError,
                                "field id is required for Name");
                return NULL;
        }
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Name");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Name_kind;
        p->v.Name.id = id;
        p->v.Name.ctx = ctx;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
List(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
     *arena)
{
        expr_ty p;
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for List");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = List_kind;
        p->v.List.elts = elts;
        p->v.List.ctx = ctx;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

expr_ty
Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int col_offset, PyArena
      *arena)
{
        expr_ty p;
        if (!ctx) {
                PyErr_SetString(PyExc_ValueError,
                                "field ctx is required for Tuple");
                return NULL;
        }
        p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Tuple_kind;
        p->v.Tuple.elts = elts;
        p->v.Tuple.ctx = ctx;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

slice_ty
Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena)
{
        slice_ty p;
        p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Slice_kind;
        p->v.Slice.lower = lower;
        p->v.Slice.upper = upper;
        p->v.Slice.step = step;
        return p;
}

slice_ty
ExtSlice(asdl_seq * dims, PyArena *arena)
{
        slice_ty p;
        p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = ExtSlice_kind;
        p->v.ExtSlice.dims = dims;
        return p;
}

slice_ty
Index(expr_ty value, PyArena *arena)
{
        slice_ty p;
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for Index");
                return NULL;
        }
        p = (slice_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = Index_kind;
        p->v.Index.value = value;
        return p;
}

comprehension_ty
comprehension(expr_ty target, expr_ty iter, asdl_seq * ifs, PyArena *arena)
{
        comprehension_ty p;
        if (!target) {
                PyErr_SetString(PyExc_ValueError,
                                "field target is required for comprehension");
                return NULL;
        }
        if (!iter) {
                PyErr_SetString(PyExc_ValueError,
                                "field iter is required for comprehension");
                return NULL;
        }
        p = (comprehension_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->target = target;
        p->iter = iter;
        p->ifs = ifs;
        return p;
}

excepthandler_ty
ExceptHandler(expr_ty type, identifier name, asdl_seq * body, int lineno, int
              col_offset, PyArena *arena)
{
        excepthandler_ty p;
        p = (excepthandler_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->kind = ExceptHandler_kind;
        p->v.ExceptHandler.type = type;
        p->v.ExceptHandler.name = name;
        p->v.ExceptHandler.body = body;
        p->lineno = lineno;
        p->col_offset = col_offset;
        return p;
}

arguments_ty
arguments(asdl_seq * args, identifier vararg, expr_ty varargannotation,
          asdl_seq * kwonlyargs, identifier kwarg, expr_ty kwargannotation,
          asdl_seq * defaults, asdl_seq * kw_defaults, PyArena *arena)
{
        arguments_ty p;
        p = (arguments_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->args = args;
        p->vararg = vararg;
        p->varargannotation = varargannotation;
        p->kwonlyargs = kwonlyargs;
        p->kwarg = kwarg;
        p->kwargannotation = kwargannotation;
        p->defaults = defaults;
        p->kw_defaults = kw_defaults;
        return p;
}

arg_ty
arg(identifier arg, expr_ty annotation, PyArena *arena)
{
        arg_ty p;
        if (!arg) {
                PyErr_SetString(PyExc_ValueError,
                                "field arg is required for arg");
                return NULL;
        }
        p = (arg_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->arg = arg;
        p->annotation = annotation;
        return p;
}

keyword_ty
keyword(identifier arg, expr_ty value, PyArena *arena)
{
        keyword_ty p;
        if (!arg) {
                PyErr_SetString(PyExc_ValueError,
                                "field arg is required for keyword");
                return NULL;
        }
        if (!value) {
                PyErr_SetString(PyExc_ValueError,
                                "field value is required for keyword");
                return NULL;
        }
        p = (keyword_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->arg = arg;
        p->value = value;
        return p;
}

alias_ty
alias(identifier name, identifier asname, PyArena *arena)
{
        alias_ty p;
        if (!name) {
                PyErr_SetString(PyExc_ValueError,
                                "field name is required for alias");
                return NULL;
        }
        p = (alias_ty)PyArena_Malloc(arena, sizeof(*p));
        if (!p)
                return NULL;
        p->name = name;
        p->asname = asname;
        return p;
}


PyObject*
ast2obj_mod(void* _o)
{
        mod_ty o = (mod_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        switch (o->kind) {
        case Module_kind:
                result = PyType_GenericNew(Module_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Module.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Interactive_kind:
                result = PyType_GenericNew(Interactive_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Expression_kind:
                result = PyType_GenericNew(Expression_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Expression.body);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Suite_kind:
                result = PyType_GenericNew(Suite_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Suite.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        }
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_stmt(void* _o)
{
        stmt_ty o = (stmt_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        switch (o->kind) {
        case FunctionDef_kind:
                result = PyType_GenericNew(FunctionDef_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_identifier(o->v.FunctionDef.name);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "name", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_arguments(o->v.FunctionDef.args);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "args", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.FunctionDef.decorator_list,
                                     ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "decorator_list", value) ==
                    -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.FunctionDef.returns);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "returns", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case ClassDef_kind:
                result = PyType_GenericNew(ClassDef_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_identifier(o->v.ClassDef.name);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "name", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "bases", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "keywords", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.ClassDef.starargs);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "starargs", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.ClassDef.kwargs);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "kwargs", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ClassDef.decorator_list,
                                     ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "decorator_list", value) ==
                    -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Return_kind:
                result = PyType_GenericNew(Return_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Return.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Delete_kind:
                result = PyType_GenericNew(Delete_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Delete.targets, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "targets", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Assign_kind:
                result = PyType_GenericNew(Assign_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Assign.targets, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "targets", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Assign.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case AugAssign_kind:
                result = PyType_GenericNew(AugAssign_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.AugAssign.target);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "target", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_operator(o->v.AugAssign.op);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "op", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.AugAssign.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case For_kind:
                result = PyType_GenericNew(For_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.For.target);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "target", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.For.iter);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "iter", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.For.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.For.orelse, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "orelse", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case While_kind:
                result = PyType_GenericNew(While_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.While.test);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "test", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.While.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.While.orelse, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "orelse", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case If_kind:
                result = PyType_GenericNew(If_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.If.test);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "test", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.If.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.If.orelse, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "orelse", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case With_kind:
                result = PyType_GenericNew(With_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.With.context_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "context_expr", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.With.optional_vars);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "optional_vars", value) ==
                    -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.With.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Raise_kind:
                result = PyType_GenericNew(Raise_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Raise.exc);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "exc", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Raise.cause);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "cause", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case TryExcept_kind:
                result = PyType_GenericNew(TryExcept_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.TryExcept.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.TryExcept.handlers,
                                     ast2obj_excepthandler);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "handlers", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.TryExcept.orelse, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "orelse", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case TryFinally_kind:
                result = PyType_GenericNew(TryFinally_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.TryFinally.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.TryFinally.finalbody, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "finalbody", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Assert_kind:
                result = PyType_GenericNew(Assert_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Assert.test);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "test", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Assert.msg);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "msg", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Import_kind:
                result = PyType_GenericNew(Import_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Import.names, ast2obj_alias);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "names", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case ImportFrom_kind:
                result = PyType_GenericNew(ImportFrom_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_identifier(o->v.ImportFrom.module);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "module", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "names", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_int(o->v.ImportFrom.level);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "level", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Global_kind:
                result = PyType_GenericNew(Global_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Global.names, ast2obj_identifier);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "names", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Nonlocal_kind:
                result = PyType_GenericNew(Nonlocal_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "names", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Expr_kind:
                result = PyType_GenericNew(Expr_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Expr.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Pass_kind:
                result = PyType_GenericNew(Pass_type, NULL, NULL);
                if (!result) goto failed;
                break;
        case Break_kind:
                result = PyType_GenericNew(Break_type, NULL, NULL);
                if (!result) goto failed;
                break;
        case Continue_kind:
                result = PyType_GenericNew(Continue_type, NULL, NULL);
                if (!result) goto failed;
                break;
        }
        value = ast2obj_int(o->lineno);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "lineno", value) < 0)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_int(o->col_offset);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "col_offset", value) < 0)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_expr(void* _o)
{
        expr_ty o = (expr_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        switch (o->kind) {
        case BoolOp_kind:
                result = PyType_GenericNew(BoolOp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_boolop(o->v.BoolOp.op);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "op", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "values", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case BinOp_kind:
                result = PyType_GenericNew(BinOp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.BinOp.left);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "left", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_operator(o->v.BinOp.op);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "op", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.BinOp.right);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "right", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case UnaryOp_kind:
                result = PyType_GenericNew(UnaryOp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_unaryop(o->v.UnaryOp.op);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "op", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.UnaryOp.operand);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "operand", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Lambda_kind:
                result = PyType_GenericNew(Lambda_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_arguments(o->v.Lambda.args);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "args", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Lambda.body);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case IfExp_kind:
                result = PyType_GenericNew(IfExp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.IfExp.test);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "test", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.IfExp.body);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.IfExp.orelse);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "orelse", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Dict_kind:
                result = PyType_GenericNew(Dict_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Dict.keys, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "keys", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.Dict.values, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "values", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Set_kind:
                result = PyType_GenericNew(Set_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Set.elts, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "elts", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case ListComp_kind:
                result = PyType_GenericNew(ListComp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.ListComp.elt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "elt", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ListComp.generators,
                                     ast2obj_comprehension);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "generators", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case SetComp_kind:
                result = PyType_GenericNew(SetComp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.SetComp.elt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "elt", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.SetComp.generators,
                                     ast2obj_comprehension);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "generators", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case DictComp_kind:
                result = PyType_GenericNew(DictComp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.DictComp.key);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "key", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.DictComp.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.DictComp.generators,
                                     ast2obj_comprehension);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "generators", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case GeneratorExp_kind:
                result = PyType_GenericNew(GeneratorExp_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.GeneratorExp.elt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "elt", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.GeneratorExp.generators,
                                     ast2obj_comprehension);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "generators", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Yield_kind:
                result = PyType_GenericNew(Yield_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Yield.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Compare_kind:
                result = PyType_GenericNew(Compare_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Compare.left);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "left", value) == -1)
                        goto failed;
                Py_DECREF(value);
                {
                        int i, n = asdl_seq_LEN(o->v.Compare.ops);
                        value = PyList_New(n);
                        if (!value) goto failed;
                        for(i = 0; i < n; i++)
                                PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i)));
                }
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ops", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "comparators", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Call_kind:
                result = PyType_GenericNew(Call_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Call.func);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "func", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.Call.args, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "args", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "keywords", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Call.starargs);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "starargs", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Call.kwargs);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "kwargs", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Num_kind:
                result = PyType_GenericNew(Num_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_object(o->v.Num.n);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "n", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Str_kind:
                result = PyType_GenericNew(Str_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_string(o->v.Str.s);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "s", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Bytes_kind:
                result = PyType_GenericNew(Bytes_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_string(o->v.Bytes.s);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "s", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Ellipsis_kind:
                result = PyType_GenericNew(Ellipsis_type, NULL, NULL);
                if (!result) goto failed;
                break;
        case Attribute_kind:
                result = PyType_GenericNew(Attribute_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Attribute.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_identifier(o->v.Attribute.attr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "attr", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr_context(o->v.Attribute.ctx);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ctx", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Subscript_kind:
                result = PyType_GenericNew(Subscript_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Subscript.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_slice(o->v.Subscript.slice);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "slice", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr_context(o->v.Subscript.ctx);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ctx", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Starred_kind:
                result = PyType_GenericNew(Starred_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Starred.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr_context(o->v.Starred.ctx);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ctx", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Name_kind:
                result = PyType_GenericNew(Name_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_identifier(o->v.Name.id);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "id", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr_context(o->v.Name.ctx);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ctx", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case List_kind:
                result = PyType_GenericNew(List_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.List.elts, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "elts", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr_context(o->v.List.ctx);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ctx", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Tuple_kind:
                result = PyType_GenericNew(Tuple_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "elts", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr_context(o->v.Tuple.ctx);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "ctx", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        }
        value = ast2obj_int(o->lineno);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "lineno", value) < 0)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_int(o->col_offset);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "col_offset", value) < 0)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject* ast2obj_expr_context(expr_context_ty o)
{
        switch(o) {
                case Load:
                        Py_INCREF(Load_singleton);
                        return Load_singleton;
                case Store:
                        Py_INCREF(Store_singleton);
                        return Store_singleton;
                case Del:
                        Py_INCREF(Del_singleton);
                        return Del_singleton;
                case AugLoad:
                        Py_INCREF(AugLoad_singleton);
                        return AugLoad_singleton;
                case AugStore:
                        Py_INCREF(AugStore_singleton);
                        return AugStore_singleton;
                case Param:
                        Py_INCREF(Param_singleton);
                        return Param_singleton;
                default:
                        /* should never happen, but just in case ... */
                        PyErr_Format(PyExc_SystemError, "unknown expr_context found");
                        return NULL;
        }
}
PyObject*
ast2obj_slice(void* _o)
{
        slice_ty o = (slice_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        switch (o->kind) {
        case Slice_kind:
                result = PyType_GenericNew(Slice_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Slice.lower);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "lower", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Slice.upper);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "upper", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_expr(o->v.Slice.step);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "step", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case ExtSlice_kind:
                result = PyType_GenericNew(ExtSlice_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "dims", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        case Index_kind:
                result = PyType_GenericNew(Index_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.Index.value);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "value", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        }
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject* ast2obj_boolop(boolop_ty o)
{
        switch(o) {
                case And:
                        Py_INCREF(And_singleton);
                        return And_singleton;
                case Or:
                        Py_INCREF(Or_singleton);
                        return Or_singleton;
                default:
                        /* should never happen, but just in case ... */
                        PyErr_Format(PyExc_SystemError, "unknown boolop found");
                        return NULL;
        }
}
PyObject* ast2obj_operator(operator_ty o)
{
        switch(o) {
                case Add:
                        Py_INCREF(Add_singleton);
                        return Add_singleton;
                case Sub:
                        Py_INCREF(Sub_singleton);
                        return Sub_singleton;
                case Mult:
                        Py_INCREF(Mult_singleton);
                        return Mult_singleton;
                case Div:
                        Py_INCREF(Div_singleton);
                        return Div_singleton;
                case Mod:
                        Py_INCREF(Mod_singleton);
                        return Mod_singleton;
                case Pow:
                        Py_INCREF(Pow_singleton);
                        return Pow_singleton;
                case LShift:
                        Py_INCREF(LShift_singleton);
                        return LShift_singleton;
                case RShift:
                        Py_INCREF(RShift_singleton);
                        return RShift_singleton;
                case BitOr:
                        Py_INCREF(BitOr_singleton);
                        return BitOr_singleton;
                case BitXor:
                        Py_INCREF(BitXor_singleton);
                        return BitXor_singleton;
                case BitAnd:
                        Py_INCREF(BitAnd_singleton);
                        return BitAnd_singleton;
                case FloorDiv:
                        Py_INCREF(FloorDiv_singleton);
                        return FloorDiv_singleton;
                default:
                        /* should never happen, but just in case ... */
                        PyErr_Format(PyExc_SystemError, "unknown operator found");
                        return NULL;
        }
}
PyObject* ast2obj_unaryop(unaryop_ty o)
{
        switch(o) {
                case Invert:
                        Py_INCREF(Invert_singleton);
                        return Invert_singleton;
                case Not:
                        Py_INCREF(Not_singleton);
                        return Not_singleton;
                case UAdd:
                        Py_INCREF(UAdd_singleton);
                        return UAdd_singleton;
                case USub:
                        Py_INCREF(USub_singleton);
                        return USub_singleton;
                default:
                        /* should never happen, but just in case ... */
                        PyErr_Format(PyExc_SystemError, "unknown unaryop found");
                        return NULL;
        }
}
PyObject* ast2obj_cmpop(cmpop_ty o)
{
        switch(o) {
                case Eq:
                        Py_INCREF(Eq_singleton);
                        return Eq_singleton;
                case NotEq:
                        Py_INCREF(NotEq_singleton);
                        return NotEq_singleton;
                case Lt:
                        Py_INCREF(Lt_singleton);
                        return Lt_singleton;
                case LtE:
                        Py_INCREF(LtE_singleton);
                        return LtE_singleton;
                case Gt:
                        Py_INCREF(Gt_singleton);
                        return Gt_singleton;
                case GtE:
                        Py_INCREF(GtE_singleton);
                        return GtE_singleton;
                case Is:
                        Py_INCREF(Is_singleton);
                        return Is_singleton;
                case IsNot:
                        Py_INCREF(IsNot_singleton);
                        return IsNot_singleton;
                case In:
                        Py_INCREF(In_singleton);
                        return In_singleton;
                case NotIn:
                        Py_INCREF(NotIn_singleton);
                        return NotIn_singleton;
                default:
                        /* should never happen, but just in case ... */
                        PyErr_Format(PyExc_SystemError, "unknown cmpop found");
                        return NULL;
        }
}
PyObject*
ast2obj_comprehension(void* _o)
{
        comprehension_ty o = (comprehension_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        result = PyType_GenericNew(comprehension_type, NULL, NULL);
        if (!result) return NULL;
        value = ast2obj_expr(o->target);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "target", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_expr(o->iter);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "iter", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_list(o->ifs, ast2obj_expr);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "ifs", value) == -1)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_excepthandler(void* _o)
{
        excepthandler_ty o = (excepthandler_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        switch (o->kind) {
        case ExceptHandler_kind:
                result = PyType_GenericNew(ExceptHandler_type, NULL, NULL);
                if (!result) goto failed;
                value = ast2obj_expr(o->v.ExceptHandler.type);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "type", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_identifier(o->v.ExceptHandler.name);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "name", value) == -1)
                        goto failed;
                Py_DECREF(value);
                value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt);
                if (!value) goto failed;
                if (PyObject_SetAttrString(result, "body", value) == -1)
                        goto failed;
                Py_DECREF(value);
                break;
        }
        value = ast2obj_int(o->lineno);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "lineno", value) < 0)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_int(o->col_offset);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "col_offset", value) < 0)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_arguments(void* _o)
{
        arguments_ty o = (arguments_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        result = PyType_GenericNew(arguments_type, NULL, NULL);
        if (!result) return NULL;
        value = ast2obj_list(o->args, ast2obj_arg);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "args", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_identifier(o->vararg);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "vararg", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_expr(o->varargannotation);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "varargannotation", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_list(o->kwonlyargs, ast2obj_arg);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_identifier(o->kwarg);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "kwarg", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_expr(o->kwargannotation);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "kwargannotation", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_list(o->defaults, ast2obj_expr);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "defaults", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_list(o->kw_defaults, ast2obj_expr);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "kw_defaults", value) == -1)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_arg(void* _o)
{
        arg_ty o = (arg_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        result = PyType_GenericNew(arg_type, NULL, NULL);
        if (!result) return NULL;
        value = ast2obj_identifier(o->arg);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "arg", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_expr(o->annotation);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "annotation", value) == -1)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_keyword(void* _o)
{
        keyword_ty o = (keyword_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        result = PyType_GenericNew(keyword_type, NULL, NULL);
        if (!result) return NULL;
        value = ast2obj_identifier(o->arg);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "arg", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_expr(o->value);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "value", value) == -1)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}

PyObject*
ast2obj_alias(void* _o)
{
        alias_ty o = (alias_ty)_o;
        PyObject *result = NULL, *value = NULL;
        if (!o) {
                Py_INCREF(Py_None);
                return Py_None;
        }

        result = PyType_GenericNew(alias_type, NULL, NULL);
        if (!result) return NULL;
        value = ast2obj_identifier(o->name);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "name", value) == -1)
                goto failed;
        Py_DECREF(value);
        value = ast2obj_identifier(o->asname);
        if (!value) goto failed;
        if (PyObject_SetAttrString(result, "asname", value) == -1)
                goto failed;
        Py_DECREF(value);
        return result;
failed:
        Py_XDECREF(value);
        Py_XDECREF(result);
        return NULL;
}


int
obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;


        if (obj == Py_None) {
                *out = NULL;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Module_type)) {
                asdl_seq* body;

                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Module");
                        return 1;
                }
                *out = Module(body, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Interactive_type)) {
                asdl_seq* body;

                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Interactive");
                        return 1;
                }
                *out = Interactive(body, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Expression_type)) {
                expr_ty body;

                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &body, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Expression");
                        return 1;
                }
                *out = Expression(body, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Suite_type)) {
                asdl_seq* body;

                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Suite");
                        return 1;
                }
                *out = Suite(body, arena);
                if (*out == NULL) goto failed;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of mod, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        int lineno;
        int col_offset;

        if (obj == Py_None) {
                *out = NULL;
                return 0;
        }
        if (PyObject_HasAttrString(obj, "lineno")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "lineno");
                if (tmp == NULL) goto failed;
                res = obj2ast_int(tmp, &lineno, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "col_offset")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "col_offset");
                if (tmp == NULL) goto failed;
                res = obj2ast_int(tmp, &col_offset, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from stmt");
                return 1;
        }
        if (PyObject_IsInstance(obj, (PyObject*)FunctionDef_type)) {
                identifier name;
                arguments_ty args;
                asdl_seq* body;
                asdl_seq* decorator_list;
                expr_ty returns;

                if (PyObject_HasAttrString(obj, "name")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "name");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_identifier(tmp, &name, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "args")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "args");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_arguments(tmp, &args, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "decorator_list")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "decorator_list");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        decorator_list = asdl_seq_new(len, arena);
                        if (decorator_list == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(decorator_list, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "returns")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "returns");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &returns, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        returns = NULL;
                }
                *out = FunctionDef(name, args, body, decorator_list, returns,
                                   lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)ClassDef_type)) {
                identifier name;
                asdl_seq* bases;
                asdl_seq* keywords;
                expr_ty starargs;
                expr_ty kwargs;
                asdl_seq* body;
                asdl_seq* decorator_list;

                if (PyObject_HasAttrString(obj, "name")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "name");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_identifier(tmp, &name, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "bases")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "bases");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        bases = asdl_seq_new(len, arena);
                        if (bases == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(bases, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "keywords")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "keywords");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        keywords = asdl_seq_new(len, arena);
                        if (keywords == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                keyword_ty value;
                                res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(keywords, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "starargs")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "starargs");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &starargs, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        starargs = NULL;
                }
                if (PyObject_HasAttrString(obj, "kwargs")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "kwargs");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &kwargs, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        kwargs = NULL;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "decorator_list")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "decorator_list");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        decorator_list = asdl_seq_new(len, arena);
                        if (decorator_list == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(decorator_list, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from ClassDef");
                        return 1;
                }
                *out = ClassDef(name, bases, keywords, starargs, kwargs, body,
                                decorator_list, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Return_type)) {
                expr_ty value;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        value = NULL;
                }
                *out = Return(value, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Delete_type)) {
                asdl_seq* targets;

                if (PyObject_HasAttrString(obj, "targets")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "targets");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        targets = asdl_seq_new(len, arena);
                        if (targets == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(targets, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Delete");
                        return 1;
                }
                *out = Delete(targets, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Assign_type)) {
                asdl_seq* targets;
                expr_ty value;

                if (PyObject_HasAttrString(obj, "targets")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "targets");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        targets = asdl_seq_new(len, arena);
                        if (targets == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(targets, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Assign");
                        return 1;
                }
                *out = Assign(targets, value, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)AugAssign_type)) {
                expr_ty target;
                operator_ty op;
                expr_ty value;

                if (PyObject_HasAttrString(obj, "target")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "target");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &target, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "op")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "op");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_operator(tmp, &op, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AugAssign");
                        return 1;
                }
                *out = AugAssign(target, op, value, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)For_type)) {
                expr_ty target;
                expr_ty iter;
                asdl_seq* body;
                asdl_seq* orelse;

                if (PyObject_HasAttrString(obj, "target")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "target");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &target, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "iter")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "iter");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &iter, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "orelse")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "orelse");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        orelse = asdl_seq_new(len, arena);
                        if (orelse == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(orelse, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from For");
                        return 1;
                }
                *out = For(target, iter, body, orelse, lineno, col_offset,
                           arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)While_type)) {
                expr_ty test;
                asdl_seq* body;
                asdl_seq* orelse;

                if (PyObject_HasAttrString(obj, "test")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "test");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &test, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "orelse")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "orelse");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        orelse = asdl_seq_new(len, arena);
                        if (orelse == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(orelse, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from While");
                        return 1;
                }
                *out = While(test, body, orelse, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)If_type)) {
                expr_ty test;
                asdl_seq* body;
                asdl_seq* orelse;

                if (PyObject_HasAttrString(obj, "test")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "test");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &test, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "orelse")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "orelse");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        orelse = asdl_seq_new(len, arena);
                        if (orelse == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(orelse, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from If");
                        return 1;
                }
                *out = If(test, body, orelse, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)With_type)) {
                expr_ty context_expr;
                expr_ty optional_vars;
                asdl_seq* body;

                if (PyObject_HasAttrString(obj, "context_expr")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "context_expr");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &context_expr, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from With");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "optional_vars")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "optional_vars");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &optional_vars, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        optional_vars = NULL;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from With");
                        return 1;
                }
                *out = With(context_expr, optional_vars, body, lineno,
                            col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Raise_type)) {
                expr_ty exc;
                expr_ty cause;

                if (PyObject_HasAttrString(obj, "exc")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "exc");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &exc, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        exc = NULL;
                }
                if (PyObject_HasAttrString(obj, "cause")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "cause");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &cause, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        cause = NULL;
                }
                *out = Raise(exc, cause, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)TryExcept_type)) {
                asdl_seq* body;
                asdl_seq* handlers;
                asdl_seq* orelse;

                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "TryExcept field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryExcept");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "handlers")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "handlers");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "TryExcept field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        handlers = asdl_seq_new(len, arena);
                        if (handlers == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                excepthandler_ty value;
                                res = obj2ast_excepthandler(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(handlers, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from TryExcept");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "orelse")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "orelse");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "TryExcept field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        orelse = asdl_seq_new(len, arena);
                        if (orelse == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(orelse, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from TryExcept");
                        return 1;
                }
                *out = TryExcept(body, handlers, orelse, lineno, col_offset,
                                 arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)TryFinally_type)) {
                asdl_seq* body;
                asdl_seq* finalbody;

                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "TryFinally field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from TryFinally");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "finalbody")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "finalbody");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "TryFinally field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        finalbody = asdl_seq_new(len, arena);
                        if (finalbody == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(finalbody, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"finalbody\" missing from TryFinally");
                        return 1;
                }
                *out = TryFinally(body, finalbody, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Assert_type)) {
                expr_ty test;
                expr_ty msg;

                if (PyObject_HasAttrString(obj, "test")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "test");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &test, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "msg")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "msg");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &msg, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        msg = NULL;
                }
                *out = Assert(test, msg, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Import_type)) {
                asdl_seq* names;

                if (PyObject_HasAttrString(obj, "names")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "names");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        names = asdl_seq_new(len, arena);
                        if (names == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                alias_ty value;
                                res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(names, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Import");
                        return 1;
                }
                *out = Import(names, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)ImportFrom_type)) {
                identifier module;
                asdl_seq* names;
                int level;

                if (PyObject_HasAttrString(obj, "module")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "module");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_identifier(tmp, &module, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"module\" missing from ImportFrom");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "names")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "names");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        names = asdl_seq_new(len, arena);
                        if (names == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                alias_ty value;
                                res = obj2ast_alias(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(names, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "level")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "level");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_int(tmp, &level, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        level = 0;
                }
                *out = ImportFrom(module, names, level, lineno, col_offset,
                                  arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Global_type)) {
                asdl_seq* names;

                if (PyObject_HasAttrString(obj, "names")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "names");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        names = asdl_seq_new(len, arena);
                        if (names == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                identifier value;
                                res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(names, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Global");
                        return 1;
                }
                *out = Global(names, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Nonlocal_type)) {
                asdl_seq* names;

                if (PyObject_HasAttrString(obj, "names")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "names");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        names = asdl_seq_new(len, arena);
                        if (names == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                identifier value;
                                res = obj2ast_identifier(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(names, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from Nonlocal");
                        return 1;
                }
                *out = Nonlocal(names, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Expr_type)) {
                expr_ty value;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Expr");
                        return 1;
                }
                *out = Expr(value, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Pass_type)) {

                *out = Pass(lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Break_type)) {

                *out = Break(lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Continue_type)) {

                *out = Continue(lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of stmt, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_expr(PyObject* obj, expr_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        int lineno;
        int col_offset;

        if (obj == Py_None) {
                *out = NULL;
                return 0;
        }
        if (PyObject_HasAttrString(obj, "lineno")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "lineno");
                if (tmp == NULL) goto failed;
                res = obj2ast_int(tmp, &lineno, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "col_offset")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "col_offset");
                if (tmp == NULL) goto failed;
                res = obj2ast_int(tmp, &col_offset, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from expr");
                return 1;
        }
        if (PyObject_IsInstance(obj, (PyObject*)BoolOp_type)) {
                boolop_ty op;
                asdl_seq* values;

                if (PyObject_HasAttrString(obj, "op")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "op");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_boolop(tmp, &op, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "values")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "values");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        values = asdl_seq_new(len, arena);
                        if (values == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(values, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from BoolOp");
                        return 1;
                }
                *out = BoolOp(op, values, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)BinOp_type)) {
                expr_ty left;
                operator_ty op;
                expr_ty right;

                if (PyObject_HasAttrString(obj, "left")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "left");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &left, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "op")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "op");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_operator(tmp, &op, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "right")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "right");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &right, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"right\" missing from BinOp");
                        return 1;
                }
                *out = BinOp(left, op, right, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)UnaryOp_type)) {
                unaryop_ty op;
                expr_ty operand;

                if (PyObject_HasAttrString(obj, "op")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "op");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_unaryop(tmp, &op, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "operand")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "operand");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &operand, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"operand\" missing from UnaryOp");
                        return 1;
                }
                *out = UnaryOp(op, operand, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Lambda_type)) {
                arguments_ty args;
                expr_ty body;

                if (PyObject_HasAttrString(obj, "args")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "args");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_arguments(tmp, &args, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &body, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Lambda");
                        return 1;
                }
                *out = Lambda(args, body, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)IfExp_type)) {
                expr_ty test;
                expr_ty body;
                expr_ty orelse;

                if (PyObject_HasAttrString(obj, "test")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "test");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &test, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &body, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "orelse")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "orelse");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &orelse, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from IfExp");
                        return 1;
                }
                *out = IfExp(test, body, orelse, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Dict_type)) {
                asdl_seq* keys;
                asdl_seq* values;

                if (PyObject_HasAttrString(obj, "keys")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "keys");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        keys = asdl_seq_new(len, arena);
                        if (keys == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(keys, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "values")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "values");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        values = asdl_seq_new(len, arena);
                        if (values == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(values, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"values\" missing from Dict");
                        return 1;
                }
                *out = Dict(keys, values, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Set_type)) {
                asdl_seq* elts;

                if (PyObject_HasAttrString(obj, "elts")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "elts");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        elts = asdl_seq_new(len, arena);
                        if (elts == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(elts, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Set");
                        return 1;
                }
                *out = Set(elts, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)ListComp_type)) {
                expr_ty elt;
                asdl_seq* generators;

                if (PyObject_HasAttrString(obj, "elt")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "elt");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &elt, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "generators")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "generators");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        generators = asdl_seq_new(len, arena);
                        if (generators == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                comprehension_ty value;
                                res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(generators, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from ListComp");
                        return 1;
                }
                *out = ListComp(elt, generators, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)SetComp_type)) {
                expr_ty elt;
                asdl_seq* generators;

                if (PyObject_HasAttrString(obj, "elt")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "elt");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &elt, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "generators")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "generators");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        generators = asdl_seq_new(len, arena);
                        if (generators == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                comprehension_ty value;
                                res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(generators, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from SetComp");
                        return 1;
                }
                *out = SetComp(elt, generators, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)DictComp_type)) {
                expr_ty key;
                expr_ty value;
                asdl_seq* generators;

                if (PyObject_HasAttrString(obj, "key")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "key");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &key, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "generators")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "generators");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        generators = asdl_seq_new(len, arena);
                        if (generators == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                comprehension_ty value;
                                res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(generators, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from DictComp");
                        return 1;
                }
                *out = DictComp(key, value, generators, lineno, col_offset,
                                arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)GeneratorExp_type)) {
                expr_ty elt;
                asdl_seq* generators;

                if (PyObject_HasAttrString(obj, "elt")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "elt");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &elt, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "generators")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "generators");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        generators = asdl_seq_new(len, arena);
                        if (generators == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                comprehension_ty value;
                                res = obj2ast_comprehension(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(generators, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"generators\" missing from GeneratorExp");
                        return 1;
                }
                *out = GeneratorExp(elt, generators, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Yield_type)) {
                expr_ty value;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        value = NULL;
                }
                *out = Yield(value, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Compare_type)) {
                expr_ty left;
                asdl_int_seq* ops;
                asdl_seq* comparators;

                if (PyObject_HasAttrString(obj, "left")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "left");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &left, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ops")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "ops");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        ops = asdl_int_seq_new(len, arena);
                        if (ops == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                cmpop_ty value;
                                res = obj2ast_cmpop(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(ops, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "comparators")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "comparators");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        comparators = asdl_seq_new(len, arena);
                        if (comparators == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(comparators, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"comparators\" missing from Compare");
                        return 1;
                }
                *out = Compare(left, ops, comparators, lineno, col_offset,
                               arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Call_type)) {
                expr_ty func;
                asdl_seq* args;
                asdl_seq* keywords;
                expr_ty starargs;
                expr_ty kwargs;

                if (PyObject_HasAttrString(obj, "func")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "func");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &func, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "args")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "args");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        args = asdl_seq_new(len, arena);
                        if (args == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(args, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "keywords")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "keywords");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        keywords = asdl_seq_new(len, arena);
                        if (keywords == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                keyword_ty value;
                                res = obj2ast_keyword(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(keywords, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "starargs")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "starargs");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &starargs, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        starargs = NULL;
                }
                if (PyObject_HasAttrString(obj, "kwargs")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "kwargs");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &kwargs, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        kwargs = NULL;
                }
                *out = Call(func, args, keywords, starargs, kwargs, lineno,
                            col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Num_type)) {
                object n;

                if (PyObject_HasAttrString(obj, "n")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "n");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_object(tmp, &n, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"n\" missing from Num");
                        return 1;
                }
                *out = Num(n, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Str_type)) {
                string s;

                if (PyObject_HasAttrString(obj, "s")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "s");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_string(tmp, &s, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Str");
                        return 1;
                }
                *out = Str(s, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Bytes_type)) {
                string s;

                if (PyObject_HasAttrString(obj, "s")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "s");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_string(tmp, &s, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"s\" missing from Bytes");
                        return 1;
                }
                *out = Bytes(s, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Ellipsis_type)) {

                *out = Ellipsis(lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Attribute_type)) {
                expr_ty value;
                identifier attr;
                expr_context_ty ctx;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "attr")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "attr");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_identifier(tmp, &attr, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ctx")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "ctx");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr_context(tmp, &ctx, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Attribute");
                        return 1;
                }
                *out = Attribute(value, attr, ctx, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Subscript_type)) {
                expr_ty value;
                slice_ty slice;
                expr_context_ty ctx;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "slice")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "slice");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_slice(tmp, &slice, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ctx")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "ctx");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr_context(tmp, &ctx, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Subscript");
                        return 1;
                }
                *out = Subscript(value, slice, ctx, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Starred_type)) {
                expr_ty value;
                expr_context_ty ctx;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ctx")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "ctx");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr_context(tmp, &ctx, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Starred");
                        return 1;
                }
                *out = Starred(value, ctx, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Name_type)) {
                identifier id;
                expr_context_ty ctx;

                if (PyObject_HasAttrString(obj, "id")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "id");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_identifier(tmp, &id, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ctx")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "ctx");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr_context(tmp, &ctx, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Name");
                        return 1;
                }
                *out = Name(id, ctx, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)List_type)) {
                asdl_seq* elts;
                expr_context_ty ctx;

                if (PyObject_HasAttrString(obj, "elts")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "elts");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        elts = asdl_seq_new(len, arena);
                        if (elts == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(elts, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ctx")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "ctx");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr_context(tmp, &ctx, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from List");
                        return 1;
                }
                *out = List(elts, ctx, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Tuple_type)) {
                asdl_seq* elts;
                expr_context_ty ctx;

                if (PyObject_HasAttrString(obj, "elts")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "elts");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        elts = asdl_seq_new(len, arena);
                        if (elts == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                expr_ty value;
                                res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(elts, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple");
                        return 1;
                }
                if (PyObject_HasAttrString(obj, "ctx")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "ctx");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr_context(tmp, &ctx, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"ctx\" missing from Tuple");
                        return 1;
                }
                *out = Tuple(elts, ctx, lineno, col_offset, arena);
                if (*out == NULL) goto failed;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of expr, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_expr_context(PyObject* obj, expr_context_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        if (PyObject_IsInstance(obj, (PyObject*)Load_type)) {
                *out = Load;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Store_type)) {
                *out = Store;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Del_type)) {
                *out = Del;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)AugLoad_type)) {
                *out = AugLoad;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)AugStore_type)) {
                *out = AugStore;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Param_type)) {
                *out = Param;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of expr_context, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_slice(PyObject* obj, slice_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;


        if (obj == Py_None) {
                *out = NULL;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Slice_type)) {
                expr_ty lower;
                expr_ty upper;
                expr_ty step;

                if (PyObject_HasAttrString(obj, "lower")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "lower");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &lower, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        lower = NULL;
                }
                if (PyObject_HasAttrString(obj, "upper")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "upper");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &upper, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        upper = NULL;
                }
                if (PyObject_HasAttrString(obj, "step")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "step");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &step, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        step = NULL;
                }
                *out = Slice(lower, upper, step, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)ExtSlice_type)) {
                asdl_seq* dims;

                if (PyObject_HasAttrString(obj, "dims")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "dims");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        dims = asdl_seq_new(len, arena);
                        if (dims == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                slice_ty value;
                                res = obj2ast_slice(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(dims, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"dims\" missing from ExtSlice");
                        return 1;
                }
                *out = ExtSlice(dims, arena);
                if (*out == NULL) goto failed;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Index_type)) {
                expr_ty value;

                if (PyObject_HasAttrString(obj, "value")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "value");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &value, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Index");
                        return 1;
                }
                *out = Index(value, arena);
                if (*out == NULL) goto failed;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of slice, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_boolop(PyObject* obj, boolop_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        if (PyObject_IsInstance(obj, (PyObject*)And_type)) {
                *out = And;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Or_type)) {
                *out = Or;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of boolop, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        if (PyObject_IsInstance(obj, (PyObject*)Add_type)) {
                *out = Add;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Sub_type)) {
                *out = Sub;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Mult_type)) {
                *out = Mult;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Div_type)) {
                *out = Div;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Mod_type)) {
                *out = Mod;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Pow_type)) {
                *out = Pow;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)LShift_type)) {
                *out = LShift;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)RShift_type)) {
                *out = RShift;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)BitOr_type)) {
                *out = BitOr;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)BitXor_type)) {
                *out = BitXor;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)BitAnd_type)) {
                *out = BitAnd;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)FloorDiv_type)) {
                *out = FloorDiv;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of operator, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_unaryop(PyObject* obj, unaryop_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        if (PyObject_IsInstance(obj, (PyObject*)Invert_type)) {
                *out = Invert;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Not_type)) {
                *out = Not;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)UAdd_type)) {
                *out = UAdd;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)USub_type)) {
                *out = USub;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of unaryop, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_cmpop(PyObject* obj, cmpop_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        if (PyObject_IsInstance(obj, (PyObject*)Eq_type)) {
                *out = Eq;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)NotEq_type)) {
                *out = NotEq;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Lt_type)) {
                *out = Lt;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)LtE_type)) {
                *out = LtE;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Gt_type)) {
                *out = Gt;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)GtE_type)) {
                *out = GtE;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)Is_type)) {
                *out = Is;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)IsNot_type)) {
                *out = IsNot;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)In_type)) {
                *out = In;
                return 0;
        }
        if (PyObject_IsInstance(obj, (PyObject*)NotIn_type)) {
                *out = NotIn;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of cmpop, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_comprehension(PyObject* obj, comprehension_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;
        expr_ty target;
        expr_ty iter;
        asdl_seq* ifs;

        if (PyObject_HasAttrString(obj, "target")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "target");
                if (tmp == NULL) goto failed;
                res = obj2ast_expr(tmp, &target, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "iter")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "iter");
                if (tmp == NULL) goto failed;
                res = obj2ast_expr(tmp, &iter, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "ifs")) {
                int res;
                Py_ssize_t len;
                Py_ssize_t i;
                tmp = PyObject_GetAttrString(obj, "ifs");
                if (tmp == NULL) goto failed;
                if (!PyList_Check(tmp)) {
                        PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                        goto failed;
                }
                len = PyList_GET_SIZE(tmp);
                ifs = asdl_seq_new(len, arena);
                if (ifs == NULL) goto failed;
                for (i = 0; i < len; i++) {
                        expr_ty value;
                        res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                        if (res != 0) goto failed;
                        asdl_seq_SET(ifs, i, value);
                }
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"ifs\" missing from comprehension");
                return 1;
        }
        *out = comprehension(target, iter, ifs, arena);
        return 0;
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_excepthandler(PyObject* obj, excepthandler_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;

        int lineno;
        int col_offset;

        if (obj == Py_None) {
                *out = NULL;
                return 0;
        }
        if (PyObject_HasAttrString(obj, "lineno")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "lineno");
                if (tmp == NULL) goto failed;
                res = obj2ast_int(tmp, &lineno, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "col_offset")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "col_offset");
                if (tmp == NULL) goto failed;
                res = obj2ast_int(tmp, &col_offset, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"col_offset\" missing from excepthandler");
                return 1;
        }
        if (PyObject_IsInstance(obj, (PyObject*)ExceptHandler_type)) {
                expr_ty type;
                identifier name;
                asdl_seq* body;

                if (PyObject_HasAttrString(obj, "type")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "type");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_expr(tmp, &type, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        type = NULL;
                }
                if (PyObject_HasAttrString(obj, "name")) {
                        int res;
                        tmp = PyObject_GetAttrString(obj, "name");
                        if (tmp == NULL) goto failed;
                        res = obj2ast_identifier(tmp, &name, arena);
                        if (res != 0) goto failed;
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        name = NULL;
                }
                if (PyObject_HasAttrString(obj, "body")) {
                        int res;
                        Py_ssize_t len;
                        Py_ssize_t i;
                        tmp = PyObject_GetAttrString(obj, "body");
                        if (tmp == NULL) goto failed;
                        if (!PyList_Check(tmp)) {
                                PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                                goto failed;
                        }
                        len = PyList_GET_SIZE(tmp);
                        body = asdl_seq_new(len, arena);
                        if (body == NULL) goto failed;
                        for (i = 0; i < len; i++) {
                                stmt_ty value;
                                res = obj2ast_stmt(PyList_GET_ITEM(tmp, i), &value, arena);
                                if (res != 0) goto failed;
                                asdl_seq_SET(body, i, value);
                        }
                        Py_XDECREF(tmp);
                        tmp = NULL;
                } else {
                        PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ExceptHandler");
                        return 1;
                }
                *out = ExceptHandler(type, name, body, lineno, col_offset,
                                     arena);
                if (*out == NULL) goto failed;
                return 0;
        }

        tmp = PyObject_Repr(obj);
        if (tmp == NULL) goto failed;
        PyErr_Format(PyExc_TypeError, "expected some sort of excepthandler, but got %.400s", PyBytes_AS_STRING(tmp));
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_arguments(PyObject* obj, arguments_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;
        asdl_seq* args;
        identifier vararg;
        expr_ty varargannotation;
        asdl_seq* kwonlyargs;
        identifier kwarg;
        expr_ty kwargannotation;
        asdl_seq* defaults;
        asdl_seq* kw_defaults;

        if (PyObject_HasAttrString(obj, "args")) {
                int res;
                Py_ssize_t len;
                Py_ssize_t i;
                tmp = PyObject_GetAttrString(obj, "args");
                if (tmp == NULL) goto failed;
                if (!PyList_Check(tmp)) {
                        PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                        goto failed;
                }
                len = PyList_GET_SIZE(tmp);
                args = asdl_seq_new(len, arena);
                if (args == NULL) goto failed;
                for (i = 0; i < len; i++) {
                        arg_ty value;
                        res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &value, arena);
                        if (res != 0) goto failed;
                        asdl_seq_SET(args, i, value);
                }
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "vararg")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "vararg");
                if (tmp == NULL) goto failed;
                res = obj2ast_identifier(tmp, &vararg, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                vararg = NULL;
        }
        if (PyObject_HasAttrString(obj, "varargannotation")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "varargannotation");
                if (tmp == NULL) goto failed;
                res = obj2ast_expr(tmp, &varargannotation, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                varargannotation = NULL;
        }
        if (PyObject_HasAttrString(obj, "kwonlyargs")) {
                int res;
                Py_ssize_t len;
                Py_ssize_t i;
                tmp = PyObject_GetAttrString(obj, "kwonlyargs");
                if (tmp == NULL) goto failed;
                if (!PyList_Check(tmp)) {
                        PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                        goto failed;
                }
                len = PyList_GET_SIZE(tmp);
                kwonlyargs = asdl_seq_new(len, arena);
                if (kwonlyargs == NULL) goto failed;
                for (i = 0; i < len; i++) {
                        arg_ty value;
                        res = obj2ast_arg(PyList_GET_ITEM(tmp, i), &value, arena);
                        if (res != 0) goto failed;
                        asdl_seq_SET(kwonlyargs, i, value);
                }
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "kwarg")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "kwarg");
                if (tmp == NULL) goto failed;
                res = obj2ast_identifier(tmp, &kwarg, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                kwarg = NULL;
        }
        if (PyObject_HasAttrString(obj, "kwargannotation")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "kwargannotation");
                if (tmp == NULL) goto failed;
                res = obj2ast_expr(tmp, &kwargannotation, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                kwargannotation = NULL;
        }
        if (PyObject_HasAttrString(obj, "defaults")) {
                int res;
                Py_ssize_t len;
                Py_ssize_t i;
                tmp = PyObject_GetAttrString(obj, "defaults");
                if (tmp == NULL) goto failed;
                if (!PyList_Check(tmp)) {
                        PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                        goto failed;
                }
                len = PyList_GET_SIZE(tmp);
                defaults = asdl_seq_new(len, arena);
                if (defaults == NULL) goto failed;
                for (i = 0; i < len; i++) {
                        expr_ty value;
                        res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                        if (res != 0) goto failed;
                        asdl_seq_SET(defaults, i, value);
                }
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "kw_defaults")) {
                int res;
                Py_ssize_t len;
                Py_ssize_t i;
                tmp = PyObject_GetAttrString(obj, "kw_defaults");
                if (tmp == NULL) goto failed;
                if (!PyList_Check(tmp)) {
                        PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name);
                        goto failed;
                }
                len = PyList_GET_SIZE(tmp);
                kw_defaults = asdl_seq_new(len, arena);
                if (kw_defaults == NULL) goto failed;
                for (i = 0; i < len; i++) {
                        expr_ty value;
                        res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &value, arena);
                        if (res != 0) goto failed;
                        asdl_seq_SET(kw_defaults, i, value);
                }
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"kw_defaults\" missing from arguments");
                return 1;
        }
        *out = arguments(args, vararg, varargannotation, kwonlyargs, kwarg,
                         kwargannotation, defaults, kw_defaults, arena);
        return 0;
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;
        identifier arg;
        expr_ty annotation;

        if (PyObject_HasAttrString(obj, "arg")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "arg");
                if (tmp == NULL) goto failed;
                res = obj2ast_identifier(tmp, &arg, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "annotation")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "annotation");
                if (tmp == NULL) goto failed;
                res = obj2ast_expr(tmp, &annotation, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                annotation = NULL;
        }
        *out = arg(arg, annotation, arena);
        return 0;
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;
        identifier arg;
        expr_ty value;

        if (PyObject_HasAttrString(obj, "arg")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "arg");
                if (tmp == NULL) goto failed;
                res = obj2ast_identifier(tmp, &arg, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "value")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "value");
                if (tmp == NULL) goto failed;
                res = obj2ast_expr(tmp, &value, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from keyword");
                return 1;
        }
        *out = keyword(arg, value, arena);
        return 0;
failed:
        Py_XDECREF(tmp);
        return 1;
}

int
obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena)
{
        PyObject* tmp = NULL;
        identifier name;
        identifier asname;

        if (PyObject_HasAttrString(obj, "name")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "name");
                if (tmp == NULL) goto failed;
                res = obj2ast_identifier(tmp, &name, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias");
                return 1;
        }
        if (PyObject_HasAttrString(obj, "asname")) {
                int res;
                tmp = PyObject_GetAttrString(obj, "asname");
                if (tmp == NULL) goto failed;
                res = obj2ast_identifier(tmp, &asname, arena);
                if (res != 0) goto failed;
                Py_XDECREF(tmp);
                tmp = NULL;
        } else {
                asname = NULL;
        }
        *out = alias(name, asname, arena);
        return 0;
failed:
        Py_XDECREF(tmp);
        return 1;
}


static struct PyModuleDef _astmodule = {
  PyModuleDef_HEAD_INIT, "_ast"
};
PyMODINIT_FUNC
PyInit__ast(void)
{
        PyObject *m, *d;
        if (!init_types()) return NULL;
        m = PyModule_Create(&_astmodule);
        if (!m) return NULL;
        d = PyModule_GetDict(m);
        if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return
            NULL;
        if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
                return NULL;
        if (PyModule_AddStringConstant(m, "__version__", "62078") < 0)
                return NULL;
        if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Interactive", (PyObject*)Interactive_type)
            < 0) return NULL;
        if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "FunctionDef", (PyObject*)FunctionDef_type)
            < 0) return NULL;
        if (PyDict_SetItemString(d, "ClassDef", (PyObject*)ClassDef_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Return", (PyObject*)Return_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Delete", (PyObject*)Delete_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Assign", (PyObject*)Assign_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "AugAssign", (PyObject*)AugAssign_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "For", (PyObject*)For_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "While", (PyObject*)While_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "If", (PyObject*)If_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "With", (PyObject*)With_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Raise", (PyObject*)Raise_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "TryExcept", (PyObject*)TryExcept_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "TryFinally", (PyObject*)TryFinally_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "Assert", (PyObject*)Assert_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Import", (PyObject*)Import_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "ImportFrom", (PyObject*)ImportFrom_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "Global", (PyObject*)Global_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Nonlocal", (PyObject*)Nonlocal_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Expr", (PyObject*)Expr_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Pass", (PyObject*)Pass_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Break", (PyObject*)Break_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Continue", (PyObject*)Continue_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "expr", (PyObject*)expr_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Lambda", (PyObject*)Lambda_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "IfExp", (PyObject*)IfExp_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Dict", (PyObject*)Dict_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Set", (PyObject*)Set_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "ListComp", (PyObject*)ListComp_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "SetComp", (PyObject*)SetComp_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "DictComp", (PyObject*)DictComp_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "GeneratorExp",
            (PyObject*)GeneratorExp_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "Yield", (PyObject*)Yield_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Compare", (PyObject*)Compare_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Call", (PyObject*)Call_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Num", (PyObject*)Num_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Str", (PyObject*)Str_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Bytes", (PyObject*)Bytes_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Ellipsis", (PyObject*)Ellipsis_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Attribute", (PyObject*)Attribute_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "expr_context",
            (PyObject*)expr_context_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "Load", (PyObject*)Load_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Store", (PyObject*)Store_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Del", (PyObject*)Del_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "AugLoad", (PyObject*)AugLoad_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "AugStore", (PyObject*)AugStore_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Param", (PyObject*)Param_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "slice", (PyObject*)slice_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Slice", (PyObject*)Slice_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "ExtSlice", (PyObject*)ExtSlice_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Index", (PyObject*)Index_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "boolop", (PyObject*)boolop_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "And", (PyObject*)And_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Or", (PyObject*)Or_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "operator", (PyObject*)operator_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "LShift", (PyObject*)LShift_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "RShift", (PyObject*)RShift_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "BitOr", (PyObject*)BitOr_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "BitXor", (PyObject*)BitXor_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "BitAnd", (PyObject*)BitAnd_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "FloorDiv", (PyObject*)FloorDiv_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "unaryop", (PyObject*)unaryop_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Invert", (PyObject*)Invert_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "Not", (PyObject*)Not_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "UAdd", (PyObject*)UAdd_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "USub", (PyObject*)USub_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "cmpop", (PyObject*)cmpop_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Eq", (PyObject*)Eq_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "NotEq", (PyObject*)NotEq_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Lt", (PyObject*)Lt_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "LtE", (PyObject*)LtE_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Gt", (PyObject*)Gt_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "GtE", (PyObject*)GtE_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "Is", (PyObject*)Is_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "IsNot", (PyObject*)IsNot_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "In", (PyObject*)In_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "NotIn", (PyObject*)NotIn_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "comprehension",
            (PyObject*)comprehension_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "excepthandler",
            (PyObject*)excepthandler_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "ExceptHandler",
            (PyObject*)ExceptHandler_type) < 0) return NULL;
        if (PyDict_SetItemString(d, "arguments", (PyObject*)arguments_type) <
            0) return NULL;
        if (PyDict_SetItemString(d, "arg", (PyObject*)arg_type) < 0) return
            NULL;
        if (PyDict_SetItemString(d, "keyword", (PyObject*)keyword_type) < 0)
            return NULL;
        if (PyDict_SetItemString(d, "alias", (PyObject*)alias_type) < 0) return
            NULL;
        return m;
}


PyObject* PyAST_mod2obj(mod_ty t)
{
    init_types();
    return ast2obj_mod(t);
}

/* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */
mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode)
{
    mod_ty res;
    PyObject *req_type[] = {(PyObject*)Module_type, (PyObject*)Expression_type,
                            (PyObject*)Interactive_type};
    char *req_name[] = {"Module", "Expression", "Interactive"};
    assert(0 <= mode && mode <= 2);

    init_types();

    if (!PyObject_IsInstance(ast, req_type[mode])) {
        PyErr_Format(PyExc_TypeError, "expected %s node, got %.400s",
                     req_name[mode], Py_TYPE(ast)->tp_name);
        return NULL;
    }
    if (obj2ast_mod(ast, &res, arena) != 0)
        return NULL;
    else
        return res;
}

int PyAST_Check(PyObject* obj)
{
    init_types();
    return PyObject_IsInstance(obj, (PyObject*)&AST_type);
}


ew the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page accelerators.html
+ \title Standard Accelerator Keys
+ \ingroup gui-programming
+
+ Applications invariably need to define accelerator keys for actions.
+ Qt fully supports accelerators, for example with \l Q3Accel::shortcutKey().
+
+ Here are Microsoft's recommendations for accelerator keys, with
+ comments about the Open Group's recommendations where they exist
+ and differ. For most commands, the Open Group either has no advice or
+ agrees with Microsoft.
+
+ The emboldened letter plus Alt is Microsoft's recommended choice, and
+ we recommend supporting it. For an Apply button, for example, we
+ recommend QAbstractButton::setText(\link QWidget::tr() tr \endlink("&Apply"));
+
+ If you have conflicting commands (e.g. About and Apply buttons in the
+ same dialog), you must decide for yourself.
+
+ \list
+ \i \bold{\underline{A}}bout
+ \i Always on \bold{\underline{T}}op
+ \i \bold{\underline{A}}pply
+ \i \bold{\underline{B}}ack
+ \i \bold{\underline{B}}rowse
+ \i \bold{\underline{C}}lose (CDE: Alt+F4; Alt+F4 is "close window" in Windows)
+ \i \bold{\underline{C}}opy (CDE: Ctrl+C, Ctrl+Insert)
+ \i \bold{\underline{C}}opy Here
+ \i Create \bold{\underline{S}}hortcut
+ \i Create \bold{\underline{S}}hortcut Here
+ \i Cu\bold{\underline{t}}
+ \i \bold{\underline{D}}elete
+ \i \bold{\underline{E}}dit
+ \i \bold{\underline{E}}xit (CDE: E\bold{\underline{x}}it)
+ \i \bold{\underline{E}}xplore
+ \i \bold{\underline{F}}ile
+ \i \bold{\underline{F}}ind
+ \i \bold{\underline{H}}elp
+ \i Help \bold{\underline{T}}opics
+ \i \bold{\underline{H}}ide
+ \i \bold{\underline{I}}nsert
+ \i Insert \bold{\underline{O}}bject
+ \i \bold{\underline{L}}ink Here
+ \i Ma\bold{\underline{x}}imize
+ \i Mi\bold{\underline{n}}imize
+ \i \bold{\underline{M}}ove
+ \i \bold{\underline{M}}ove Here
+ \i \bold{\underline{N}}ew
+ \i \bold{\underline{N}}ext
+ \i \bold{\underline{N}}o
+ \i \bold{\underline{O}}pen
+ \i Open \bold{\underline{W}}ith
+ \i Page Set\bold{\underline{u}}p
+ \i \bold{\underline{P}}aste
+ \i Paste \bold{\underline{L}}ink
+ \i Paste \bold{\underline{S}}hortcut
+ \i Paste \bold{\underline{S}}pecial
+ \i \bold{\underline{P}}ause
+ \i \bold{\underline{P}}lay
+ \i \bold{\underline{P}}rint
+ \i \bold{\underline{P}}rint Here
+ \i P\bold{\underline{r}}operties
+ \i \bold{\underline{Q}}uick View
+ \i \bold{\underline{R}}edo (CDE: Ctrl+Y, Shift+Alt+Backspace)
+ \i \bold{\underline{R}}epeat
+ \i \bold{\underline{R}}estore
+ \i \bold{\underline{R}}esume
+ \i \bold{\underline{R}}etry
+ \i \bold{\underline{R}}un
+ \i \bold{\underline{S}}ave
+ \i Save \bold{\underline{A}}s
+ \i Select \bold{\underline{A}}ll
+ \i Se\bold{\underline{n}}d To
+ \i \bold{\underline{S}}how
+ \i \bold{\underline{S}}ize
+ \i S\bold{\underline{p}}lit
+ \i \bold{\underline{S}}top
+ \i \bold{\underline{U}}ndo (CDE: Ctrl+Z or Alt+Backspace)
+ \i \bold{\underline{V}}iew
+ \i \bold{\underline{W}}hat's This?
+ \i \bold{\underline{W}}indow
+ \i \bold{\underline{Y}}es
+ \endlist
+
+ There are also a lot of other keys and actions (that use other
+ modifier keys than Alt). See the Microsoft and The Open Group
+ documentation for details.
+
+ The
+ \l{http://www.amazon.com/exec/obidos/ASIN/0735605661/trolltech/t}{Microsoft book}
+ has ISBN 0735605661. The corresponding Open Group
+ book is very hard to find, rather expensive and we cannot recommend
+ it. However, if you really want it, ogpubs@opengroup.org might be able
+ to help. Ask them for ISBN 1859121047.
+*/
diff --git a/doc/src/accessible.qdoc b/doc/src/accessible.qdoc
new file mode 100644
index 0000000..090da86
--- /dev/null
+++ b/doc/src/accessible.qdoc
@@ -0,0 +1,600 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page accessible.html
+ \title Accessibility
+ \ingroup accessibility
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ Accessibility in computer software is making applications usable
+ for people with disabilities. This could be achieved by providing
+ keyboard shortcuts, a high-contrast user interface that uses
+ specially selected colors and fonts, or support for assistive tools
+ such as screen readers and braille displays.
+
+ An application does not usually communicate directly with
+ assistive tools but through an assistive technology, which is a
+ bridge for exchange of information between the applications and
+ the tools. Information about user interface elements, such
+ as buttons and scroll bars, is exposed to the assistive technologies.
+ Qt supports Microsoft Active Accessibility (MSAA) on Windows and
+ Mac OS X Accessibility on Mac OS X.
+ On Unix/X11, support is preliminary. The individual technologies
+ are abstracted from Qt, and there is only a single interface to
+ consider. We will use MSAA throughout this document when we need
+ to address technology related issues.
+
+ In this overview document, we will examine the overall Qt
+ accessibility architecture, and how to implement accessibility for
+ custom widgets and elements.
+
+ \section1 Architecture
+
+ Providing accessibility is a collaboration between accessibility
+ compliant applications, the assistive technology, and the
+ assistive tools.
+
+ \image accessibilityarchitecture.png
+
+ Accessibility compliant applications are called AT-Servers while
+ assistive tools are called AT-Clients. A Qt application will
+ typically be an AT-Server, but specialized programs might also
+ function like AT-Clients. We will refer to clients and servers
+ when talking about AT-Clients and AT-Servers in the rest of this
+ document.
+
+ We will from now on focus on the Qt accessibility interface and
+ how it is implemented to create Qt applications that support
+ accessibility.
+
+ \section2 Accessibility in Qt
+
+ When we communicate with the assistive technologies, we need to
+ describe Qt's user interface in a way that they can understand. Qt
+ applications use QAccessibleInterface to expose information about the
+ individual UI elements. Currently, Qt provides support for its widgets
+ and widget parts, e.g., slider handles, but the interface could
+ also be implemented for any QObject if necessary. QAccessible
+ contains enums that describe the UI. The description is mainly
+ based on MSAA and is independent of Qt. We will examine the enums
+ in the course of this document.
+
+ The structure of the UI is represented as a tree of
+ QAccessibleInterface subclasses. You can think of this as a
+ representation of a UI like the QObject tree built by Qt. Objects
+ can be widgets or widget parts (such as scroll bar handles). We
+ examine the tree in detail in the next section.
+
+ Servers notify clients through \l{QAccessible::}{updateAccessibility()}
+ about changes in objects by sending events, and the clients
+ register to receive the events. The available events are defined
+ by the QAccessible::Event enum. The clients may then query for
+ the object that generated the event through
+ QAccessible::queryAccessibleInterface().
+
+ Three of the enums in QAccessible help clients query and alter
+ accessible objects:
+
+ \list
+ \o \l{QAccessible::}{Role}: Describes the role the object
+ fills in the user interface, e.g., if it is a main
+ window, a text caret, or a cell in an item view.
+ \o \l{QAccessible::}{Action}: The actions that the
+ clients can perform on the objects, e.g., pushing a
+ button.
+ \o \l{QAccessible::}{Relation}: Describes the relationship
+ between objects in the object tree.
+ This is used for navigation.
+ \endlist
+
+ The clients also have some possibilities to get the content of
+ objects, e.g., a button's text; the object provides strings
+ defined by the QAccessible::Text enum, that give information
+ about content.
+
+ The objects can be in a number of different states as defined by
+ the \l{QAccessible::}{State} enum. Examples of states are whether
+ the object is disabled, if it has focus, or if it provides a pop-up
+ menu.
+
+ \section2 The Accessible Object Tree
+
+ As mentioned, a tree structure is built from the accessible
+ objects of an application. By navigating through the tree, the
+ clients can access all elements in the UI. Object relations give
+ clients information about the UI. For instance, a slider handle is
+ a child of the slider to which it belongs. QAccessible::Relation
+ describes the various relationships the clients can ask objects
+ for.
+
+ Note that there are no direct mapping between the Qt QObject tree
+ and the accessible object tree. For instance, scroll bar handles
+ are accessible objects but are not widgets or objects in Qt.
+
+ AT-Clients have access to the accessibility object tree through
+ the root object in the tree, which is the QApplication. They can
+ query other objects through QAccessible::navigate(), which fetches
+ objects based on \l{QAccessible::}{Relation}s. The children of any
+ node is 1-based numbered. The child numbered 0 is the object
+ itself. The children of all interfaces are numbered this way,
+ i.e., it is not a fixed numbering from the root node in the entire
+ tree.
+
+ Qt provides accessible interfaces for its widgets. Interfaces for
+ any QObject subclass can be requested through
+ QAccessible::queryInterface(). A default implementation is
+ provided if a more specialized interface is not defined. An
+ AT-Client cannot acquire an interface for accessible objects that
+ do not have an equivalent QObject, e.g., scroll bar handles, but
+ they appear as normal objects through interfaces of parent
+ accessible objects, e.g., you can query their relationships with
+ QAccessible::relationTo().
+
+ To illustrate, we present an image of an accessible object tree.
+ Beneath the tree is a table with examples of object relationships.
+
+ \image accessibleobjecttree.png
+
+ The labels in top-down order are: the QAccessibleInterface class
+ name, the widget for which an interface is provided, and the
+ \l{QAccessible::}{Role} of the object. The Position, PageLeft and
+ PageRight correspond to the slider handle, the slider groove left
+ and the slider groove right, respectively. These accessible objects
+ do not have an equivalent QObject.
+
+ \table 40%
+ \header
+ \o Source Object
+ \o Target Object
+ \o Relation
+ \row
+ \o Slider
+ \o Indicator
+ \o Controller
+ \row
+ \o Indicator
+ \o Slider
+ \o Controlled
+ \row
+ \o Slider
+ \o Application
+ \o Ancestor
+ \row
+ \o Application
+ \o Slider
+ \o Child
+ \row
+ \o PushButton
+ \o Indicator
+ \o Sibling
+ \endtable
+
+ \section2 The Static QAccessible Functions
+
+ The accessibility is managed by QAccessible's static functions,
+ which we will examine shortly. They produce QAccessible
+ interfaces, build the object tree, and initiate the connection
+ with MSAA or the other platform specific technologies. If you are
+ only interested in learning how to make your application
+ accessible, you can safely skip over this section to
+ \l{Implementing Accessibility}.
+
+ The communication between clients and the server is initiated when
+ \l{QAccessible::}{setRootObject()} is called. This is done when
+ the QApplication instance is instantiated and you should not have
+ to do this yourself.
+
+ When a QObject calls \l{QAccessible::}{updateAccessibility()},
+ clients that are listening to events are notified of the
+ change. The function is used to post events to the assistive
+ technology, and accessible \l{QAccessible::Event}{events} are
+ posted by \l{QAccessible::}{updateAccessibility()}.
+
+ \l{QAccessible::}{queryAccessibleInterface()} returns accessible
+ interfaces for \l{QObject}s. All widgets in Qt provide interfaces;
+ if you need interfaces to control the behavior of other \l{QObject}
+ subclasses, you must implement the interfaces yourself, although
+ the QAccessibleObject convenience class implements parts of the
+ functionality for you.
+
+ The factory that produces accessibility interfaces for QObjects is
+ a function of type QAccessible::InterfaceFactory. It is possible
+ to have several factories installed. The last factory installed
+ will be the first to be asked for interfaces.
+ \l{QAccessible::}{queryAccessibleInterface()} uses the factories
+ to create interfaces for \l{QObject}s. Normally, you need not be
+ concerned about factories because you can implement plugins that
+ produce interfaces. We will give examples of both approaches
+ later.
+
+ \section1 Implementing Accessibility
+
+ To provide accessibility support for a widget or other user
+ interface element, you need to implement the QAccessibleInterface
+ and distribute it in a QAccessiblePlugin. It is also possible to
+ compile the interface into the application and provide a
+ QAccessible::InterfaceFactory for it. The factory can be used if
+ you link statically or do not want the added complexity of
+ plugins. This can be an advantage if you, for instance, are
+ delivering a 3-rd party library.
+
+ All widgets and other user interface elements should have
+ interfaces and plugins. If you want your application to support
+ accessibility, you will need to consider the following:
+
+ \list
+ \o Qt already implements accessibility for its own widgets.
+ We therefore recommend that you use Qt widgets where possible.
+ \o A QAccessibleInterface needs to be implemented for each element
+ that you want to make available to accessibility clients.
+ \o You need to send accessibility events from the custom
+ user interface elements that you implement.
+ \endlist
+
+ In general, it is recommended that you are somewhat familiar with
+ MSAA, which Qt originally was built for. You should also study
+ the enum values of QAccessible, which describe the roles, actions,
+ relationships, and events that you need to consider.
+
+ Note that you can examine how Qt's widgets implement their
+ accessibility. One major problem with the MSAA standard is that
+ interfaces are often implemented in an inconsistent way. This
+ makes life difficult for clients and often leads to guesswork on
+ object functionality.
+
+ It is possible to implement interfaces by inheriting
+ QAccessibleInterface and implementing its pure virtual functions.
+ In practice, however, it is usually preferable to inherit
+ QAccessibleObject or QAccessibleWidget, which implement part of
+ the functionality for you. In the next section, we will see an
+ example of implementing accessibility for a widget by inheriting
+ the QAccessibleWidget class.
+
+ \section2 The QAccessibleObject and QAccessibleWidget Convenience Classes
+
+ When implementing an accessibility interface for widgets, one would
+ as a rule inherit QAccessibleWidget, which is a convenience class
+ for widgets. Another available convenience class, which is
+ inherited by QAccessibleWidget, is the QAccessibleObject, which
+ implements part of the interface for QObjects.
+
+ The QAccessibleWidget provides the following functionality:
+
+ \list
+ \o It handles the navigation of the tree and
+ hit testing of the objects.
+ \o It handles events, roles, and actions that are common for all
+ \l{QWidget}s.
+ \o It handles action and methods that can be performed on
+ all widgets.
+ \o It calculates bounding rectangles with
+ \l{QAccessibleInterface::}{rect()}.
+ \o It gives \l{QAccessibleInterface::}{text()} strings that are
+ appropriate for a generic widget.
+ \o It sets the \l{QAccessible::State}{states} that
+ are common for all widgets.
+ \endlist
+
+ \section2 QAccessibleWidget Example
+
+ Instead of creating a custom widget and implementing an interface
+ for it, we will show how accessibility can be implemented for one of
+ Qt's standard widgets: QSlider. Making this widget accessible
+ demonstrates many of the issues that need to be faced when making
+ a custom widget accessible.
+
+ The slider is a complex control that functions as a
+ \l{QAccessible::}{Controller} for its accessible children.
+ This relationship must be known by the interface (for
+ \l{QAccessibleInterface::}{relationTo()} and
+ \l{QAccessibleInterface::}{navigate()}). This can be done
+ using a controlling signal, which is a mechanism provided by
+ QAccessibleWidget. We do this in the constructor:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 0
+
+ The choice of signal shown is not important; the same principles
+ apply to all signals that are declared in this way. Note that we
+ use QLatin1String to ensure that the signal name is correctly
+ specified.
+
+ When an accessible object is changed in a way that users need
+ to know about, it notifies clients of the change by sending them
+ an event via the accessible interface. This is how QSlider calls
+ \l{QAccessibleInterface::}{updateAccessibility()} to indicate that
+ its value has changed:
+
+ \snippet doc/src/snippets/qabstractsliderisnippet.cpp 0
+ \dots
+ \snippet doc/src/snippets/qabstractsliderisnippet.cpp 1
+ \dots
+ \snippet doc/src/snippets/qabstractsliderisnippet.cpp 2
+
+ Note that the call is made after the value of the slider has
+ changed because clients may query the new value immediately after
+ receiving the event.
+
+ The interface must be able to calculate bounding rectangles of
+ itself and any children that do not provide an interface of their
+ own. The \c QAccessibleSlider has three such children identified by
+ the private enum, \c SliderElements, which has the following values:
+ \c PageLeft (the rectangle on the left hand side of the slider
+ handle), \c PageRight (the rectangle on the right hand side of the
+ handle), and \c Position (the slider handle). Here is the
+ implementation of \l{QAccessibleInterface::}{rect()}:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 1
+ \dots
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 2
+ \dots
+
+ The first part of the function, which we have omitted, uses the
+ current \l{QStyle}{style} to calculate the slider handle's
+ bounding rectangle; it is stored in \c srect. Notice that child 0,
+ covered in the default case in the above code, is the slider itself,
+ so we can simply return the QSlider bounding rectangle obtained
+ from the superclass, which is effectively the value obtained from
+ QAccessibleWidget::rect().
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 3
+
+ Before the rectangle is returned it must be mapped to screen
+ coordinates.
+
+ The QAccessibleSlider must reimplement
+ QAccessibleInterface::childCount() since it manages children
+ without interfaces.
+
+ The \l{QAccessibleInterface::}{text()} function returns the
+ QAccessible::Text strings for the slider:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 4
+
+ The \c slider() function returns a pointer to the interface's
+ QSlider. Some values are left for the superclass's implementation.
+ Not all values are appropriate for all accessible objects, as you
+ can see for QAccessible::Value case. You should just return an
+ empty string for those values where no relevant text can be
+ provided.
+
+ The implementation of the \l{QAccessibleInterface::}{role()}
+ function is straightforward:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 5
+
+ The role function should be reimplemented by all objects and
+ describes the role of themselves and the children that do not
+ provide accessible interfaces of their own.
+
+ Next, the accessible interface needs to return the
+ \l{QAccessible::State}{states} that the slider can be in. We look
+ at parts of the \c state() implementation to show how just a few
+ of the states are handled:
+
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 6
+ \dots
+ \snippet doc/src/snippets/accessibilityslidersnippet.cpp 7
+
+ The superclass implementation of
+ \l{QAccessibleInterface::}{state()}, uses the
+ QAccessibleInterface::state() implementation. We simply need to
+ disable the buttons if the slider is at its minimum or maximum.
+
+ We have now exposed the information we have about the slider to
+ the clients. For the clients to be able to alter the slider - for
+ example, to change its value - we must provide information about
+ the actions that can be performed and perform them upon request.
+ We discuss this in the next section.
+
+ \section2 Handling Action Requests from Clients
+
+ QAccessible provides a number of \l{QAccessible::}{Action}s
+ that can be performed on request from clients. If an
+ accessible object supports actions, it should reimplement the
+ following functions from QAccessibleInterface:
+
+ \list
+ \o \l{QAccessibleInterface::}{actionText()} returns
+ strings that describe each action. The descriptions
+ to be made available are one for each
+ \l{QAccessible::}{Text} enum value.
+ \o \l{QAccessibleInterface::}{doAction()} executes requests
+ from clients to perform actions.
+ \endlist
+
+ Note that a client can request any action from an object. If
+ the object does not support the action, it returns false from
+ \l{QAccessibleInterface::}{doAction()}.
+
+ None of the standard actions take any parameters. It is possible
+ to provide user-defined actions that can take parameters.
+ The interface must then also reimplement
+ \l{QAccessibleInterface::}{userActionCount()}. Since this is not
+ defined in the MSAA specification, it is probably only useful to
+ use this if you know which specific AT-Clients will use the
+ application.
+
+ QAccessibleInterface gives another technique for clients to handle
+ accessible objects. It works basically the same way, but uses the
+ concept of methods in place of actions. The available methods are
+ defined by the QAccessible::Method enum. The following functions
+ need to be reimplemented from QAccessibleInterface if the
+ accessible object is to support methods:
+
+ \list
+ \o \l{QAccessibleInterface::}{supportedMethods()} returns
+ a QSet of \l{QAccessible::}{Method} values that are
+ supported by the object.
+ \o \l{QAccessibleInterface::}{invokeMethod()} executes
+ methods requested by clients.
+ \endlist
+
+ The action mechanism will probably be substituted by providing
+ methods in place of the standard actions.
+
+ To see examples on how to implement actions and methods, you
+ could examine the QAccessibleObject and QAccessibleWidget
+ implementations. You might also want to take a look at the
+ MSAA documentation.
+
+ \section2 Implementing Accessible Plugins
+
+ In this section we will explain the procedure of implementing
+ accessible plugins for your interfaces. A plugin is a class stored
+ in a shared library that can be loaded at run-time. It is
+ convenient to distribute interfaces as plugins since they will only
+ be loaded when required.
+
+ Creating an accessible plugin is achieved by inheriting
+ QAccessiblePlugin, reimplementing \l{QAccessiblePlugin::}{keys()}
+ and \l{QAccessiblePlugin::}{create()} from that class, and adding
+ one or two macros. The \c .pro file must be altered to use the
+ plugin template, and the library containing the plugin must be
+ placed on a path where Qt searches for accessible plugins.
+
+ We will go through the implementation of \c SliderPlugin, which is an
+ accessible plugin that produces interfaces for the
+ QAccessibleSlider we implemented in the \l{QAccessibleWidget Example}.
+ We start with the \c key() function:
+
+ \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 0
+
+ We simply need to return the class name of the single interface
+ our plugin can create an accessible interface for. A plugin
+ can support any number of classes; just add more class names
+ to the string list. We move on to the \c create() function:
+
+ \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 1
+
+ We check whether the interface requested is for the QSlider; if it
+ is, we create and return an interface for it. Note that \c object
+ will always be an instance of \c classname. You must return 0 if
+ you do not support the class.
+ \l{QAccessible::}{updateAccessibility()} checks with the
+ available accessibility plugins until it finds one that does not
+ return 0.
+
+ Finally, you need to include macros in the cpp file:
+
+ \snippet doc/src/snippets/accessibilitypluginsnippet.cpp 2
+
+ The Q_EXPORT_PLUGIN2 macro exports the plugin in the \c
+ SliderPlugin class into the \c acc_sliderplugin library. The first
+ argument is the name of the plugin library file, excluding the
+ file suffix, and the second is the class name. For more information
+ on plugins, consult the plugins \l{How to Create Qt
+ Plugins}{overview document}.
+
+ You can omit the the first macro unless you want the plugin
+ to be statically linked with the application.
+
+ \section2 Implementing Interface Factories
+
+ If you do not want to provide plugins for your accessibility
+ interfaces, you can use an interface factory
+ (QAccessible::InterfaceFactory), which is the recommended way to
+ provide accessible interfaces in a statically-linked application.
+
+ A factory is a function pointer for a function that takes the same
+ parameters as \l{QAccessiblePlugin}'s
+ \l{QAccessiblePlugin::}{create()} - a QString and a QObject. It
+ also works the same way. You install the factory with the
+ \l{QAccessible::}{installFactory()} function. We give an example
+ of how to create a factory for the \c SliderPlugin class:
+
+ \snippet doc/src/snippets/accessibilityfactorysnippet.cpp 0
+ \dots
+ \snippet doc/src/snippets/accessibilityfactorysnippet.cpp 1
+
+ \omit
+
+ \section1 Implementing Bridges for Other Assistive Technologies
+
+ An accessibility bridge provides the means for an assistive
+ technology to talk to Qt. On Windows and Mac, the built-in bridges
+ will be used. On UNIX, however, there are no built-in standard
+ assistive technology, and it might therefore be necessary to
+ implement an accessible bridge.
+
+ A bridge is implemented by inheriting QAccessibleBridge for the
+ technology to support. The class defines the interface that Qt
+ needs an assistive technology to support:
+
+ \list
+ \o A root object. This is the root in the accessible
+ object tree and is of type QAccessibleInterface.
+ \o Receive events from from accessible objects.
+ \endlist
+
+ The root object is set with the
+ \l{QAccessibleBridge::}{setRootObject()}. In the case of Qt, this
+ will always be an interface for the QApplication instance of the
+ application.
+
+ Event notification is sent through
+ \l{QAccessibleBridge::}{notifyAccessibilityUpdate()}. This
+ function is called by \l{QAccessible::}{updateAccessibility()}. Even
+ though the bridge needs only to implement these two functions, it
+ must be able to communicate the entire QAccessibleInterface to the
+ underlying technology. How this is achieved is, naturally, up to
+ the individual bridge and none of Qt's concern.
+
+ As with accessible interfaces, you distribute accessible bridges
+ in plugins. Accessible bridge plugins are subclasses of the
+ QAccessibleBridgePlugin class; the class defines the functions
+ \l{QAccessibleBridgePlugin::}{create()} and
+ \l{QAccessibleBridgePlugin::}{keys()}, which must me
+ reimplemented. If Qt finds a built-in bridge to use, it will
+ ignore any available plugins.
+
+ \endomit
+
+ \section1 Further Reading
+
+ The \l{Cross-Platform Accessibility Support in Qt 4} document contains a more
+ general overview of Qt's accessibility features and discusses how it is
+ used on each platform.
+ issues
+*/
diff --git a/doc/src/activeqt-dumpcpp.qdoc b/doc/src/activeqt-dumpcpp.qdoc
new file mode 100644
index 0000000..9465a31
--- /dev/null
+++ b/doc/src/activeqt-dumpcpp.qdoc
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-dumpcpp.html
+ \title The dumpcpp Tool (ActiveQt)
+
+ \ingroup activeqt-tools
+
+ \keyword dumpcpp
+
+ The \c dumpcpp tool generates a C++ namespace for a type library.
+
+ To generate a C++ namespace for a type library, call \c dumpcpp with the following
+ command line parameters:
+
+ \table
+ \header
+ \i Option
+ \i Result
+ \row
+ \i input
+ \i Generate documentation for \e input. \e input can specify a type library file or a type
+ library ID, or a CLSID or ProgID for an object
+ \row
+ \i -o file
+ \i Writes the class declaration to \e {file}.h and meta object infomation to \e {file}.cpp
+ \row
+ \i -n namespace
+ \i Generate a C++ namespace \e namespace
+ \row
+ \i -nometaobject
+ \i Do not generate a .cpp file with the meta object information.
+ The meta object is then generated in runtime.
+ \row
+ \i -getfile libid
+ \i Print the filename for the typelibrary \e libid to stdout
+ \row
+ \i -compat
+ \i Generate namespace with dynamicCall-compatible API
+ \row
+ \i -v
+ \i Print version information
+ \row
+ \i -h
+ \i Print help
+ \endtable
+
+ \c dumpcpp can be integrated into the \c qmake build system. In your .pro file, list the type
+ libraries you want to use in the TYPELIBS variable:
+
+ \snippet examples/activeqt/qutlook/qutlook.pro 0
+
+ The generated namespace will declare all enumerations, as well as one QAxObject subclass
+ for each \c coclass and \c interface declared in the type library. coclasses marked with
+ the \c control attribute will be wrapped by a QAxWidget subclass.
+
+ Those classes that wrap creatable coclasses (i.e. coclasses that are not marked
+ as \c noncreatable) have a default constructor; this is typically a single class
+ of type \c Application.
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 0
+
+ All other classes can only be created by passing an IDispatch interface pointer
+ to the constructor; those classes should however not be created explicitly.
+ Instead, use the appropriate API of already created objects.
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 1
+
+ All coclass wrappers also have one constructors taking an interface wrapper class
+ for each interface implemented.
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 2
+
+ You have to create coclasses to be able to connect to signals of the subobject.
+ Note that the constructor deletes the interface object, so the following will
+ cause a segmentation fault:
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 3
+
+ If the return type is of a coclass or interface type declared in another type
+ library you have to include the namespace header for that other type library
+ before including the header for the namespace you want to use (both header have
+ to be generated with this tool).
+
+ By default, methods and property returning subobjects will use the type as in
+ the type library. The caller of the function is responsible for deleting or
+ reparenting the object returned. If the \c -compat switch is set, properties
+ and method returning a COM object have the return type \c IDispatch*, and
+ the namespace will not declare wrapper classes for interfaces.
+
+ In this case, create the correct wrapper class explicitly:
+
+ \snippet doc/src/snippets/code/doc_src_activeqt-dumpcpp.qdoc 4
+
+ You can of course use the IDispatch* returned directly, in which case you have to
+ call \c Release() when finished with the interface.
+
+ All classes in the namespace are tagged with a macro that allows you to export
+ or import them from a DLL. To do that, declare the macro to expand to
+ \c __declspec(dllimport/export) before including the header file.
+
+ To build the tool you must first build the QAxContainer library.
+ Then run your make tool in \c tools/dumpcpp.
+*/
diff --git a/doc/src/activeqt-dumpdoc.qdoc b/doc/src/activeqt-dumpdoc.qdoc
new file mode 100644
index 0000000..b9156f0
--- /dev/null
+++ b/doc/src/activeqt-dumpdoc.qdoc
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-dumpdoc.html
+ \title The dumpdoc Tool (ActiveQt)
+
+ \ingroup activeqt-tools
+
+ \keyword dumpdoc
+
+ The \c dumpdoc tool generates Qt-style documentation for any
+ COM object and writes it into the file specified.
+
+ Call \c dumpdoc with the following command line parameters:
+
+ \table
+ \header
+ \i Option
+ \i Result
+ \row
+ \i -o file
+ \i Writes output to \e file
+ \row
+ \i object
+ \i Generate documentation for \e object
+ \row
+ \i -v
+ \i Print version information
+ \row
+ \i -h
+ \i Print help
+ \endtable
+
+ \e object must be an object installed on the local machine (ie.
+ remote objects are not supported), and can include subobjects
+ accessible through properties, ie.
+ \c Outlook.Application/Session/CurrentUser
+
+ The generated file will be an HTML file using Qt documentation
+ style.
+
+ To build the tool you must first build the QAxContainer library.
+ Then run your make tool in \c tools/dumpdoc.
+*/
diff --git a/doc/src/activeqt-idc.qdoc b/doc/src/activeqt-idc.qdoc
new file mode 100644
index 0000000..c570dcd
--- /dev/null
+++ b/doc/src/activeqt-idc.qdoc
@@ -0,0 +1,82 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-idc.html
+ \title IDC - The Interface Description Compiler (ActiveQt)
+
+ \ingroup activeqt-tools
+
+ \keyword idc
+
+ The IDC tool is part of the ActiveQt build system and makes
+ it possible to turn any Qt binary into a full COM object server
+ with only a few lines of code.
+
+ IDC understands the following command line parameters:
+
+ \table
+ \header
+ \i Option
+ \i Result
+ \row
+ \i dll -idl idl -version x.y
+ \i Writes the IDL of the server \e dll to the file \e idl. The
+ type library wll have version x.y.
+ \row
+ \i dll -tlb tlb
+ \i Replaces the type library in \e dll with \e tlb
+ \row
+ \i -v
+ \i Print version information
+ \row
+ \i -regserver dll
+ \i Register the COM server \e dll
+ \row
+ \i -unregserver
+ \i Unregister the COM server \e dll
+ \endtable
+
+ It is usually never necessary to invoke IDC manually, as the \c
+ qmake build system takes care of adding the required post
+ processing steps to the build process. See the \l{ActiveQt}
+ documentation for details.
+*/
diff --git a/doc/src/activeqt-testcon.qdoc b/doc/src/activeqt-testcon.qdoc
new file mode 100644
index 0000000..aba0b58
--- /dev/null
+++ b/doc/src/activeqt-testcon.qdoc
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-testcon.html
+ \title testcon - An ActiveX Test Container (ActiveQt)
+
+ \ingroup activeqt-tools
+
+ \keyword testcon
+
+ This application implements a generic test container for ActiveX
+ controls. You can insert ActiveX controls installed on your
+ system, and execute methods and modify properties. The container
+ will log information about events and property changes as well
+ as debug output in the log window.
+
+ Parts of the code use internals of the Qt meta object and ActiveQt
+ framework and are not recommended to be used in application code.
+
+ Use the application to view the slots, signals and porperties
+ available through the QAxWidget class when instantiated with a
+ certain ActiveX, and to test ActiveX controls you implement or
+ want to use in your Qt application.
+
+ The application can load and execute script files in JavaScript,
+ VBScript, Perl and Python (if installed) to automate the controls
+ loaded. Example script files using the QAxWidget2 class are available
+ in the \c scripts subdirectory.
+
+ Note that the qmake project of this example includes a resource file
+ \c testcon.rc with a version resource. This is required by some
+ ActiveX controls (ie. Shockwave ActiveX Controls), which might crash
+ or misbehave otherwise if such version information is missing.
+
+ To build the tool you must first build the QAxContainer and the
+ QAxServer libraries. Then run your make tool in \c tools/testcon
+ and run the resulting \c testcon.exe.
+*/
diff --git a/doc/src/activeqt.qdoc b/doc/src/activeqt.qdoc
new file mode 100644
index 0000000..ea13e59
--- /dev/null
+++ b/doc/src/activeqt.qdoc
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt.html
+ \title ActiveQt Framework
+ \brief An overview of Qt's ActiveX and COM integration on Windows.
+
+ \ingroup platform-notes
+ \keyword ActiveQt
+
+ Qt's ActiveX and COM support allows Qt for Windows developers to:
+
+ \list 1
+ \o Access and use ActiveX controls and COM objects provided by any
+ ActiveX server in their Qt applications.
+ \o Make their Qt applications available as COM servers, with
+ any number of Qt objects and widgets as COM objects and ActiveX
+ controls.
+ \endlist
+
+ The ActiveQt framework consists of two modules:
+
+ \list
+ \o The \l QAxContainer module is a static
+ library implementing QObject and QWidget subclasses, QAxObject and
+ QAxWidget, that act as containers for COM objects and ActiveX
+ controls.
+ \o The \l QAxServer module is a static library that implements
+ functionality for in-process and executable COM servers. This
+ module provides the QAxAggregated, QAxBindable and QAxFactory
+ classes.
+ \endlist
+
+ To build the static libraries, change into the \c activeqt directory
+ (usually \c QTDIR/src/activeqt), and run \c qmake and your make
+ tool in both the \c container and the \c control subdirectory.
+ The libraries \c qaxcontainer.lib and \c qaxserver.lib will be linked
+ into \c QTDIR/lib.
+
+ If you are using a shared configuration of Qt enter the \c plugin
+ subdirectory and run \c qmake and your make tool to build a
+ plugin that integrates the QAxContainer module into \l{Qt
+ Designer}.
+
+ The ActiveQt modules are part of the \l{Qt Full Framework Edition}. They
+ are \e not part of the \l{Open Source Versions of Qt}.
+
+ \sa {QAxContainer Module}, {QAxServer Module}
+*/
diff --git a/doc/src/annotated.qdoc b/doc/src/annotated.qdoc
new file mode 100644
index 0000000..1950c45
--- /dev/null
+++ b/doc/src/annotated.qdoc
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Documentation for class overview.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page annotated.html
+ \title Annotated Class Index
+ \ingroup classlists
+
+ Qt's classes with brief descriptions:
+
+ \generatelist annotatedclasses
+*/
diff --git a/doc/src/appicon.qdoc b/doc/src/appicon.qdoc
new file mode 100644
index 0000000..4d29337
--- /dev/null
+++ b/doc/src/appicon.qdoc
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Qt Application Icon Usage Documentation.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page appicon.html
+ \title Setting the Application Icon
+ \ingroup gui-programming
+
+ The application icon, typically displayed in the top-left corner of an
+ application's top-level windows, is set by calling the
+ QWidget::setWindowIcon() method on top-level widgets.
+
+ In order to change the icon of the executable application file
+ itself, as it is presented on the desktop (i.e., prior to
+ application execution), it is necessary to employ another,
+ platform-dependent technique.
+
+ \tableofcontents
+
+ \section1 Setting the Application Icon on Windows
+
+ First, create an ICO format bitmap file that contains the icon
+ image. This can be done with e.g. Microsoft Visual C++: Select
+ \menu{File|New}, then select the \menu{File} tab in the dialog
+ that appears, and choose \menu{Icon}. (Note that you do not need
+ to load your application into Visual C++; here we are only using
+ the icon editor.)
+
+ Store the ICO file in your application's source code directory,
+ for example, with the name \c myappico.ico. Then, create a text
+ file called, say, \c myapp.rc in which you put a single line of
+ text:
+
+ \snippet doc/src/snippets/code/doc_src_appicon.qdoc 0
+
+ Finally, assuming you are using \c qmake to generate your
+ makefiles, add this line to your \c myapp.pro file:
+
+ \snippet doc/src/snippets/code/doc_src_appicon.qdoc 1
+
+ Regenerate your makefile and your application. The \c .exe file
+ will now be represented with your icon in Explorer.
+
+ If you do not use \c qmake, the necessary steps are: first, run
+ the \c rc program on the \c .rc file, then link your application
+ with the resulting \c .res file.
+
+ \section1 Setting the Application Icon on Mac OS X
+
+ The application icon, typically displayed in the application dock
+ area, is set by calling QWidget::setWindowIcon() on a top-level
+ widget. It is possible that the program could appear in the
+ application dock area before the function call, in which case a
+ default icon will appear during the bouncing animation.
+
+ To ensure that the correct icon appears, both when the application is
+ being launched, and in the Finder, it is necessary to employ a
+ platform-dependent technique.
+
+ Although many programs can create icon files (\c .icns), the
+ recommended approach is to use the \e{Icon Composer} program
+ supplied by Apple (in the \c Developer/Application folder).
+ \e{Icon Composer} allows you to import several different sized
+ icons (for use in different contexts) as well as the masks that
+ go with them. Save the set of icons to a file in your project
+ directory.
+
+ If you are using qmake to generate your makefiles, you only need
+ to add a single line to your \c .pro project file. For example,
+ if the name of your icon file is \c{myapp.icns}, and your project
+ file is \c{myapp.pro}, add this line to \c{myapp.pro}:
+
+ \snippet doc/src/snippets/code/doc_src_appicon.qdoc 2
+
+ This will ensure that \c qmake puts your icons in the proper
+ place and creates an \c{Info.plist} entry for the icon.
+
+ If you do not use \c qmake, you must do the following manually:
+ \list 1
+ \i Create an \c Info.plist file for your application (using the
+ \c PropertyListEditor, found in \c Developer/Applications).
+ \i Associate your \c .icns record with the \c CFBundleIconFile record in the
+ \c Info.plist file (again, using the \c PropertyListEditor).
+ \i Copy the \c Info.plist file into your application bundle's \c Contents
+ directory.
+ \i Copy the \c .icns file into your application bundle's \c Contents/Resources
+ directory.
+ \endlist
+
+ \section1 Setting the Application Icon on Common Linux Desktops
+
+ In this section we briefly describe the issues involved in providing
+ icons for applications for two common Linux desktop environments:
+ \l{http://www.kde.org/}{KDE} and \l{http://www.gnome.org/}{GNOME}.
+ The core technology used to describe application icons
+ is the same for both desktops, and may also apply to others, but there
+ are details which are specific to each. The main source of information
+ on the standards used by these Linux desktops is
+ \l{http://www.freedesktop.org/}{freedesktop.org}. For information
+ on other Linux desktops please refer to the documentation for the
+ desktops you are interested in.
+
+ Often, users do not use executable files directly, but instead launch
+ applications by clicking icons on the desktop. These icons are
+ representations of "desktop entry files" that contain a description of
+ the application that includes information about its icon. Both desktop
+ environments are able to retrieve the information in these files, and
+ they use it to generate shortcuts to applications on the desktop, in
+ the start menu, and on the panel.
+
+ More information about desktop entry files can be found in the
+ \l{http://www.freedesktop.org/Standards/desktop-entry-spec}{Desktop Entry
+ Specification}.
+
+ Although desktop entry files can usefully encapsulate the application's details,
+ we still need to store the icons in the conventional location for each desktop
+ environment. A number of locations for icons are given in the
+ \l{http://www.freedesktop.org/Standards/icon-theme-spec}{Icon Theme
+ Specification}.
+
+ Although the path used to locate icons depends on the desktop in use,
+ and on its configuration, the directory structure beneath each of
+ these should follow the same pattern: subdirectories are arranged by
+ theme, icon size, and application type. Generally, application icons
+ are added to the hicolor theme, so a square application icon 32 pixels
+ in size would be stored in the \c hicolor/32x32/apps directory beneath
+ the icon path.
+
+ \section2 K Desktop Environment (KDE)
+
+ Application icons can be installed for use by all users, or on a per-user basis.
+ A user currently logged into their KDE desktop can discover these locations
+ by using \l{http://developer.kde.org/documentation/other/kde-config.html}{kde-config},
+ for example, by typing the following in a terminal window:
+
+ \snippet doc/src/snippets/code/doc_src_appicon.qdoc 3
+
+ Typically, the list of colon-separated paths printed to stdout includes the
+ user-specific icon path and the system-wide path. Beneath these
+ directories, it should be possible to locate and install icons according
+ to the conventions described in the
+ \l{http://www.freedesktop.org/Standards/icon-theme-spec}{Icon Theme Specification}.
+
+ If you are developing exclusively for KDE, you may wish to take
+ advantage of the \link
+ http://developer.kde.org/documentation/other/makefile_am_howto.html
+ KDE build system\endlink to configure your application. This ensures
+ that your icons are installed in the appropriate locations for KDE.
+
+ The KDE developer website is at \l{http://developer.kde.org/}.
+
+ \section2 GNOME
+
+ Application icons are stored within a standard system-wide
+ directory containing architecture-independent files. This
+ location can be determined by using \c gnome-config, for example
+ by typing the following in a terminal window:
+
+ \snippet doc/src/snippets/code/doc_src_appicon.qdoc 4
+
+ The path printed on stdout refers to a location that should contain a directory
+ called \c{pixmaps}; the directory structure within the \c pixmaps
+ directory is described in the \link
+ http://www.freedesktop.org/Standards/icon-theme-spec Icon Theme
+ Specification \endlink.
+
+ If you are developing exclusively for GNOME, you may wish to use
+ the standard set of \link
+ http://developer.gnome.org/tools/build.html GNU Build Tools\endlink,
+ also described in the relevant section of
+ the \link http://developer.gnome.org/doc/GGAD/ggad.html GTK+/Gnome
+ Application Development book\endlink. This ensures that your icons are
+ installed in the appropriate locations for GNOME.
+
+ The GNOME developer website is at \l{http://developer.gnome.org/}.
+*/
diff --git a/doc/src/assistant-manual.qdoc b/doc/src/assistant-manual.qdoc
new file mode 100644
index 0000000..6a735d2
--- /dev/null
+++ b/doc/src/assistant-manual.qdoc
@@ -0,0 +1,810 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page assistant-manual.html
+ \title Qt Assistant Manual
+ \ingroup qttools
+
+ \startpage {index.html}{Qt Reference Documentation}
+ \nextpage Qt Assistant in More Detail
+
+ \keyword Qt Assistant
+
+ This document introduces \QA, a tool for presenting on-line
+ documentation. The document is divided into the following sections:
+
+ Table of contents:
+
+ \list
+ \o \l{The One-Minute Guide to Using Qt Assistant}
+ \o \l{Qt Assistant in More Detail}
+ \o \l{Using Qt Assistant as a Custom Help Viewer}
+ \endlist
+
+ \chapter The One-Minute Guide to Using Qt Assistant
+
+ Once you have installed Qt, \QA should be ready to run:
+
+ \list
+ \o On Windows, \QA is available as a menu option on the Qt menu.
+ \o On Mac OS X, \QA is installed in the /Developer/Applications/Qt directory.
+ \o On Unix/Linux, open a terminal, type \c{assistant} and press \key{Enter}.
+ \endlist
+
+ When you start up \QA, you will be presented with a standard main window
+ application, with a menu bar and toolbar. Below these, on the left hand
+ side are navigation windows called \e{Contents}, \e{Index} and \e{Bookmarks}.
+ On the right, taking up most of the space, is the \e{Documentation} window.
+ By default, \QA loads the Qt reference documentation along with the manuals
+ of other Qt tools, like \QD or \QL.
+
+ \QA works in a similar way to a Web browser. If you click hyperlinks
+ (cross-references), the \e{Documentation} window will present the relevant
+ page. You can bookmark pages of particular interest and you can click the
+ \gui{Previous} and \gui{Next} toolbar buttons to navigate within the pages
+ you have visited.
+
+ Although \QA can be used just like a Web browser to navigate through
+ the documentation, \QA offers a powerful means of navigation that Web
+ browsers do not provide. \QA uses an advanced full text search engine
+ to index all the pages in each compressed help file so that you can
+ search for particular words and phrases.
+
+ To perform an index search, click the \gui{Index} tab on the Sidebar
+ (or press \key{Alt+I}). In the \gui{'Look For'} line edit enter a word;
+ e.g., 'homedirpath'. As you type, words are found and highlighted in a list
+ beneath the line edit. If the highlighted text matches what you're
+ looking for, double click it, (or press \key{Enter}) and the
+ \e{Documentation} window will display the relevant page. You rarely have
+ to type in the whole word before \QA finds a match. Note that for some
+ words there may be more than one possible page that is relevant.
+
+ \QA also provides full text searching for finding specific words in
+ the documentation. To activate the full text search, either press \key(Alt+S)
+ or click on the \gui{Search} tab in the \e{Documentation} window. Then
+ enter the term you're looking for and hit the \gui{Search} button. All
+ documents containing the specified term will then be listed in the list box
+ below.
+*/
+
+/*!
+ \page assistant-details.html
+ \title Qt Assistant in More Detail
+
+ \contentspage {Qt Assistant Manual}{Contents}
+ \previouspage Qt Assistant Manual
+ \nextpage Using Qt Assistant as a Custom Help Viewer
+
+ \tableofcontents
+
+ \img assistant-assistant.png
+
+ \section1 Command Line Options
+
+ \QA handles the following command line options:
+
+ \table
+ \header
+ \o Command Line Option
+ \o Brief Description
+ \row
+ \o -collectionFile <file.qhc>
+ \o Uses the specified collection file instead of the default one.
+ \row
+ \o -showUrl URL
+ \o Shows the document referenced by URL.
+ \row
+ \o -enableRemoteControl
+ \o Enables \QA to be remotly controlled.
+ \row
+ \o -show <widget>
+ \o Shows the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search".
+ \row
+ \o -hide <widget>
+ \o Hides the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search.
+ \row
+ \o -activate <widget>
+ \o Activates the specified dockwidget which can be "contents",
+ "index", "bookmarks" or "search.
+ \row
+ \o -register <doc.qch>
+ \o Registers the specified compressed help file in the given help
+ collection.
+ \row
+ \o -unregister <doc.qch>
+ \o Unregisters the specified compressed help file from the given
+ collection file.
+ \row
+ \o -setCurrentFilter filter
+ \o Sets the given filter as the active filter.
+ \row
+ \o -quiet
+ \o Doesn't show any error, warning or success messages.
+ \endtable
+
+ \section1 Tool Windows
+
+ \img assistant-dockwidgets.png
+
+ The tool windows provide four ways to navigate the documentation:
+
+ \list
+ \o The \gui{Contents} window presents a table of contents implemented as a
+ tree view for the documentation that is available. If you click an item,
+ its documentation will appear in the \e{Documentation} window. If you double
+ click an item or click on the control to the left of it, the item's sub-items
+ will appear. Click a sub-item to make its page appear in the \e{Documentation}
+ window. Click on the control next to an open item to hide its sub-items.
+ \o The \gui{Index} window is used to look up key words or phrases.
+ See \l{The One-Minute Guide to Using Qt Assistant} for how to use this
+ window.
+ \o The \gui{Bookmarks} window lists any bookmarks you have made. Double
+ click a bookmark to make its page appear in the \e{Documentation} window.
+ The \gui{Bookmarks} window provides a context menu with \gui{Show Item},
+ \gui{Delete Item} as well as \gui{Rename Item}. Click in the main menu
+ \menu{Bookmark|Add Bookmark...} (or press \key{Ctrl+B}) to bookmark the
+ page that is currently showing in the \e{Documentation} window. Right click
+ a bookmark in the list to rename or delete the highlighted bookmark.
+ \endlist
+
+ If you want the \gui{Documentation} window to use as much space as possible,
+ you can easily group, move or hide the tool windows. To group the windows,
+ drag one on top of the other and release the mouse. If one or all tool
+ windows are not shown, press \key{Alt+C}, \key{Alt+I} or \key{Alt+O} to show
+ the required window.
+
+ The tool windows can be docked into the main window, so you can drag them
+ to the top, left, right or bottom of \e{Qt Assistant's} window, or you can
+ drag them outside \QA to float them as independent windows.
+
+ \section1 Documentation Window
+
+ \img assistant-docwindow.png
+
+ The \gui{Documentation} window lets you create a tab for each
+ documentation page that you view. Click the \gui{Add Tab} button and a new
+ tab will appear with the page name as the tab's caption. This makes it
+ convenient to switch between pages when you are working with different
+ documentation. You can delete a tab by clicking the \gui{Close Tab} button
+ located on the right side of the \gui{Documentation} window.
+
+ \section1 Toolbars
+
+ \img assistant-toolbar.png
+
+ The main toolbar provides fast access to the most common actions.
+
+ \table
+ \header \o Action \o Description \o Menu Item \o Shortcut
+ \row \o \gui{Previous} \o Takes you to the previous page in the history.
+ \o \menu{Go|Previous} \o \key{Alt+Left Arrow}
+ \row \o \gui{Next} \o Takes you to the next page in the history.
+ \o \menu{Go|Next} \o \key{Alt+Right Arrow}
+ \row \o \gui{Home}
+ \o Takes you to the home page as specified in the Preferences Dialog.
+ \o \menu{Go|Home} \o \key{Ctrl+Home}.
+ \row \o \gui{Sync with Table of Contents}
+ \o Synchronizes the \gui{Contents} tool window with the page currently
+ shown in the \gui{Documentation} window.
+ \o \menu{Go|Sync with Table of Contents} \o
+ \row \o \gui{Copy} \o Copies any selected text to the clipboard.
+ \o \menu{Edit|Copy} \o \key{Ctrl+C}
+ \row \o \gui{Print} \o Opens the \gui{Print} dialog.
+ \o \menu{File|Print} \o \key{Ctrl+P}
+ \row \o \gui{Find in Text} \o Opens the \gui{Find Text} dialog.
+ \o \menu{Edit|Find in Text} \o \key{Ctrl+F}
+ \row \o \gui{Zoom in}
+ \o Increases the font size used to display text in the current tab.
+ \o \menu{View|Zoom in} \o \key{Ctrl++}
+ \row \o \gui{Zoom out}
+ \o Decreases the font size used to display text in the current tab.
+ \o \menu{View|Zoom out} \o \key{Ctrl+-}
+ \row \o \gui{Normal Size}
+ \o Resets the font size to its normal size in the current tab.
+ \o \menu{View|Normal Size} \o \key{Ctrl+0}
+ \endtable
+
+ \img assistant-address-toolbar.png
+
+ The address toolbar provides a fast way to enter a specific URL for a
+ documentation file. By default, the address toolbar is not shown, so it
+ has to be activated via \menu{View|Toolbars|Address Toolbar}.
+
+ \img assistant-filter-toolbar.png
+
+ The filter toolbar allows you to apply a filter to the currently installed
+ documentation. As with the address toolbar, the filter toolbar is not visible
+ by default and has to be activated via \menu{View|Toolbars|Filter Toolbar}.
+
+ \section1 Menus
+
+ \section2 File Menu
+
+ \list
+ \o \menu{File|Page Setup...} invokes a dialog allowing you to define
+ page layout properties, such as margin sizes, page orientation and paper size.
+ \o \menu{File|Print Preview...} provides a preview of the printed pages.
+ \o \menu{File|Print...} opens the \l{#Print Dialog}{\gui{Print} dialog}.
+ \o \menu{File|New Tab} opens a new empty tab in the \gui{Documentation}
+ window.
+ \o \menu{File|Close Tab} closes the current tab of the
+ \gui{Documentation} window.
+ \o \menu{File|Exit} closes the \QA application.
+ \endlist
+
+ \section2 Edit Menu
+
+ \list
+ \o \menu{Edit|Copy} copies any selected text to the clipboard.
+ \o \menu{Edit|Find in Text} invokes the \l{#Find Text Control}{\gui{Find Text}
+ control} at the lower end of the \gui{Documentation} window.
+ \o \menu{Edit|Find Next} looks for the next occurance of the specified
+ text in the \gui{Find Text} control.
+ \o \menu{Edit|Find Previous} looks for the previous occurance of
+ the specified text in the \l{#Find Text Control}{\gui{Find Text} control}.
+ \o \menu{Edit|Preferences} invokes the \l{#Preferences Dialog}{\gui{Preferences} dialog}.
+ \endlist
+
+ \section2 View Menu
+
+ \list
+ \o \menu{View|Zoom in} increases the font size in the current tab.
+ \o \menu{View|Zoom out} decreases the font size in the current tab.
+ \o \menu{View|Normal Size} resets the font size in the current tab.
+ \o \menu{View|Contents} toggles the display of the \gui{Contents} tool window.
+ \o \menu{View|Index} toggles the display of the \gui{Index} tool window.
+ \o \menu{View|Bookmarks} toggles the display of the \gui{Bookmarks} tool window.
+ \o \menu{View|Search} toggles the display of the Search in the \gui{Documentation} window.
+ \endlist
+
+ \section2 Go Menu
+
+ \list
+ \o \menu{Go|Home} goes to the home page.
+ \o \menu{Go|Back} displays the previous page in the history.
+ \o \menu{Go|Forward} displays the next page in the history.
+ \o \menu{Go|Sync with Table of Contents} syncs the \gui{Contents} tool window to the currently shown page.
+ \o \menu{Go|Next Page} selects the next tab in the \gui{Documentation} window.
+ \o \menu{Go|Previous Page} selects the previous tab in the \gui{Documentation} window.
+ \endlist
+
+ \section2 Bookmarks Menu
+
+ \list
+ \o \menu{Bookmarks|Add} adds the current page to the list of bookmarks.
+ \endlist
+
+ \section1 Dialogs
+
+ \section2 Print Dialog
+
+ This dialog is platform-specific. It gives access to various printer
+ options and can be used to print the document shown in the current tab.
+
+ \section2 Preferences Dialog
+
+ \img assistant-preferences-fonts.png
+
+ The \menu{Fonts} page allows you to change the font family and font sizes of the
+ browser window displaying the documentation or the application itself.
+
+ \img assistant-preferences-filters.png
+
+ The \menu{Filters} page lets you create and remove documentation
+ filters. To add a new filter, click the \gui{Add} button, specify a
+ filter name in the pop-up dialog and click \gui{OK}, then select
+ the filter attributes in the list box on the right hand side.
+ You can delete a filter by selecting it and clicking the \gui{Remove}
+ button.
+
+ \img assistant-preferences-documentation.png
+
+ The \menu{Documentation} page lets you install and remove compressed help
+ files. Click the \gui{Install} button and choose the path of the compressed
+ help file (*.qch) you would like to install.
+ To delete a help file, select a documentation set in the list and click
+ \gui{Remove}.
+
+ \img assistant-preferences-options.png
+
+ The \menu{Options} page lets you specify the homepage \QA will display when
+ you click the \gui{Home} button in \QA's main user interface. You can specify
+ the hompage by typing it here or clicking on one of the buttons below the
+ textbox. \gui{Current Page} sets the currently displayed page as your home
+ page while \gui{Restore to default} will reset your home page to the default
+ home page.
+
+ \section1 Find Text Control
+
+ This control is used to find text in the current page. Enter the text you want
+ to find in the line edit. The search is incremental, meaning that the most
+ relevant result is shown as you enter characters into the line edit.
+
+ If you check the \gui{Whole words only} checkbox, the search will only consider
+ whole words; for example, if you search for "spin" with this checkbox checked it will
+ not match "spinbox", but will match "spin". If you check the \gui{Case sensitive}
+ checkbox then, for example, "spin" will match "spin" but not "Spin". You can
+ search forwards or backwards from your current position in the page by clicking
+ the \gui{Previous} or \gui{Next} buttons. To hide the find control, either click the
+ \gui{Close} button or hit the \key{Esc} key.
+
+ \section1 Filtering Help Contents
+
+ \QA allows you to install any kind of documentation as long as it is organized
+ in Qt compressed help files (*.qch). For example, it is possible to install the
+ Qt reference documentation for Qt 4.4.0 and Qt 4.4.1 at the same time. In many
+ respects, this is very convenient since only one version of \QA is needed.
+ However, at the same time it becomes more complicated when performing tasks like
+ searching the index because nearly every keyword is defined in Qt 4.4.0 as well
+ as in Qt 4.4.1. This means that \QA will always ask the user to choose which one
+ should be displayed.
+
+ We use documentation filters to solve this issue. A filter is identified by its
+ name, and contains a list of filter attributes. An attribute is just a string and
+ can be freely chosen. Attributes are defined by the documentation itself, this
+ means that every documentation set usually has one or more attributes.
+
+ For example, the Qt 4.4.0 \QA documentation defines the attributes \c {assistant},
+ \c{tools} and \c{4.4.0}, \QD defines \c{designer}, \c{tools} and \c{4.4.0}.
+ The filter to display all tools would then define only the attribute
+ \c{tools} since this attribute is part of both documentation sets.
+ Adding the attribute \c{assistant} to the filter would then only show \QA
+ documentation since the \QD documentation does not contain this
+ attribute. Having an empty list of attributes in a filter will match all
+ documentation; i.e., it is equivalent to requesting unfiltered documentation.
+
+ \section1 Full Text Searching
+
+ \img assistant-search.png
+
+ \QA provides a powerful full text search engine. To search
+ for certain words or text, click the \gui{Search} tab in the \gui{Documentation}
+ window. Then enter the text you want to look for and press \key{Enter}
+ or click the \gui{Search} button. The search is not case sensitive, so,
+ for example, Foo, fOo and FOO are all treated as the same. The following are
+ examples of common search patterns:
+
+ \list
+ \o \c deep -- lists all the documents that contain the word 'deep'
+ \o \c{deep*} -- lists all the documents that contain a word beginning
+ with 'deep'
+ \o \c{deep copy} -- lists all documents that contain both 'deep' \e
+ and 'copy'
+ \o \c{"deep copy"} -- list all documents that contain the phrase 'deep copy'
+ \endlist
+
+ It is also possible to use the \gui{Advanced search} to get more flexibility.
+ You can specify some words so that hits containing these are excluded from the
+ result, or you can search for an exact phrase. Searching for similar words will
+ give results like these:
+
+ \list
+ \o \c{QStin} -- lists all the documents with titles that are similar, such as \c{QString}
+ \o \c{QSting} -- lists all the documents with titles that are similar, such as \c{QString}
+ \o \c{QStrin} -- lists all the documents with titles that are similar, such as \c{QString}
+ \endlist
+
+ Options can be combined to improve the search results.
+
+ The list of documents found is ordered according to the number of
+ occurrences of the search text which they contain, with those containing
+ the highest number of occurrences appearing first. Simply click any
+ document in the list to display it in the \gui{Documentation} window.
+
+ If the documentation has changed \mdash for example, if documents have been added
+ or removed \mdash \QA will index them again.
+
+*/
+
+/*!
+ \page assistant-custom-help-viewer.html
+ \title Using Qt Assistant as a Custom Help Viewer
+
+ \contentspage {Qt Assistant Manual}{Contents}
+ \previouspage Qt Assistant in More Detail
+
+ Using \QA as custom help viewer requires more than just being able to
+ display custom documentation. It is equally important that the
+ appearance of \QA can be customized so that it is seen as a
+ application-specific help viewer rather than \QA. This is achieved by
+ changing the window title or icon, as well as some application-specific
+ menu texts and actions. The complete list of possible customizations
+ can be found in the \l{Creating a Custom Help Collection File} section.
+
+ Another requirement of a custom help viewer is the ability to receive
+ actions or commands from the application it provides help for. This is
+ especially important when the application offers context sensitive help.
+ When used in this way, the help viewer may need to change its contents
+ depending on the state the application is currently in. This means that
+ the application has to communicate the current state to the help viewer.
+ The section about \l{Using Qt Assistant Remotely} explains how this can
+ be done.
+
+ \tableofcontents
+
+ The \l{Simple Text Viewer Example}{Simple Text Viewer} example uses the
+ techniques described in this document to show how to use \QA as a custom
+ help viewer for an application.
+
+ \warning In order to ship Qt Assistant in your application, it is crucial
+ that you include the sqlite plugin. For more information on how to include
+ plugins in your application, refer to the \l{Deploying Qt Applications}
+ {deployment documentation}.
+
+ \section1 Qt Help Collection Files
+
+ The first important point to know about \QA is that it stores all
+ settings related to its appearance \e and a list of installed
+ documentation in a help collection file. This means, when starting \QA
+ with different collection files, \QA may look totally different. This
+ complete separation of settings makes it possible to deploy \QA as a
+ custom help viewer for more than one application on one machine
+ without risk of interference between different instances of \QA.
+
+ To apply a certain help collection to \QA, specify the respective
+ collection file on the command line when starting it. For example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
+
+ However, storing all settings in one collection file raises some problems.
+ The collection file is usually installed in the same directory as the
+ application itself, or one of its subdirectories. Depending on the
+ directory and the operating system, the user may not have any permissions
+ to modify this file which would happen when the user settings are stored.
+ Also, it may not even be possible to give the user write permissions;
+ e.g., when the file is located on a read-only medium like a CD-ROM.
+
+ Even if it is possible to give everybody the right to store their settings
+ in a globally available collection file, the settings from one user would
+ be overwritten by another user when exiting \QA.
+
+ To solve this dilemma, \QA creates user specific collection files which
+ are more or less copied from the original collection file. The user-specific
+ collection file will be saved in a subdirectory of the path returned by
+ QDesktopServices::DataLocation. The subdirectory, or \e{cache directory}
+ within this user-specific location, can be defined in the help collection
+ project file. For example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 7
+
+ So, when calling
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
+
+ \QA actually uses the collection file:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 9
+
+ There is no need ever to start \QA with the user specific collection
+ file. Instead, the collection file shipped with the application should
+ always be used. Also, when adding or removing documentation from the
+ collection file (see next section) always use the normal collection file.
+ \QA will take care of synchronizing the user collection files when the
+ list of installed documentation has changed.
+
+ \section1 Displaying Custom Documentation
+
+ Before \QA is able to show documentation, it has to know where it can
+ find the actual documentation files, meaning that it has to know the
+ location of the Qt compressed help file (*.qch). As already mentioned,
+ \QA stores references to the compressed help files in the currently used
+ collection file. So, when creating a new collection file you can list
+ all compressed help files \QA should display.
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 5
+
+ Sometimes, depending on the application for which \QA acts as a
+ help viewer, more documentation needs to be added over time; for
+ example, when installing more application components or plugins.
+ This can be done manually by starting \QA, opening the \gui{Edit|Preferences}
+ dialog and navigating to the \gui{Documentation} tab page. Then click
+ the \gui{Add...} button, select a Qt compressed help file (*.qch)
+ and press \gui{Open}. However, this approach has the disadvantage
+ that every user has to do it manually to get access to the new
+ documentation.
+
+ The prefered way of adding documentation to an already existing collection
+ file is to use the \c{-register} command line flag of \QA. When starting
+ \QA with this flag, the documentation will be added and \QA will
+ exit right away displaying a message if the registration was successful
+ or not.
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 6
+
+ The \c{-quiet} flag can be passed on to \QA to prevent it from writing
+ out the status message.
+
+ \bold{Note:} \QA will show the documentation in the contents view in the same
+ order as it was registered.
+
+
+ \section1 Changing the Appearance of Qt Assistant
+
+ The appearance of \QA can be changed by passing different command line options
+ on startup. However, these command line options only allow to show or hide
+ specific widgets, like the contents or index view. Other customizations, such
+ as changing the application title or icon, or disabling the filter functionality,
+ can be done by creating a custom help collection file.
+
+ \section2 Creating a Custom Help Collection File
+
+ The help collection file (*.qhc) used by \QA is created when running the
+ \c qcollectiongenerator tool on a help collection project file (*.qhcp).
+ The project file format is XML and supports the following tags:
+
+ \table
+ \header
+ \o Tag
+ \o Brief Description
+ \row
+ \o \c{<title>}
+ \o This property is used to specify a window title for \QA.
+ \row
+ \o \c{<homePage>}
+ \o This tag specifies which page should be display when
+ pressing the home button in \QA's main user interface.
+ \row
+ \o \c{<startPage>}
+ \o This tag specifies which page \QA should initially
+ display when the help collection is used.
+ \row
+ \o \c{<currentFilter>}
+ \o This tag specifies the \l{Qt Assistant in More Detail#Preferences Dialog}{filter}
+ that is initially used.
+ If this filter is not specified, the documentation will not be filtered. This has
+ no impact if only one documentation set is installed.
+ \row
+ \o \c{<applicationIcon>}
+ \o This tag describes an icon that will be used instead of the normal \QA
+ application icon. This is specified as a relative path from the directory
+ containing the collection file.
+ \row
+ \o \c{<enableFilterFunctionality>}
+ \o This tag is used to enable or disable user accessible filter functionality,
+ making it possible to prevent the user from changing any filter when running \QA.
+ It does not mean that the internal filter functionality is completely disabled.
+ Set the value to \c{false} if you want to disable the filtering. If the filter
+ toolbar should be shown by default, set the attribute \c{visible} to \c{true}.
+ \row
+ \o \c{<enableDocumentationManager>}
+ \o This tag is used to specify whether the documentation manager should be shown
+ in the preferences dialog. Disabling the Documentation Manager allows you to limit
+ \QA to display a specific documentation set or make it impossible for the end user
+ to accidentally remove or install documentation. To hide the documentation manager,
+ set the tag value to \c{false}.
+ \row
+ \o \c{<enableAddressBar>}
+ \o This tag describes if the address bar can be shown. By default it is
+ enabled; if you want to disable it set the tag value to \c{false}. If the
+ address bar functionality is enabled, the address bar can be shown by setting the
+ tag attribute \c{visible} to \c{true}.
+ \row
+ \o \c{<aboutMenuText>, <text>}
+ \o The \c{aboutMenuText} tag lists texts for different languages which will
+ later appear in the \menu{Help} menu; e.g., "About Application". A text is
+ specified within the \c{text} tags; the \c{language} attribute takes the two
+ letter language name. The text is used as the default text if no language
+ attribute is specified.
+ \row
+ \o \c{<aboutDialog>, <file>, <icon>}
+ \o The \c{aboutDialog} tag can be used to specify the text for the \gui{About}
+ dialog that can be opened from the \menu{Help} menu. The text is taken from the
+ file in the \c{file} tags. It is possible to specify a different file or any
+ language. The icon defined by the \c{icon} tags is applied to any language.
+ \row
+ \o \c{<cacheDirectory>}
+ \o Specified as a path relative to the directory given by
+ QDesktopServices::DataLocation, the cache path is used to store index files
+ needed for the full text search and a copy of the collection file.
+ The copy is needed because \QA stores all its settings in the collection file;
+ i.e., it must be writable for the user.
+ \endtable
+
+ In addition to those \QA specific tags, the tags for generating and registering
+ documentation can be used. See \l{QtHelp Module#Creating a Qt Help Collection}{Qt Help Collection}
+ documentation for more information.
+
+ An example of a help collection file that uses all the available tags is shown below:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 1
+
+ To create the binary collection file, run the \c qcollectiongenerator tool:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 10
+
+ To test the generated collection file, start \QA in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 8
+
+ \section1 Using Qt Assistant Remotely
+
+ Even though the help viewer is a standalone application, it will mostly
+ be launched by the application it provides help for. This approach
+ gives the application the possibility to ask for specific help contents
+ to be displayed as soon as the help viewer is started. Another advantage
+ with this approach is that the application can communicate with the
+ help viewer process and can therefore request other help contents to be
+ shown depending on the current state of the application.
+
+ So, to use \QA as the custom help viewer of your application, simply
+ create a QProcess and specify the path to the Assistant executable. In order
+ to make Assistant listen to your application, turn on its remote control
+ functionality by passing the \c{-enableRemoteControl} command line option.
+
+ \warning The trailing '\0' must be appended separately to the QByteArray,
+ e.g., \c{QByteArray("command" + '\0')}.
+
+ The following example shows how this can be done:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 2
+
+ Once \QA is running, you can send commands by using the stdin channel of
+ the process. The code snippet below shows how to tell \QA to show a certain
+ page in the documentation.
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 3
+
+ The following commands can be used to control \QA:
+
+ \table
+ \header
+ \o Command
+ \o Brief Description
+ \row
+ \o \c{show <Widget>}
+ \o Shows the dock widget specified by <Widget>. If the widget
+ is already shown and this command is sent again, the widget will be
+ activated, meaning that it will be raised and given the input focus.
+ Possible values for <Widget> are "contents", "index", "bookmarks" or "search".
+ \row
+ \o \c{hide <Widget>}
+ \o Hides the dock widget specified by <Widget>. Possible values for
+ <Widget> are "contents", "index", "bookmarks" and "search".
+ \row
+ \o \c{setSource <Url>}
+ \o Displays the given <Url>. The URL can be absolute or relative
+ to the currently displayed page. If the URL is absolute, it has to
+ be a valid Qt help system URL; i.e., starting with "qthelp://".
+ \row
+ \o \c{activateKeyword <Keyword>}
+ \o Inserts the specified <Keyword> into the line edit of the
+ index dock widget and activates the corresponding item in the
+ index list. If such an item has more than one link associated
+ with it, a topic chooser will be shown.
+ \row
+ \o \c{activateIdentifier <Id>}
+ \o Displays the help contents for the given <Id>. An ID is unique
+ in each namespace and has only one link associated to it, so the
+ topic chooser will never pop up.
+ \row
+ \o \c{syncContents}
+ \o Selects the item in the contents widget which corresponds to
+ the currently displayed page.
+ \row
+ \o \c{setCurrentFilter}
+ \o Selects the specified filter and updates the visual representation
+ accordingly.
+ \row
+ \o \c{expandToc <Depth>}
+ \o Expands the table of contents tree to the given depth. If depth
+ is less than 1, the tree will be collapsed completely.
+ \endtable
+
+ If you want to send several commands within a short period of time, it is
+ recommended that you write only a single line to the stdin of the process
+ instead of one line for every command. The commands have to be separated by
+ a semicolon, as shown in the following example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 4
+
+ \section1 Compatibility with Old Formats
+
+ In older versions of Qt, the help system was based on Document Content File
+ (DCF) and Qt Assistant Documentation Profile (ADP) formats. In contrast,
+ Qt Assistant and the help system used in Qt 4.4 use the formats described
+ earlier in this manual.
+
+ Unfortunately, the old file formats are not compatible with the new ones.
+ In general, the differences are not that big \mdash in most cases is the old
+ format is just a subset of the new one. One example is the \c namespace tag in
+ the Qt Help Project format, which was not part of the old format, but plays a vital
+ role in the new one. To help you to move to the new file format, we have created
+ a conversion wizard.
+
+ The wizard is started by executing \c qhelpconverter. It guides you through the
+ conversion of different parts of the file and generates a new \c qch or \c qhcp
+ file.
+
+ Once the wizard is finished and the files created, run the \c qhelpgenerator
+ or the \c qcollectiongenerator tool to generate the binary help files used by \QA.
+*/
+
+/*
+\section2 Modifying \QA with Command Line Options
+
+ Different help collections can be shown by simply passing the help collection
+ path to \QA. For example:
+
+ \snippet doc/src/snippets/code/doc_src_assistant-manual.qdoc 0
+
+ Other available options the can be passed on the command line.
+
+ \table
+ \header
+ \o Command Line Option
+ \o Brief Description
+ \row
+ \o -collectionFile <file.qhc>
+ \o Uses the specified collection file instead of the default one.
+ \row
+ \o -showUrl URL
+ \o Shows the document referenced by URL.
+ \row
+ \o -enableRemoteControl
+ \o Enables \QA to be remotly controlled.
+ \row
+ \o -show <widget>
+ \o Shows the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search".
+ \row
+ \o -hide <widget>
+ \o Hides the specified dockwidget which can be "contents", "index",
+ "bookmarks" or "search.
+ \row
+ \o -activate <widget>
+ \o Activates the specified dockwidget which can be "contents",
+ "index", "bookmarks" or "search.
+ \row
+ \o -register <doc.qch>
+ \o Registers the specified compressed help file in the given help
+ collection.
+ \row
+ \o -unregister <doc.qch>
+ \o Unregisters the specified compressed help file from the given
+ collection file.
+ \row
+ \o -quiet
+ \o Doesn't show any error, warning or success messages.
+ \endtable
+ */
diff --git a/doc/src/atomic-operations.qdoc b/doc/src/atomic-operations.qdoc
new file mode 100644
index 0000000..5c0973b
--- /dev/null
+++ b/doc/src/atomic-operations.qdoc
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page atomic-operations.html
+ \title Implementing Atomic Operations
+ \ingroup architecture
+ \ingroup qt-embedded-linux
+ \brief A guide to implementing atomic operations on new architectures.
+
+ Qt uses an optimization called \l {Implicitly Shared
+ Classes}{implicit sharing} for many of its value classes.
+
+ Starting with Qt 4, all of Qt's implicitly shared classes can
+ safely be copied across threads like any other value classes,
+ i.e., they are fully \l {Thread Support in Qt#Reentrancy and
+ Thread-Safety}{reentrant}. This is accomplished by implementing
+ reference counting operations using atomic hardware instructions
+ on all the different platforms supported by Qt.
+
+ To support a new architecture, it is important to ensure that
+ these platform-specific atomic operations are implemented in a
+ corresponding header file (\c qatomic_ARCH.h), and that this file
+ is located in Qt's \c src/corelib/arch directory. For example, the
+ Intel 80386 implementation is located in \c
+ src/corelib/arch/qatomic_i386.h.
+
+ Currently, Qt provides two classes providing several atomic
+ operations, QAtomicInt and QAtomicPointer. These classes inherit
+ from QBasicAtomicInt and QBasicAtomicPointer, respectively.
+
+ When porting Qt to a new architecture, the QBasicAtomicInt and
+ QBasicAtomicPointer classes must be implemented, \e not QAtomicInt
+ and QAtomicPointer. The former classes do not have constructors,
+ which makes them POD (plain-old-data). Both classes only have a
+ single member variable called \c _q_value, which stores the
+ value. This is the value that all of the atomic operations read
+ and modify.
+
+ All of the member functions mentioned in the QAtomicInt and
+ QAtomicPointer API documentation must be implemented. Note that
+ these the implementations of the atomic operations in these
+ classes must be atomic with respect to both interrupts and
+ multiple processors.
+
+ \warning The QBasicAtomicInt and QBasicAtomicPointer classes
+ mentioned in this document are used internally by Qt and are not
+ part of the public API. They may change in future versions of
+ Qt. The purpose of this document is to aid people interested in
+ porting Qt to a new architecture.
+*/
diff --git a/doc/src/bughowto.qdoc b/doc/src/bughowto.qdoc
new file mode 100644
index 0000000..2a17a34
--- /dev/null
+++ b/doc/src/bughowto.qdoc
@@ -0,0 +1,71 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page bughowto.html
+ \title How to Report a Bug
+ \brief Information about ways to report bugs in Qt.
+ \ingroup howto
+
+ If you think you have found a bug in Qt, we would like to hear
+ about it so that we can fix it.
+
+ Before reporting a bug, please check the \l{FAQs}, \l{Platform
+ Notes}, and the \l{Task Tracker} on the Qt website to see
+ if the issue is already known.
+
+ Always include the following information in your bug report:
+
+ \list 1
+ \o The name and version number of your compiler
+ \o The name and version number of your operating system
+ \o The version of Qt you are using, and what configure options it was
+ compiled with.
+ \endlist
+
+ If the problem you are reporting is only visible at run-time, try to
+ create a small test program that shows the problem when run. Often,
+ such a program can be created with some minor changes to one
+ of the many example programs in Qt's \c examples directory.
+
+ Please submit the bug report using the \l{Task Tracker} on the Qt
+ website.
+*/
diff --git a/doc/src/classes.qdoc b/doc/src/classes.qdoc
new file mode 100644
index 0000000..c25da2b
--- /dev/null
+++ b/doc/src/classes.qdoc
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page classes.html
+ \title Qt's Classes
+ \ingroup classlists
+
+ This is a list of all Qt classes excluding the \l{Qt 3
+ compatibility classes}. For a shorter list that only includes the
+ most frequently used classes, see \l{Qt's Main Classes}.
+ \omit This is old and dingy now.
+ and the \l{http://doc.trolltech.com/extras/qt43-class-chart.pdf}{Qt 4.3 Class Chart (PDF)}.
+ \endomit
+
+ \generatelist classes
+
+ \sa {Qt 3 Compatibility Classes}, {Qt's Modules}
+*/
+
+/*!
+ \page namespaces.html
+ \title Qt's Namespaces
+ \ingroup classlists
+
+ This is a list of the main namespaces in Qt. For a list of classes in
+ Qt, see \l{Qt's Classes}.
+
+ \generatelist{namespaces}
+*/
diff --git a/doc/src/codecs.qdoc b/doc/src/codecs.qdoc
new file mode 100644
index 0000000..eaeed3e
--- /dev/null
+++ b/doc/src/codecs.qdoc
@@ -0,0 +1,534 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page codec-big5.html
+ \title Big5 Text Codec
+ \ingroup codecs
+
+ The Big5 codec provides conversion to and from the Big5 encoding.
+ The code was originally contributed by Ming-Che Chuang
+ \<mingche@cobra.ee.ntu.edu.tw\> for the Big-5+ encoding, and was
+ included in Qt with the author's permission, and the grateful
+ thanks of the Trolltech team. (Note: Ming-Che's code is QPL'd, as
+ per an mail to qt-info@nokia.com.)
+
+ However, since Big-5+ was never formally approved, and was never
+ used by anyone, the Taiwan Free Software community and the Li18nux
+ Big5 Standard Subgroup agree that the de-facto standard Big5-ETen
+ (zh_TW.Big5 or zh_TW.TW-Big5) be used instead.
+
+ The Big5 is currently implemented as a pure subset of the
+ Big5-HKSCS codec, so more fine-tuning is needed to make it
+ identical to the standard Big5 mapping as determined by
+ Li18nux-Big5. See \l{http://www.autrijus.org/xml/} for the draft
+ Big5 (2002) standard.
+
+ James Su \<suzhe@turbolinux.com.cn\> \<suzhe@gnuchina.org\>
+ generated the Big5-HKSCS-to-Unicode tables with a very
+ space-efficient algorithm. He generously donated his code to glibc
+ in May 2002. Subsequently, James has kindly allowed Anthony Fok
+ \<anthony@thizlinux.com\> \<foka@debian.org\> to adapt the code
+ for Qt.
+
+ \legalese
+ Copyright (C) 2000 Ming-Che Chuang \BR
+ Copyright (C) 2002 James Su, Turbolinux Inc. \BR
+ Copyright (C) 2002 Anthony Fok, ThizLinux Laboratory Ltd.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codec-big5hkscs.html
+ \title Big5-HKSCS Text Codec
+ \ingroup codecs
+
+ The Big5-HKSCS codec provides conversion to and from the
+ Big5-HKSCS encoding.
+
+ The codec grew out of the QBig5Codec originally contributed by
+ Ming-Che Chuang \<mingche@cobra.ee.ntu.edu.tw\>. James Su
+ \<suzhe@turbolinux.com.cn\> \<suzhe@gnuchina.org\> and Anthony Fok
+ \<anthony@thizlinux.com\> \<foka@debian.org\> implemented HKSCS-1999
+ QBig5hkscsCodec for Qt-2.3.x, but it was too late in Qt development
+ schedule to be officially included in the Qt-2.3.x series.
+
+ Wu Yi \<wuyi@hancom.com\> ported the HKSCS-1999 QBig5hkscsCodec to
+ Qt-3.0.1 in March 2002.
+
+ With the advent of the new HKSCS-2001 standard, James Su
+ \<suzhe@turbolinux.com.cn\> \<suzhe@gnuchina.org\> generated the
+ Big5-HKSCS<->Unicode tables with a very space-efficient algorithm.
+ He generously donated his code to glibc in May 2002. Subsequently,
+ James has generously allowed Anthony Fok to adapt the code for
+ Qt-3.0.5.
+
+ Currently, the Big5-HKSCS tables are generated from the following
+ sources, and with the Euro character added:
+ \list 1
+ \o \l{http://www.microsoft.com/typography/unicode/950.txt}
+ \o \l{http://www.info.gov.hk/digital21/chi/hkscs/download/big5-iso.txt}
+ \o \l{http://www.info.gov.hk/digital21/chi/hkscs/download/big5cmp.txt}
+ \endlist
+
+ There may be more fine-tuning to the QBig5hkscsCodec to maximize its
+ compatibility with the standard Big5 (2002) mapping as determined by
+ Li18nux Big5 Standard Subgroup. See \l{http://www.autrijus.org/xml/}
+ for the various Big5 CharMapML tables.
+
+ \legalese
+ Copyright (C) 2000 Ming-Che Chuang \BR
+ Copyright (C) 2001, 2002 James Su, Turbolinux Inc. \BR
+ Copyright (C) 2002 WU Yi, HancomLinux Inc. \BR
+ Copyright (C) 2001, 2002 Anthony Fok, ThizLinux Laboratory Ltd.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codec-eucjp.html
+ \title EUC-JP Text Codec
+ \ingroup codecs
+
+ The EUC-JP codec provides conversion to and from EUC-JP, the main
+ legacy encoding for Unix machines in Japan.
+
+ The environment variable \c UNICODEMAP_JP can be used to
+ fine-tune the JIS, Shift-JIS, and EUC-JP codecs. The \l{ISO
+ 2022-JP (JIS) Text Codec} documentation describes how to use this
+ variable.
+
+ Most of the code here was written by Serika Kurusugawa,
+ a.k.a. Junji Takagi, and is included in Qt with the author's
+ permission and the grateful thanks of the Trolltech team. Here is
+ the copyright statement for that code:
+
+ \legalese
+
+ Copyright (C) 1999 Serika Kurusugawa. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS".
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codec-euckr.html
+ \title EUC-KR Text Codec
+ \ingroup codecs
+
+ The EUC-KR codec provides conversion to and from EUC-KR, KR, the
+ main legacy encoding for Unix machines in Korea.
+
+ It was largely written by Mizi Research Inc. Here is the
+ copyright statement for the code as it was at the point of
+ contribution. Trolltech's subsequent modifications are covered by
+ the usual copyright for Qt.
+
+ \legalese
+
+ Copyright (C) 1999-2000 Mizi Research Inc. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codec-gbk.html
+ \title GBK Text Codec
+ \ingroup codecs
+
+ The GBK codec provides conversion to and from the Chinese
+ GB18030/GBK/GB2312 encoding.
+
+ GBK, formally the Chinese Internal Code Specification, is a commonly
+ used extension of GB 2312-80. Microsoft Windows uses it under the
+ name codepage 936.
+
+ GBK has been superseded by the new Chinese national standard
+ GB 18030-2000, which added a 4-byte encoding while remaining
+ compatible with GB2312 and GBK. The new GB 18030-2000 may be described
+ as a special encoding of Unicode 3.x and ISO-10646-1.
+
+ Special thanks to charset gurus Markus Scherer (IBM),
+ Dirk Meyer (Adobe Systems) and Ken Lunde (Adobe Systems) for publishing
+ an excellent GB 18030-2000 summary and specification on the Internet.
+ Some must-read documents are:
+
+ \list
+ \o \l{ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/pdf/GB18030_Summary.pdf}
+ \o \l{http://oss.software.ibm.com/cvs/icu/~checkout~/charset/source/gb18030/gb18030.html}
+ \o \l{http://oss.software.ibm.com/cvs/icu/~checkout~/charset/data/xml/gb-18030-2000.xml}
+ \endlist
+
+ The GBK codec was contributed to Qt by
+ Justin Yu \<justiny@turbolinux.com.cn\> and
+ Sean Chen \<seanc@turbolinux.com.cn\>. They may also be reached at
+ Yu Mingjian \<yumj@sun.ihep.ac.cn\>, \<yumingjian@china.com\>
+ Chen Xiangyang \<chenxy@sun.ihep.ac.cn\>
+
+ The GB18030 codec Qt functions were contributed to Qt by
+ James Su \<suzhe@gnuchina.org\>, \<suzhe@turbolinux.com.cn\>
+ who pioneered much of GB18030 development on GNU/Linux systems.
+
+ The GB18030 codec was contributed to Qt by
+ Anthony Fok \<anthony@thizlinux.com\>, \<foka@debian.org\>
+ using a Perl script to generate C++ tables from gb-18030-2000.xml
+ while merging contributions from James Su, Justin Yu and Sean Chen.
+ A copy of the source Perl script is available at
+ \l{http://people.debian.org/~foka/gb18030/gen-qgb18030codec.pl}
+
+ The copyright notice for their code follows:
+
+ \legalese
+ Copyright (C) 2000 TurboLinux, Inc. Written by Justin Yu and Sean Chen. \BR
+ Copyright (C) 2001, 2002 Turbolinux, Inc. Written by James Su. \BR
+ Copyright (C) 2001, 2002 ThizLinux Laboratory Ltd. Written by Anthony Fok.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codecs-jis.html
+ \title ISO 2022-JP (JIS) Text Codec
+ \ingroup codecs
+
+ The JIS codec provides conversion to and from ISO 2022-JP.
+
+ The environment variable \c UNICODEMAP_JP can be used to
+ fine-tune the JIS, Shift-JIS, and EUC-JP codecs. The mapping
+ names are as for the Japanese XML working group's \link
+ http://www.y-adagio.com/public/standards/tr_xml_jpf/toc.htm XML
+ Japanese Profile\endlink, because it names and explains all the
+ widely used mappings. Here are brief descriptions, written by
+ Serika Kurusugawa:
+
+ \list
+
+ \o "unicode-0.9" or "unicode-0201" for Unicode style. This assumes
+ JISX0201 for 0x00-0x7f. (0.9 is a table version of jisx02xx mapping
+ used for Unicode 1.1.)
+
+ \o "unicode-ascii" This assumes US-ASCII for 0x00-0x7f; some
+ chars (JISX0208 0x2140 and JISX0212 0x2237) are different from
+ Unicode 1.1 to avoid conflict.
+
+ \o "open-19970715-0201" ("open-0201" for convenience) or
+ "jisx0221-1995" for JISX0221-JISX0201 style. JIS X 0221 is JIS
+ version of Unicode, but a few chars (0x5c, 0x7e, 0x2140, 0x216f,
+ 0x2131) are different from Unicode 1.1. This is used when 0x5c is
+ treated as YEN SIGN.
+
+ \o "open-19970715-ascii" ("open-ascii" for convenience) for
+ JISX0221-ASCII style. This is used when 0x5c is treated as REVERSE
+ SOLIDUS.
+
+ \o "open-19970715-ms" ("open-ms" for convenience) or "cp932" for
+ Microsoft Windows style. Windows Code Page 932. Some chars (0x2140,
+ 0x2141, 0x2142, 0x215d, 0x2171, 0x2172) are different from Unicode
+ 1.1.
+
+ \o "jdk1.1.7" for Sun's JDK style. Same as Unicode 1.1, except that
+ JIS 0x2140 is mapped to UFF3C. Either ASCII or JISX0201 can be used
+ for 0x00-0x7f.
+
+ \endlist
+
+ In addition, the extensions "nec-vdc", "ibm-vdc" and "udc" are
+ supported.
+
+ For example, if you want to use Unicode style conversion but with
+ NEC's extension, set \c UNICODEMAP_JP to \c {unicode-0.9,
+ nec-vdc}. (You will probably need to quote that in a shell
+ command.)
+
+ Most of the code here was written by Serika Kurusugawa,
+ a.k.a. Junji Takagi, and is included in Qt with the author's
+ permission and the grateful thanks of the Trolltech team. Here is
+ the copyright statement for that code:
+
+ \legalese
+
+ Copyright (C) 1999 Serika Kurusugawa. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS".
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codec-sjis.html
+ \title Shift-JIS Text Codec
+ \ingroup codecs
+
+ The Shift-JIS codec provides conversion to and from Shift-JIS, an
+ encoding of JIS X 0201 Latin, JIS X 0201 Kana and JIS X 0208.
+
+ The environment variable \c UNICODEMAP_JP can be used to
+ fine-tune the codec. The \l{ISO 2022-JP (JIS) Text Codec}
+ documentation describes how to use this variable.
+
+ Most of the code here was written by Serika Kurusugawa, a.k.a.
+ Junji Takagi, and is included in Qt with the author's permission
+ and the grateful thanks of the Trolltech team. Here is the
+ copyright statement for the code as it was at the point of
+ contribution. Trolltech's subsequent modifications are covered by
+ the usual copyright for Qt.
+
+ \legalese
+
+ Copyright (C) 1999 Serika Kurusugawa. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS".
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
+
+/*!
+ \page codec-tscii.html
+ \title TSCII Text Codec
+ \ingroup codecs
+
+ The TSCII codec provides conversion to and from the Tamil TSCII
+ encoding.
+
+ TSCII, formally the Tamil Standard Code Information Interchange
+ specification, is a commonly used charset for Tamils. The
+ official page for the standard is at
+ \link http://www.tamil.net/tscii/ http://www.tamil.net/tscii/\endlink
+
+ This codec uses the mapping table found at
+ \link http://www.geocities.com/Athens/5180/tsciiset.html
+ http://www.geocities.com/Athens/5180/tsciiset.html\endlink.
+ Tamil uses composed Unicode which might cause some
+ problems if you are using Unicode fonts instead of TSCII fonts.
+
+ Most of the code was written by Hans Petter Bieker and is
+ included in Qt with the author's permission and the grateful
+ thanks of the Trolltech team. Here is the copyright statement for
+ the code as it was at the point of contribution. Trolltech's
+ subsequent modifications are covered by the usual copyright for
+ Qt:
+
+ \legalese
+
+ Copyright (c) 2000 Hans Petter Bieker. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ \list 1
+ \o Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ \o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ \endlist
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+ \endlegalese
+*/
diff --git a/doc/src/commercialeditions.qdoc b/doc/src/commercialeditions.qdoc
new file mode 100644
index 0000000..987468c
--- /dev/null
+++ b/doc/src/commercialeditions.qdoc
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page commercialeditions.html
+ \title Qt Commercial Editions
+ \ingroup licensing
+ \brief Information about the license and features of the Commercial Edition.
+
+ \keyword Qt Full Framework Edition
+ \keyword Qt GUI Framework Edition
+
+ Two editions of Qt are available under a commercial license:
+ Qt GUI Framework Edition, and Qt Full Framework Edition.
+
+ If you want to develop Free or Open Source software for release using a recognized
+ Open Source license, you can use the \l{Open Source Versions of Qt}.
+
+ The table below summarizes the differences between the three
+ commercial editions:
+
+ \table 75%
+ \header \o{1,2} Features \o{2,1} Editions
+ \header \o Qt GUI Framework \o Qt Full Framework
+ \row \o \l{QtCore}{Qt Core classes (QtCore)} \o \bold{X} \o \bold{X}
+ \row \o \l{QtGui}{Qt GUI classes (QtGui)} \o \bold{(X)} \o \bold{X}
+ \row \o \l{Graphics View Classes} (part of QtGui) \o \o \bold{X}
+ \row \o \l{QtNetwork}{Networking (QtNetwork)} \o \o \bold{X}
+ \row \o \l{QtOpenGL}{OpenGL (QtOpenGL)} \o \o \bold{X}
+ \row \o \l{QtScript}{Scripting (QtScript)} \o \o \bold{X}
+ \row \o \l{QtScriptTools}{Script Debugging (QtScriptTools)}\o \o \bold{X}
+ \row \o \l{QtSql}{Database/SQL (QtSql)} \o \o \bold{X}
+ \row \o \l{QtSvg}{SVG (QtSvg)} \o \o \bold{X}
+ \row \o \l{QtWebKit}{WebKit integration (QtWebKit)} \o \o \bold{X}
+ \row \o \l{QtXml}{XML (QtXml)} \o \o \bold{X}
+ \row \o \l{QtXmlPatterns}{XQuery and XPath (QtXmlPatterns)}\o \o \bold{X}
+ \row \o \l{Qt3Support}{Qt 3 Support (Qt3Support)} \o \bold{(X)} \o \bold{X}
+ \row \o \l{QtHelp}{Help system (QtHelp)} \o \o \bold{X}
+ \row \o \l{QtDBus}{D-Bus IPC support (QtDBus)} \o \bold{X} \o \bold{X}
+ \row \o \l{QtDesigner}{\QD extension classes (QtDesigner)} \o \o \bold{X}
+ \row \o \l{QtTest}{Unit testing framework (QtTest)} \o \bold{X} \o \bold{X}
+ \row \o \l{QtUiTools}{Run-time form handling (QtUiTools)} \o \o \bold{X}
+ \row \o \l{Phonon Module}{Phonon Multimedia Framework} \o \o \bold{X}
+ \row \o \l{ActiveQt} \o \o \bold{<X>}
+ \endtable
+
+ \bold{(X)} The Qt GUI Framework Edition contains selected classes from the QtGui and
+ Qt3Support modules corresponding to the functionality available in the Qt 3 Professional
+ Edition.
+
+ \bold{<X>} The ActiveQt module is only available on Windows.
+
+ Lists of the classes available in each edition are available on the
+ following pages:
+
+ \list
+ \o \l{Qt GUI Framework Edition Classes}
+ \o \l{Qt Full Framework Edition Classes}
+ \endlist
+
+ Please see the \l{Supported Platforms}{list of supported
+ platforms} for up-to-date information about the various platforms
+ and compilers that Qt supports.
+
+ On the Qt web site, you can find a
+ \l{Qt Licensing Overview} and information on \l{Qt License Pricing}
+ for commercial editions of Qt and other Qt-related products.
+
+ To purchase, please visit the \l{How to Order}{online order
+ form}.
+
+ For further information and assistance, please contact Qt
+ sales.
+
+ Email: \l{mailto:qt-sales@nokia.com}{qt-sales@nokia.com}.
+
+ Phone, U.S. office (for North America): \bold{1-650-813-1676}.
+
+ Phone, Norway office (for the rest of the world): \bold{+47 21 60
+ 48 00}.
+*/
+
+/*!
+ \page full-framework-edition-classes.html
+ \title Qt Full Framework Edition Classes
+ \ingroup classlists
+
+ \generatelist{classesbyedition Desktop}
+*/
+
+/*!
+ \page gui-framework-edition-classes.html
+ \title Qt GUI Framework Edition Classes
+ \ingroup classlists
+
+ \generatelist{classesbyedition DesktopLight}
+*/
diff --git a/doc/src/compatclasses.qdoc b/doc/src/compatclasses.qdoc
new file mode 100644
index 0000000..62bbdb5
--- /dev/null
+++ b/doc/src/compatclasses.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page compatclasses.html
+ \title Qt 3 Compatibility Classes
+ \ingroup classlists
+
+ This is a list of the classes that Qt provides for compatibility
+ with Qt 3. The vast majority of these are provided by the
+ Qt3Support module.
+
+ \generatelist compatclasses
+
+ \sa {Qt's Classes}, {Qt's Modules}
+*/
diff --git a/doc/src/containers.qdoc b/doc/src/containers.qdoc
new file mode 100644
index 0000000..d107277
--- /dev/null
+++ b/doc/src/containers.qdoc
@@ -0,0 +1,775 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group containers
+ \title Generic Containers
+ \ingroup architecture
+ \ingroup groups
+ \keyword container class
+ \keyword container classes
+
+ \brief Qt's template-based container classes.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ The Qt library provides a set of general purpose template-based
+ container classes. These classes can be used to store items of a
+ specified type. For example, if you need a resizable array of
+ \l{QString}s, use QVector<QString>.
+
+ These container classes are designed to be lighter, safer, and
+ easier to use than the STL containers. If you are unfamiliar with
+ the STL, or prefer to do things the "Qt way", you can use these
+ classes instead of the STL classes.
+
+ The container classes are \l{implicitly shared}, they are
+ \l{reentrant}, and they are optimized for speed, low memory
+ consumption, and minimal inline code expansion, resulting in
+ smaller executables. In addition, they are \l{thread-safe}
+ in situations where they are used as read-only containers
+ by all threads used to access them.
+
+ For traversing the items stored in a container, you can use one
+ of two types of iterators: \l{Java-style iterators} and
+ \l{STL-style iterators}. The Java-style iterators are easier to
+ use and provide high-level functionality, whereas the STL-style
+ iterators are slightly more efficient and can be used together
+ with Qt's and STL's \l{generic algorithms}.
+
+ Qt also offers a \l{foreach} keyword that make it very
+ easy to iterate over all the items stored in a container.
+
+ \section1 The Container Classes
+
+ Qt provides the following container classes:
+
+ \table
+ \header \o Class \o Summary
+
+ \row \o \l{QList}<T>
+ \o This is by far the most commonly used container class. It
+ stores a list of values of a given type (T) that can be accessed
+ by index. Internally, the QList is implemented using an array,
+ ensuring that index-based access is very fast.
+
+ Items can be added at either end of the list using
+ QList::append() and QList::prepend(), or they can be inserted in
+ the middle using QList::insert(). More than any other container
+ class, QList is highly optimized to expand to as little code as
+ possible in the executable. QStringList inherits from
+ QList<QString>.
+
+ \row \o \l{QLinkedList}<T>
+ \o This is similar to QList, except that it uses
+ iterators rather than integer indexes to access items. It also
+ provides better performance than QList when inserting in the
+ middle of a huge list, and it has nicer iterator semantics.
+ (Iterators pointing to an item in a QLinkedList remain valid as
+ long as the item exists, whereas iterators to a QList can become
+ invalid after any insertion or removal.)
+
+ \row \o \l{QVector}<T>
+ \o This stores an array of values of a given type at adjacent
+ positions in memory. Inserting at the front or in the middle of
+ a vector can be quite slow, because it can lead to large numbers
+ of items having to be moved by one position in memory.
+
+ \row \o \l{QStack}<T>
+ \o This is a convenience subclass of QVector that provides
+ "last in, first out" (LIFO) semantics. It adds the following
+ functions to those already present in QVector:
+ \l{QStack::push()}{push()}, \l{QStack::pop()}{pop()},
+ and \l{QStack::top()}{top()}.
+
+ \row \o \l{QQueue}<T>
+ \o This is a convenience subclass of QList that provides
+ "first in, first out" (FIFO) semantics. It adds the following
+ functions to those already present in QList:
+ \l{QQueue::enqueue()}{enqueue()},
+ \l{QQueue::dequeue()}{dequeue()}, and \l{QQueue::head()}{head()}.
+
+ \row \o \l{QSet}<T>
+ \o This provides a single-valued mathematical set with fast
+ lookups.
+
+ \row \o \l{QMap}<Key, T>
+ \o This provides a dictionary (associative array) that maps keys
+ of type Key to values of type T. Normally each key is associated
+ with a single value. QMap stores its data in Key order; if order
+ doesn't matter QHash is a faster alternative.
+
+ \row \o \l{QMultiMap}<Key, T>
+ \o This is a convenience subclass of QMap that provides a nice
+ interface for multi-valued maps, i.e. maps where one key can be
+ associated with multiple values.
+
+ \row \o \l{QHash}<Key, T>
+ \o This has almost the same API as QMap, but provides
+ significantly faster lookups. QHash stores its data in an
+ arbitrary order.
+
+ \row \o \l{QMultiHash}<Key, T>
+ \o This is a convenience subclass of QHash that
+ provides a nice interface for multi-valued hashes.
+
+ \endtable
+
+ Containers can be nested. For example, it is perfectly possible
+ to use a QMap<QString, QList<int> >, where the key type is
+ QString and the value type QList<int>. The only pitfall is that
+ you must insert a space between the closing angle brackets (>);
+ otherwise the C++ compiler will misinterpret the two >'s as a
+ right-shift operator (>>) and report a syntax error.
+
+ The containers are defined in individual header files with the
+ same name as the container (e.g., \c <QLinkedList>). For
+ convenience, the containers are forward declared in \c
+ <QtContainerFwd>.
+
+ \keyword assignable data type
+ \keyword assignable data types
+
+ The values stored in the various containers can be of any
+ \e{assignable data type}. To qualify, a type must provide a
+ default constructor, a copy constructor, and an assignment
+ operator. This covers most data types you are likely to want to
+ store in a container, including basic types such as \c int and \c
+ double, pointer types, and Qt data types such as QString, QDate,
+ and QTime, but it doesn't cover QObject or any QObject subclass
+ (QWidget, QDialog, QTimer, etc.). If you attempt to instantiate a
+ QList<QWidget>, the compiler will complain that QWidget's copy
+ constructor and assignment operators are disabled. If you want to
+ store these kinds of objects in a container, store them as
+ pointers, for example as QList<QWidget *>.
+
+ Here's an example custom data type that meets the requirement of
+ an assignable data type:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 0
+
+ If we don't provide a copy constructor or an assignment operator,
+ C++ provides a default implementation that performs a
+ member-by-member copy. In the example above, that would have been
+ sufficient. Also, if you don't provide any constructors, C++
+ provides a default constructor that initializes its member using
+ default constructors. Although it doesn't provide any
+ explicit constructors or assignment operator, the following data
+ type can be stored in a container:
+
+ \snippet doc/src/snippets/streaming/main.cpp 0
+
+ Some containers have additional requirements for the data types
+ they can store. For example, the Key type of a QMap<Key, T> must
+ provide \c operator<(). Such special requirements are documented
+ in a class's detailed description. In some cases, specific
+ functions have special requirements; these are described on a
+ per-function basis. The compiler will always emit an error if a
+ requirement isn't met.
+
+ Qt's containers provide operator<<() and operator>>() so that they
+ can easily be read and written using a QDataStream. This means
+ that the data types stored in the container must also support
+ operator<<() and operator>>(). Providing such support is
+ straightforward; here's how we could do it for the Movie struct
+ above:
+
+ \snippet doc/src/snippets/streaming/main.cpp 1
+ \codeline
+ \snippet doc/src/snippets/streaming/main.cpp 2
+
+ \keyword default-constructed values
+
+ The documentation of certain container class functions refer to
+ \e{default-constructed values}; for example, QVector
+ automatically initializes its items with default-constructed
+ values, and QMap::value() returns a default-constructed value if
+ the specified key isn't in the map. For most value types, this
+ simply means that a value is created using the default
+ constructor (e.g. an empty string for QString). But for primitive
+ types like \c{int} and \c{double}, as well as for pointer types,
+ the C++ language doesn't specify any initialization; in those
+ cases, Qt's containers automatically initialize the value to 0.
+
+ \section1 The Iterator Classes
+
+ Iterators provide a uniform means to access items in a container.
+ Qt's container classes provide two types of iterators: Java-style
+ iterators and STL-style iterators.
+
+ \section2 Java-Style Iterators
+
+ The Java-style iterators are new in Qt 4 and are the standard
+ ones used in Qt applications. They are more convenient to use than
+ the STL-style iterators, at the price of being slightly less
+ efficient. Their API is modelled on Java's iterator classes.
+
+ For each container class, there are two Java-style iterator data
+ types: one that provides read-only access and one that provides
+ read-write access.
+
+ \table
+ \header \o Containers \o Read-only iterator
+ \o Read-write iterator
+ \row \o QList<T>, QQueue<T> \o QListIterator<T>
+ \o QMutableListIterator<T>
+ \row \o QLinkedList<T> \o QLinkedListIterator<T>
+ \o QMutableLinkedListIterator<T>
+ \row \o QVector<T>, QStack<T> \o QVectorIterator<T>
+ \o QMutableVectorIterator<T>
+ \row \o QSet<T> \o QSetIterator<T>
+ \o QMutableSetIterator<T>
+ \row \o QMap<Key, T>, QMultiMap<Key, T> \o QMapIterator<Key, T>
+ \o QMutableMapIterator<Key, T>
+ \row \o QHash<Key, T>, QMultiHash<Key, T> \o QHashIterator<Key, T>
+ \o QMutableHashIterator<Key, T>
+ \endtable
+
+ In this discussion, we will concentrate on QList and QMap. The
+ iterator types for QLinkedList, QVector, and QSet have exactly
+ the same interface as QList's iterators; similarly, the iterator
+ types for QHash have the same interface as QMap's iterators.
+
+ Unlike STL-style iterators (covered \l{STL-style
+ iterators}{below}), Java-style iterators point \e between items
+ rather than directly \e at items. For this reason, they are
+ either pointing to the very beginning of the container (before
+ the first item), at the very end of the container (after the last
+ item), or between two items. The diagram below shows the valid
+ iterator positions as red arrows for a list containing four
+ items:
+
+ \img javaiterators1.png
+
+ Here's a typical loop for iterating through all the elements of a
+ QList<QString> in order and printing them to the console:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 1
+
+ It works as follows: The QList to iterate over is passed to the
+ QListIterator constructor. At that point, the iterator is located
+ just in front of the first item in the list (before item "A").
+ Then we call \l{QListIterator::hasNext()}{hasNext()} to
+ check whether there is an item after the iterator. If there is, we
+ call \l{QListIterator::next()}{next()} to jump over that
+ item. The next() function returns the item that it jumps over. For
+ a QList<QString>, that item is of type QString.
+
+ Here's how to iterate backward in a QList:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 2
+
+ The code is symmetric with iterating forward, except that we
+ start by calling \l{QListIterator::toBack()}{toBack()}
+ to move the iterator after the last item in the list.
+
+ The diagram below illustrates the effect of calling
+ \l{QListIterator::next()}{next()} and
+ \l{QListIterator::previous()}{previous()} on an iterator:
+
+ \img javaiterators2.png
+
+ The following table summarizes the QListIterator API:
+
+ \table
+ \header \o Function \o Behavior
+ \row \o \l{QListIterator::toFront()}{toFront()}
+ \o Moves the iterator to the front of the list (before the first item)
+ \row \o \l{QListIterator::toBack()}{toBack()}
+ \o Moves the iterator to the back of the list (after the last item)
+ \row \o \l{QListIterator::hasNext()}{hasNext()}
+ \o Returns true if the iterator isn't at the back of the list
+ \row \o \l{QListIterator::next()}{next()}
+ \o Returns the next item and advances the iterator by one position
+ \row \o \l{QListIterator::peekNext()}{peekNext()}
+ \o Returns the next item without moving the iterator
+ \row \o \l{QListIterator::hasPrevious()}{hasPrevious()}
+ \o Returns true if the iterator isn't at the front of the list
+ \row \o \l{QListIterator::previous()}{previous()}
+ \o Returns the previous item and moves the iterator back by one position
+ \row \o \l{QListIterator::peekPrevious()}{peekPrevious()}
+ \o Returns the previous item without moving the iterator
+ \endtable
+
+ QListIterator provides no functions to insert or remove items
+ from the list as we iterate. To accomplish this, you must use
+ QMutableListIterator. Here's an example where we remove all
+ odd numbers from a QList<int> using QMutableListIterator:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 3
+
+ The next() call in the loop is made every time. It jumps over the
+ next item in the list. The
+ \l{QMutableListIterator::remove()}{remove()} function removes the
+ last item that we jumped over from the list. The call to
+ \l{QMutableListIterator::remove()}{remove()} does not invalidate
+ the iterator, so it is safe to continue using it. This works just
+ as well when iterating backward:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 4
+
+ If we just want to modify the value of an existing item, we can
+ use \l{QMutableListIterator::setValue()}{setValue()}. In the code
+ below, we replace any value larger than 128 with 128:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 5
+
+ Just like \l{QMutableListIterator::remove()}{remove()},
+ \l{QMutableListIterator::setValue()}{setValue()} operates on the
+ last item that we jumped over. If we iterate forward, this is the
+ item just before the iterator; if we iterate backward, this is
+ the item just after the iterator.
+
+ The \l{QMutableListIterator::next()}{next()} function returns a
+ non-const reference to the item in the list. For simple
+ operations, we don't even need
+ \l{QMutableListIterator::setValue()}{setValue()}:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 6
+
+ As mentioned above, QLinkedList's, QVector's, and QSet's iterator
+ classes have exactly the same API as QList's. We will now turn to
+ QMapIterator, which is somewhat different because it iterates on
+ (key, value) pairs.
+
+ Like QListIterator, QMapIterator provides
+ \l{QMapIterator::toFront()}{toFront()},
+ \l{QMapIterator::toBack()}{toBack()},
+ \l{QMapIterator::hasNext()}{hasNext()},
+ \l{QMapIterator::next()}{next()},
+ \l{QMapIterator::peekNext()}{peekNext()},
+ \l{QMapIterator::hasPrevious()}{hasPrevious()},
+ \l{QMapIterator::previous()}{previous()}, and
+ \l{QMapIterator::peekPrevious()}{peekPrevious()}. The key and
+ value components are extracted by calling key() and value() on
+ the object returned by next(), peekNext(), previous(), or
+ peekPrevious().
+
+ The following example removes all (capital, country) pairs where
+ the capital's name ends with "City":
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 7
+
+ QMapIterator also provides a key() and a value() function that
+ operate directly on the iterator and that return the key and
+ value of the last item that the iterator jumped above. For
+ example, the following code copies the contents of a QMap into a
+ QHash:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 8
+
+ If we want to iterate through all the items with the same
+ value, we can use \l{QMapIterator::findNext()}{findNext()}
+ or \l{QMapIterator::findPrevious()}{findPrevious()}.
+ Here's an example where we remove all the items with a particular
+ value:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 9
+
+ \section2 STL-Style Iterators
+
+ STL-style iterators have been available since the release of Qt
+ 2.0. They are compatible with Qt's and STL's \l{generic
+ algorithms} and are optimized for speed.
+
+ For each container class, there are two STL-style iterator types:
+ one that provides read-only access and one that provides
+ read-write access. Read-only iterators should be used wherever
+ possible because they are faster than read-write iterators.
+
+ \table
+ \header \o Containers \o Read-only iterator
+ \o Read-write iterator
+ \row \o QList<T>, QQueue<T> \o QList<T>::const_iterator
+ \o QList<T>::iterator
+ \row \o QLinkedList<T> \o QLinkedList<T>::const_iterator
+ \o QLinkedList<T>::iterator
+ \row \o QVector<T>, QStack<T> \o QVector<T>::const_iterator
+ \o QVector<T>::iterator
+ \row \o QSet<T> \o QSet<T>::const_iterator
+ \o QSet<T>::iterator
+ \row \o QMap<Key, T>, QMultiMap<Key, T> \o QMap<Key, T>::const_iterator
+ \o QMap<Key, T>::iterator
+ \row \o QHash<Key, T>, QMultiHash<Key, T> \o QHash<Key, T>::const_iterator
+ \o QHash<Key, T>::iterator
+ \endtable
+
+ The API of the STL iterators is modelled on pointers in an array.
+ For example, the \c ++ operator advances the iterator to the next
+ item, and the \c * operator returns the item that the iterator
+ points to. In fact, for QVector and QStack, which store their
+ items at adjacent memory positions, the
+ \l{QVector::iterator}{iterator} type is just a typedef for \c{T *},
+ and the \l{QVector::iterator}{const_iterator} type is
+ just a typedef for \c{const T *}.
+
+ In this discussion, we will concentrate on QList and QMap. The
+ iterator types for QLinkedList, QVector, and QSet have exactly
+ the same interface as QList's iterators; similarly, the iterator
+ types for QHash have the same interface as QMap's iterators.
+
+ Here's a typical loop for iterating through all the elements of a
+ QList<QString> in order and converting them to lowercase:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 10
+
+ Unlike \l{Java-style iterators}, STL-style iterators point
+ directly at items. The begin() function of a container returns an
+ iterator that points to the first item in the container. The
+ end() function of a container returns an iterator to the
+ imaginary item one position past the last item in the container.
+ end() marks an invalid position; it must never be dereferenced.
+ It is typically used in a loop's break condition. If the list is
+ empty, begin() equals end(), so we never execute the loop.
+
+ The diagram below shows the valid iterator positions as red
+ arrows for a vector containing four items:
+
+ \img stliterators1.png
+
+ Iterating backward with an STL-style iterator requires us to
+ decrement the iterator \e before we access the item. This
+ requires a \c while loop:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 11
+
+ In the code snippets so far, we used the unary \c * operator to
+ retrieve the item (of type QString) stored at a certain iterator
+ position, and we then called QString::toLower() on it. Most C++
+ compilers also allow us to write \c{i->toLower()}, but some
+ don't.
+
+ For read-only access, you can use const_iterator, constBegin(),
+ and constEnd(). For example:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 12
+
+ The following table summarizes the STL-style iterators' API:
+
+ \table
+ \header \o Expression \o Behavior
+ \row \o \c{*i} \o Returns the current item
+ \row \o \c{++i} \o Advances the iterator to the next item
+ \row \o \c{i += n} \o Advances the iterator by \c n items
+ \row \o \c{--i} \o Moves the iterator back by one item
+ \row \o \c{i -= n} \o Moves the iterator back by \c n items
+ \row \o \c{i - j} \o Returns the number of items between iterators \c i and \c j
+ \endtable
+
+ The \c{++} and \c{--} operators are available both as prefix
+ (\c{++i}, \c{--i}) and postfix (\c{i++}, \c{i--}) operators. The
+ prefix versions modify the iterators and return a reference to
+ the modified iterator; the postfix versions take a copy of the
+ iterator before they modify it, and return that copy. In
+ expressions where the return value is ignored, we recommend that
+ you use the prefix operators (\c{++i}, \c{--i}), as these are
+ slightly faster.
+
+ For non-const iterator types, the return value of the unary \c{*}
+ operator can be used on the left side of the assignment operator.
+
+ For QMap and QHash, the \c{*} operator returns the value
+ component of an item. If you want to retrieve the key, call key()
+ on the iterator. For symmetry, the iterator types also provide a
+ value() function to retrieve the value. For example, here's how
+ we would print all items in a QMap to the console:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 13
+
+ Thanks to \l{implicit sharing}, it is very inexpensive for a
+ function to return a container per value. The Qt API contains
+ dozens of functions that return a QList or QStringList per value
+ (e.g., QSplitter::sizes()). If you want to iterate over these
+ using an STL iterator, you should always take a copy of the
+ container and iterate over the copy. For example:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 14
+
+ This problem doesn't occur with functions that return a const or
+ non-const reference to a container.
+
+ \l{Implicit sharing} has another consequence on STL-style
+ iterators: You must not take a copy of a container while
+ non-const iterators are active on that container. Java-style
+ iterators don't suffer from that limitation.
+
+ \keyword foreach
+ \section1 The foreach Keyword
+
+ If you just want to iterate over all the items in a container
+ in order, you can use Qt's \c foreach keyword. The keyword is a
+ Qt-specific addition to the C++ language, and is implemented
+ using the preprocessor.
+
+ Its syntax is: \c foreach (\e variable, \e container) \e
+ statement. For example, here's how to use \c foreach to iterate
+ over a QLinkedList<QString>:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 15
+
+ The \c foreach code is significantly shorter than the equivalent
+ code that uses iterators:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 16
+
+ Unless the data type contains a comma (e.g., \c{QPair<int,
+ int>}), the variable used for iteration can be defined within the
+ \c foreach statement:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 17
+
+ And like any other C++ loop construct, you can use braces around
+ the body of a \c foreach loop, and you can use \c break to leave
+ the loop:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 18
+
+ With QMap and QHash, \c foreach accesses the value component of
+ the (key, value) pairs. If you want to iterate over both the keys
+ and the values, you can use iterators (which are fastest), or you
+ can write code like this:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 19
+
+ For a multi-valued map:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 20
+
+ Qt automatically takes a copy of the container when it enters a
+ \c foreach loop. If you modify the container as you are
+ iterating, that won't affect the loop. (If you don't modify the
+ container, the copy still takes place, but thanks to \l{implicit
+ sharing} copying a container is very fast.) Similarly, declaring
+ the variable to be a non-const reference, in order to modify the
+ current item in the list will not work either.
+
+ In addition to \c foreach, Qt also provides a \c forever
+ pseudo-keyword for infinite loops:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 21
+
+ If you're worried about namespace pollution, you can disable
+ these macros by adding the following line to your \c .pro file:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 22
+
+ \section1 Other Container-Like Classes
+
+ Qt includes three template classes that resemble containers in
+ some respects. These classes don't provide iterators and cannot
+ be used with the \c foreach keyword.
+
+ \list
+ \o QVarLengthArray<T, Prealloc> provides a low-level
+ variable-length array. It can be used instead of QVector in
+ places where speed is particularly important.
+
+ \o QCache<Key, T> provides a cache to store objects of a certain
+ type T associated with keys of type Key.
+
+ \o QPair<T1, T2> stores a pair of elements.
+ \endlist
+
+ Additional non-template types that compete with Qt's template
+ containers are QBitArray, QByteArray, QString, and QStringList.
+
+ \section1 Algorithmic Complexity
+
+ Algorithmic complexity is concerned about how fast (or slow) each
+ function is as the number of items in the container grow. For
+ example, inserting an item in the middle of a QLinkedList is an
+ extremely fast operation, irrespective of the number of items
+ stored in the QLinkedList. On the other hand, inserting an item
+ in the middle of a QVector is potentially very expensive if the
+ QVector contains many items, since half of the items must be
+ moved one position in memory.
+
+ To describe algorithmic complexity, we use the following
+ terminology, based on the "big Oh" notation:
+
+ \keyword constant time
+ \keyword logarithmic time
+ \keyword linear time
+ \keyword linear-logarithmic time
+ \keyword quadratic time
+
+ \list
+ \o \bold{Constant time:} O(1). A function is said to run in constant
+ time if it requires the same amount of time no matter how many
+ items are present in the container. One example is
+ QLinkedList::insert().
+
+ \o \bold{Logarithmic time:} O(log \e n). A function that runs in
+ logarithmic time is a function whose running time is
+ proportional to the logarithm of the number of items in the
+ container. One example is qBinaryFind().
+
+ \o \bold{Linear time:} O(\e n). A function that runs in linear time
+ will execute in a time directly proportional to the number of
+ items stored in the container. One example is
+ QVector::insert().
+
+ \o \bold{Linear-logarithmic time:} O(\e{n} log \e n). A function
+ that runs in linear-logarithmic time is asymptotically slower
+ than a linear-time function, but faster than a quadratic-time
+ function.
+
+ \o \bold{Quadratic time:} O(\e{n}\unicode{178}). A quadratic-time function
+ executes in a time that is proportional to the square of the
+ number of items stored in the container.
+ \endlist
+
+ The following table summarizes the algorithmic complexity of Qt's
+ sequential container classes:
+
+ \table
+ \header \o \o Index lookup \o Insertion \o Prepending \o Appending
+ \row \o QLinkedList<T> \o O(\e n) \o O(1) \o O(1) \o O(1)
+ \row \o QList<T> \o O(1) \o O(n) \o Amort. O(1) \o Amort. O(1)
+ \row \o QVector<T> \o O(1) \o O(n) \o O(n) \o Amort. O(1)
+ \endtable
+
+ In the table, "Amort." stands for "amortized behavior". For
+ example, "Amort. O(1)" means that if you call the function
+ only once, you might get O(\e n) behavior, but if you call it
+ multiple times (e.g., \e n times), the average behavior will be
+ O(1).
+
+ The following table summarizes the algorithmic complexity of Qt's
+ associative containers and sets:
+
+ \table
+ \header \o{1,2} \o{2,1} Key lookup \o{2,1} Insertion
+ \header \o Average \o Worst case \o Average \o Worst case
+ \row \o QMap<Key, T> \o O(log \e n) \o O(log \e n) \o O(log \e n) \o O(log \e n)
+ \row \o QMultiMap<Key, T> \o O((log \e n) \o O(log \e n) \o O(log \e n) \o O(log \e n)
+ \row \o QHash<Key, T> \o Amort. O(1) \o O(\e n) \o Amort. O(1) \o O(\e n)
+ \row \o QSet<Key> \o Amort. O(1) \o O(\e n) \o Amort. O(1) \o O(\e n)
+ \endtable
+
+ With QVector, QHash, and QSet, the performance of appending items
+ is amortized O(log \e n). It can be brought down to O(1) by
+ calling QVector::reserve(), QHash::reserve(), or QSet::reserve()
+ with the expected number of items before you insert the items.
+ The next section discusses this topic in more depth.
+
+ \section1 Growth Strategies
+
+ QVector<T>, QString, and QByteArray store their items
+ contiguously in memory; QList<T> maintains an array of pointers
+ to the items it stores to provide fast index-based access (unless
+ T is a pointer type or a basic type of the size of a pointer, in
+ which case the value itself is stored in the array); QHash<Key,
+ T> keeps a hash table whose size is proportional to the number
+ of items in the hash. To avoid reallocating the data every single
+ time an item is added at the end of the container, these classes
+ typically allocate more memory than necessary.
+
+ Consider the following code, which builds a QString from another
+ QString:
+
+ \snippet doc/src/snippets/code/doc_src_containers.qdoc 23
+
+ We build the string \c out dynamically by appending one character
+ to it at a time. Let's assume that we append 15000 characters to
+ the QString string. Then the following 18 reallocations (out of a
+ possible 15000) occur when QString runs out of space: 4, 8, 12,
+ 16, 20, 52, 116, 244, 500, 1012, 2036, 4084, 6132, 8180, 10228,
+ 12276, 14324, 16372. At the end, the QString has 16372 Unicode
+ characters allocated, 15000 of which are occupied.
+
+ The values above may seem a bit strange, but here are the guiding
+ principles:
+ \list
+ \o QString allocates 4 characters at a time until it reaches size 20.
+ \o From 20 to 4084, it advances by doubling the size each time.
+ More precisely, it advances to the next power of two, minus
+ 12. (Some memory allocators perform worst when requested exact
+ powers of two, because they use a few bytes per block for
+ book-keeping.)
+ \o From 4084 on, it advances by blocks of 2048 characters (4096
+ bytes). This makes sense because modern operating systems
+ don't copy the entire data when reallocating a buffer; the
+ physical memory pages are simply reordered, and only the data
+ on the first and last pages actually needs to be copied.
+ \endlist
+
+ QByteArray and QList<T> use more or less the same algorithm as
+ QString.
+
+ QVector<T> also uses that algorithm for data types that can be
+ moved around in memory using memcpy() (including the basic C++
+ types, the pointer types, and Qt's \l{shared classes}) but uses a
+ different algorithm for data types that can only be moved by
+ calling the copy constructor and a destructor. Since the cost of
+ reallocating is higher in that case, QVector<T> reduces the
+ number of reallocations by always doubling the memory when
+ running out of space.
+
+ QHash<Key, T> is a totally different case. QHash's internal hash
+ table grows by powers of two, and each time it grows, the items
+ are relocated in a new bucket, computed as qHash(\e key) %
+ QHash::capacity() (the number of buckets). This remark applies to
+ QSet<T> and QCache<Key, T> as well.
+
+ For most applications, the default growing algorithm provided by
+ Qt does the trick. If you need more control, QVector<T>,
+ QHash<Key, T>, QSet<T>, QString, and QByteArray provide a trio of
+ functions that allow you to check and specify how much memory to
+ use to store the items:
+
+ \list
+ \o \l{QString::capacity()}{capacity()} returns the
+ number of items for which memory is allocated (for QHash and
+ QSet, the number of buckets in the hash table).
+ \o \l{QString::reserve()}{reserve}(\e size) explicitly
+ preallocates memory for \e size items.
+ \o \l{QString::squeeze()}{squeeze()} frees any memory
+ not required to store the items.
+ \endlist
+
+ If you know approximately how many items you will store in a
+ container, you can start by calling reserve(), and when you are
+ done populating the container, you can call squeeze() to release
+ the extra preallocated memory.
+*/
diff --git a/doc/src/coordsys.qdoc b/doc/src/coordsys.qdoc
new file mode 100644
index 0000000..604d233
--- /dev/null
+++ b/doc/src/coordsys.qdoc
@@ -0,0 +1,486 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Qt Coordinate System Documentation.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page coordsys.html
+ \title The Coordinate System
+ \ingroup architecture
+ \brief Information about the coordinate system used by the paint
+ system.
+
+ The coordinate system is controlled by the QPainter
+ class. Together with the QPaintDevice and QPaintEngine classes,
+ QPainter form the basis of Qt's painting system, Arthur. QPainter
+ is used to perform drawing operations, QPaintDevice is an
+ abstraction of a two-dimensional space that can be painted on
+ using a QPainter, and QPaintEngine provides the interface that the
+ painter uses to draw onto different types of devices.
+
+ The QPaintDevice class is the base class of objects that can be
+ painted: Its drawing capabilities are inherited by the QWidget,
+ QPixmap, QPicture, QImage, and QPrinter classes. The default
+ coordinate system of a paint device has its origin at the top-left
+ corner. The \e x values increase to the right and the \e y values
+ increase downwards. The default unit is one pixel on pixel-based
+ devices and one point (1/72 of an inch) on printers.
+
+ The mapping of the logical QPainter coordinates to the physical
+ QPaintDevice coordinates are handled by QPainter's transformation
+ matrix, viewport and "window". The logical and physical coordinate
+ systems coincide by default. QPainter also supports coordinate
+ transformations (e.g. rotation and scaling).
+
+ \tableofcontents
+
+ \section1 Rendering
+
+ \section2 Logical Representation
+
+ The size (width and height) of a graphics primitive always
+ correspond to its mathematical model, ignoring the width of the
+ pen it is rendered with:
+
+ \table
+ \row
+ \o \inlineimage coordinatesystem-rect.png
+ \o \inlineimage coordinatesystem-line.png
+ \row
+ \o QRect(1, 2, 6, 4)
+ \o QLine(2, 7, 6, 1)
+ \endtable
+
+ \section2 Aliased Painting
+
+ When drawing, the pixel rendering is controlled by the
+ QPainter::Antialiasing render hint.
+
+ The \l {QPainter::RenderHint}{RenderHint} enum is used to specify
+ flags to QPainter that may or may not be respected by any given
+ engine. The QPainter::Antialiasing value indicates that the engine
+ should antialias edges of primitives if possible, i.e. smoothing
+ the edges by using different color intensities.
+
+ But by default the painter is \e aliased and other rules apply:
+ When rendering with a one pixel wide pen the pixels will be
+ rendered to the \e {right and below the mathematically defined
+ points}. For example:
+
+ \table
+ \row
+ \o \inlineimage coordinatesystem-rect-raster.png
+ \o \inlineimage coordinatesystem-line-raster.png
+
+ \row
+ \o
+ \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 0
+
+ \o
+ \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 1
+ \endtable
+
+ When rendering with a pen with an even number of pixels, the
+ pixels will be rendered symetrically around the mathematical
+ defined points, while rendering with a pen with an odd number of
+ pixels, the spare pixel will be rendered to the right and below
+ the mathematical point as in the one pixel case. See the QRectF
+ diagrams below for concrete examples.
+
+ \table
+ \header
+ \o {3,1} QRectF
+ \row
+ \o \inlineimage qrect-diagram-zero.png
+ \o \inlineimage qrectf-diagram-one.png
+ \row
+ \o Logical representation
+ \o One pixel wide pen
+ \row
+ \o \inlineimage qrectf-diagram-two.png
+ \o \inlineimage qrectf-diagram-three.png
+ \row
+ \o Two pixel wide pen
+ \o Three pixel wide pen
+ \endtable
+
+ Note that for historical reasons the return value of the
+ QRect::right() and QRect::bottom() functions deviate from the true
+ bottom-right corner of the rectangle.
+
+ QRect's \l {QRect::right()}{right()} function returns \l
+ {QRect::left()}{left()} + \l {QRect::width()}{width()} - 1 and the
+ \l {QRect::bottom()}{bottom()} function returns \l
+ {QRect::top()}{top()} + \l {QRect::height()}{height()} - 1. The
+ bottom-right green point in the diagrams shows the return
+ coordinates of these functions.
+
+ We recommend that you simply use QRectF instead: The QRectF class
+ defines a rectangle in the plane using floating point coordinates
+ for accuracy (QRect uses integer coordinates), and the
+ QRectF::right() and QRectF::bottom() functions \e do return the
+ true bottom-right corner.
+
+ Alternatively, using QRect, apply \l {QRect::x()}{x()} + \l
+ {QRect::width()}{width()} and \l {QRect::y()}{y()} + \l
+ {QRect::height()}{height()} to find the bottom-right corner, and
+ avoid the \l {QRect::right()}{right()} and \l
+ {QRect::bottom()}{bottom()} functions.
+
+ \section2 Anti-aliased Painting
+
+ If you set QPainter's \l {QPainter::Antialiasing}{anti-aliasing}
+ render hint, the pixels will be rendered symetrically on both
+ sides of the mathematically defined points:
+
+ \table
+ \row
+ \o \inlineimage coordinatesystem-rect-antialias.png
+ \o \inlineimage coordinatesystem-line-antialias.png
+ \row
+ \o
+
+ \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 2
+
+ \o
+ \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 3
+ \endtable
+
+ \section1 Transformations
+
+ By default, the QPainter operates on the associated device's own
+ coordinate system, but it also has complete support for affine
+ coordinate transformations.
+
+ You can scale the coordinate system by a given offset using the
+ QPainter::scale() function, you can rotate it clockwise using the
+ QPainter::rotate() function and you can translate it (i.e. adding
+ a given offset to the points) using the QPainter::translate()
+ function.
+
+ \table
+ \row
+ \o \inlineimage qpainter-clock.png
+ \o \inlineimage qpainter-rotation.png
+ \o \inlineimage qpainter-scale.png
+ \o \inlineimage qpainter-translation.png
+ \row
+ \o nop
+ \o \l {QPainter::rotate()}{rotate()}
+ \o \l {QPainter::scale()}{scale()}
+ \o \l {QPainter::translate()}{translate()}
+ \endtable
+
+ You can also twist the coordinate system around the origin using
+ the QPainter::shear() function. See the \l {demos/affine}{Affine
+ Transformations} demo for a visualization of a sheared coordinate
+ system. All the transformation operations operate on QPainter's
+ transformation matrix that you can retrieve using the
+ QPainter::worldMatrix() function. A matrix transforms a point in the
+ plane to another point.
+
+ If you need the same transformations over and over, you can also
+ use QMatrix objects and the QPainter::worldMatrix() and
+ QPainter::setWorldMatrix() functions. You can at any time save the
+ QPainter's transformation matrix by calling the QPainter::save()
+ function which saves the matrix on an internal stack. The
+ QPainter::restore() function pops it back.
+
+ One frequent need for the transformation matrix is when reusing
+ the same drawing code on a variety of paint devices. Without
+ transformations, the results are tightly bound to the resolution
+ of the paint device. Printers have high resolution, e.g. 600 dots
+ per inch, whereas screens often have between 72 and 100 dots per
+ inch.
+
+ \table 100%
+ \header
+ \o {2,1} Analog Clock Example
+ \row
+ \o \inlineimage coordinatesystem-analogclock.png
+ \o
+ The Analog Clock example shows how to draw the contents of a
+ custom widget using QPainter's transformation matrix.
+
+ Qt's example directory provides a complete walk-through of the
+ example. Here, we will only review the example's \l
+ {QWidget::paintEvent()}{paintEvent()} function to see how we can
+ use the transformation matrix (i.e. QPainter's matrix functions)
+ to draw the clock's face.
+
+ We recommend compiling and running this example before you read
+ any further. In particular, try resizing the window to different
+ sizes.
+
+ \row
+ \o {2,1}
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 9
+
+ First, we set up the painter. We translate the coordinate system
+ so that point (0, 0) is in the widget's center, instead of being
+ at the top-left corner. We also scale the system by \c side / 100,
+ where \c side is either the widget's width or the height,
+ whichever is shortest. We want the clock to be square, even if the
+ device isn't.
+
+ This will give us a 200 x 200 square area, with the origin (0, 0)
+ in the center, that we can draw on. What we draw will show up in
+ the largest possible square that will fit in the widget.
+
+ See also the \l {Window-Viewport Conversion} section.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 18
+
+ We draw the clock's hour hand by rotating the coordinate system
+ and calling QPainter::drawConvexPolygon(). Thank's to the
+ rotation, it's drawn pointed in the right direction.
+
+ The polygon is specified as an array of alternating \e x, \e y
+ values, stored in the \c hourHand static variable (defined at the
+ beginning of the function), which corresponds to the four points
+ (2, 0), (0, 2), (-2, 0), and (0, -25).
+
+ The calls to QPainter::save() and QPainter::restore() surrounding
+ the code guarantees that the code that follows won't be disturbed
+ by the transformations we've used.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 24
+
+ We do the same for the clock's minute hand, which is defined by
+ the four points (1, 0), (0, 1), (-1, 0), and (0, -40). These
+ coordinates specify a hand that is thinner and longer than the
+ minute hand.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 27
+
+ Finally, we draw the clock face, which consists of twelve short
+ lines at 30-degree intervals. At the end of that, the painter is
+ rotated in a way which isn't very useful, but we're done with
+ painting so that doesn't matter.
+ \endtable
+
+ For a demonstation of Qt's ability to perform affine
+ transformations on painting operations, see the \l
+ {demos/affine}{Affine Transformations} demo which allows the user
+ to experiment with the transformation operations. See also the \l
+ {painting/transformations}{Transformations} example which shows
+ how transformations influence the way that QPainter renders
+ graphics primitives. In particular, it shows how the order of
+ transformations affects the result.
+
+ For more information about the transformation matrix, see the
+ QMatrix documentation.
+
+ \section1 Window-Viewport Conversion
+
+ When drawing with QPainter, we specify points using logical
+ coordinates which then are converted into the physical coordinates
+ of the paint device.
+
+ The mapping of the logical coordinates to the physical coordinates
+ are handled by QPainter's world transformation \l
+ {QPainter::worldMatrix()}{worldMatrix()} (described in the \l
+ Transformations section), and QPainter's \l
+ {QPainter::viewport()}{viewport()} and \l
+ {QPainter::window()}{window()}. The viewport represents the
+ physical coordinates specifying an arbitrary rectangle. The
+ "window" describes the same rectangle in logical coordinates. By
+ default the logical and physical coordinate systems coincide, and
+ are equivalent to the paint device's rectangle.
+
+ Using window-viewport conversion you can make the logical
+ coordinate system fit your preferences. The mechanism can also be
+ used to make the drawing code independent of the paint device. You
+ can, for example, make the logical coordinates extend from (-50,
+ -50) to (50, 50) with (0, 0) in the center by calling the
+ QPainter::setWindow() function:
+
+ \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 4
+
+ Now, the logical coordinates (-50,-50) correspond to the paint
+ device's physical coordinates (0, 0). Independent of the paint
+ device, your painting code will always operate on the specified
+ logical coordinates.
+
+ By setting the "window" or viewport rectangle, you perform a
+ linear transformation of the coordinates. Note that each corner of
+ the "window" maps to the corresponding corner of the viewport, and
+ vice versa. For that reason it normally is a good idea to let the
+ viewport and "window" maintain the same aspect ratio to prevent
+ deformation:
+
+ \snippet doc/src/snippets/code/doc_src_coordsys.qdoc 5
+
+ If we make the logical coordinate system a square, we should also
+ make the viewport a square using the QPainter::setViewport()
+ function. In the example above we make it equivalent to the
+ largest square that fit into the paint device's rectangle. By
+ taking the paint device's size into consideration when setting the
+ window or viewport, it is possible to keep the drawing code
+ independent of the paint device.
+
+ Note that the window-viewport conversion is only a linear
+ transformation, i.e. it does not perform clipping. This means that
+ if you paint outside the currently set "window", your painting is
+ still transformed to the viewport using the same linear algebraic
+ approach.
+
+ \image coordinatesystem-transformations.png
+
+ The viewport, "window" and transformation matrix determine how
+ logical QPainter coordinates map to the paint device's physical
+ coordinates. By default the world transformation matrix is the
+ identity matrix, and the "window" and viewport settings are
+ equivalent to the paint device's settings, i.e. the world,
+ "window" and device coordinate systems are equivalent, but as we
+ have seen, the systems can be manipulated using transformation
+ operations and window-viewport conversion. The illustration above
+ describes the process.
+
+ \omit
+ \section1 Related Classes
+
+ Qt's paint system, Arthur, is primarily based on the QPainter,
+ QPaintDevice, and QPaintEngine classes:
+
+ \table
+ \header \o Class \o Description
+ \row
+ \o QPainter
+ \o
+ The QPainter class performs low-level painting on widgets and
+ other paint devices. QPainter can operate on any object that
+ inherits the QPaintDevice class, using the same code.
+ \row
+ \o QPaintDevice
+ \o
+ The QPaintDevice class is the base class of objects that can be
+ painted. Qt provides several devices: QWidget, QImage, QPixmap,
+ QPrinter and QPicture, and other devices can also be defined by
+ subclassing QPaintDevice.
+ \row
+ \o QPaintEngine
+ \o
+ The QPaintEngine class provides an abstract definition of how
+ QPainter draws to a given device on a given platform. Qt 4
+ provides several premade implementations of QPaintEngine for the
+ different painter backends we support; it provides one paint
+ engine for each supported window system and painting
+ frameworkt. You normally don't need to use this class directly.
+ \endtable
+
+ The 2D transformations of the coordinate system are specified
+ using the QMatrix class:
+
+ \table
+ \header \o Class \o Description
+ \row
+ \o QMatrix
+ \o
+ A 3 x 3 transformation matrix. Use QMatrix to rotate, shear,
+ scale, or translate the coordinate system.
+ \endtable
+
+ In addition Qt provides several graphics primitive classes. Some
+ of these classes exist in two versions: an \c{int}-based version
+ and a \c{qreal}-based version. For these, the \c qreal version's
+ name is suffixed with an \c F.
+
+ \table
+ \header \o Class \o Description
+ \row
+ \o \l{QPoint}(\l{QPointF}{F})
+ \o
+ A single 2D point in the coordinate system. Most functions in Qt
+ that deal with points can accept either a QPoint, a QPointF, two
+ \c{int}s, or two \c{qreal}s.
+ \row
+ \o \l{QSize}(\l{QSizeF}{F})
+ \o
+ A single 2D vector. Internally, QPoint and QSize are the same, but
+ a point is not the same as a size, so both classes exist. Again,
+ most functions accept either QSizeF, a QSize, two \c{int}s, or two
+ \c{qreal}s.
+ \row
+ \o \l{QRect}(\l{QRectF}{F})
+ \o
+ A 2D rectangle. Most functions accept either a QRectF, a QRect,
+ four \c{int}s, or four \c {qreal}s.
+ \row
+ \o \l{QLine}(\l{QLineF}{F})
+ \o
+ A 2D finite-length line, characterized by a start point and an end
+ point.
+ \row
+ \o \l{QPolygon}(\l{QPolygonF}{F})
+ \o
+ A 2D polygon. A polygon is a vector of \c{QPoint(F)}s. If the
+ first and last points are the same, the polygon is closed.
+ \row
+ \o QPainterPath
+ \o
+ A vectorial specification of a 2D shape. Painter paths are the
+ ultimate painting primitive, in the sense that any shape
+ (rectange, ellipse, spline) or combination of shapes can be
+ expressed as a path. A path specifies both an outline and an area.
+ \row
+ \o QRegion
+ \o
+ An area in a paint device, expressed as a list of
+ \l{QRect}s. In general, we recommend using the vectorial
+ QPainterPath class instead of QRegion for specifying areas,
+ because QPainterPath handles painter transformations much better.
+ \endtable
+ \endomit
+
+ \sa {Analog Clock Example}, {Transformations Example}
+*/
diff --git a/doc/src/credits.qdoc b/doc/src/credits.qdoc
new file mode 100644
index 0000000..114e28d
--- /dev/null
+++ b/doc/src/credits.qdoc
@@ -0,0 +1,348 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page credits.html
+
+ \title Thanks!
+ \ingroup licensing
+ \brief A list of contributors to Qt.
+
+ The following (and probably many others) have provided bug reports,
+ suggestions, patches, beta testing, or done us other favors. We thank
+ you all:
+
+ Adam P. Jenkins <ajenkins at cs.umass.edu>\br
+ Ahmed Metwally <ametwaly at auc-cs28.eun.eg>\br
+ Aidas Kasparas <kaspar at soften.ktu.lt>\br
+ Alejandro Aguilar Sierra <asierra at servidor.unam.mx>\br
+ Alex <steeper at dial.pipex.com>\br
+ Alex Kambis <kambis at eos913c.gsfc.nasa.gov>\br
+ Alexander Kozlov <alex at hale.appl.sci-nnov.ru>\br
+ Alexander Sanda <alex at darkstar.ping.at>\br
+ Amos Leffler <leffler at netaxs.com>\br
+ Anders Hanson <andhan at lls.se>\br
+ Andi Peredri <andi at ukr.net>\br
+ Andreas Schlempp <schlempp at egd.igd.fhg.de>\br
+ Andrew Bell <abell at vsys.com>\br
+ Andrew Gillham <gillhaa at ghost.whirlpool.com>\br
+ Andrew J. Robinson <robinson at eclipse.net>\br
+ Andrew Pavlomanolakos <app at novanet.net.au>\br
+ Andrew R. Tefft <teffta at crypt.erie.ge.com>\br
+ Andrew Vajoczki <vajoczki at interlog.com>\br
+ Andr\eacute Johansen <Andre.Johansen at funcom.no>\br
+ Andr\eacute Kramer <Andre.Kramer at glpg.com>\br
+ Andriy Rysin <arysin at yahoo.com>\br
+ Andy Brice <andyb at suntail.net>\br
+ Andy Shaw <andy at east.no>\br
+ Anton Keyter <ant at intekom.co.za>\br
+ Arabeyes Project (http://www.arabeyes.org) <doc at arabeyes.org> \br
+ ARISE - Marcin Giedz <giedz at arise.pl>\br
+ Arnt Gulbrandsen <arnt at gulbrandsen.priv.no>\br
+ Ashley Winters <jql at accessone.com>\br
+ Aubrey Soper <azdak at ix.netcom.com>\br
+ Axel Schwenke <schwenke at HTWM.DE>\br
+ Ben Bergen <ben at gmg.com>\br
+ Bernard Leach <B.Leach at compsoc.cs.latrobe.edu.au>\br
+ Bernd Johannes Wuebben <wuebben at math.cornell.edu>\br
+ Bernd S. Brentrup <bsb at uni-muenster.de>\br
+ Bert Haverkamp <b.r.j.haverkamp at et.tudelft.nl>\br
+ Bjorn Reese <breese at dit.ou.dk>\br
+ Bj\ouml\c{}rn Bergstr\ouml\c{}rm <bjorn.bergstrom at roguelikedevelopment.org>\br
+ Brian Beattie <beattie at drcpdx.stt3.com>\br
+ Brian P. Theodore <theodore at std.saic.com>\br
+ Brian White <bcwhite at verisim.com>\br
+ Bryan Scattergood <bryan at fsel.com>\br
+ Carsten Steckel <carsten at cs.newcastle.edu.au>\br
+ Chao-Hsin, Lin <linchao at charlie.cns.iit.edu>\br
+ Chip Salzenberg <chip at atlantic.net>\br
+ Chris Zwilling <crzwlng at cloudnet.com>\br
+ Christian Czezatke <e9025461 at student.tuwien.ac.at>\br
+ Christopher Andrew Spiking <cas at Cs.Nott.AC.UK>\br
+ Christopher J. White <cjwhite at rgit.wustl.edu>\br
+ Clarence Dang <dang at kde.org>\br
+ Claus Werner <lzu96cw at reading.ac.uk>\br
+ Cloyce D. Spradling <cloyce at austin.ibm.com>\br
+ Colin Paul Adams <colin at colina.demon.co.uk>\br
+ Cristiano Verondini <cverond at deis219.deis.unibo.it>\br
+ Damyan Pepper <damyanp at cogs.susx.ac.uk>\br
+ Dan Nickerson <nickersond at uthscsa.edu>\br
+ Daniel Brahneborg <basic at well.com>\br
+ Daniel Gruner <dgruner at tikva.chem.utoronto.ca>\br
+ Daniel J Mitchell <dan at rebellion.co.uk>\br
+ Danilo Fiorenzano <danilo at terranet.ab.ca>\br
+ Daniel M. Duley <daniel.duley at verizon.net>\br
+ Dante Profeta <profeta at neomedia.it>\br
+ Darryl Ruggles <001654r at dragon.acadiau.ca>\br
+ Dave <dave at stellacore.com>\br
+ Dave Steffen <steffend at glitch.physics.colostate.edu>\br
+ Dean Hall <dwhall at deskstation.com>\br
+ Denis Y. Pershin <dyp at isis.nsu.ru>\br
+ Diedrich Vorberg <Diedrich_Vorberg at cp.prima.ruhr.de>\br
+ Dietmar Schaefer <dietmar at cs.newcastle.edu.au>\br
+ Dimitri Papadopoulos <dpo at club-internet.fr>\br
+ Dirk Mueller <mueller at kde.org>\br
+ Dirk Schwartmann <dirk.schwartmann at dlr.de>\br
+ Dominik Jergus <djergus at ics.uci.edu>\br
+ Don Sanders <sanders at kde.org>\br
+ Donald A. Seielstad <donald at gromit.scs.uiuc.edu>\br
+ Donna J. Armijo <donna at KachinaTech.COM>\br
+ Doug Boreland <dborel at amex-trs.com>\br
+ Douglas Lenz <dlenz at spedsoft.com>\br
+ Dr Mek Buhl Nielsen <m.b.nielsen at bham.ac.uk>\br
+ Dr Willem A. Schreuder <Willem.Schreuder at prinmath.com>\br
+ E. Kevin Hall <hall at boston.sgi.com>\br
+ Ed Mackey <emackey at Early.com>\br
+ Edmund Taylor <etaylor at interaccess.com>\br
+ Enrique Mat\iacute\c{}as S\aacute\c{}nchez <cronopios at gmail.com>\br
+ Eric Bos <Eric.Bos at adelaide.maptek.com.au>\br
+ Eric Brunson <brunson at brunson.com>\br
+ Eric Jansen <jansen at photon.com>\br
+ Erik Norell <erik at Astrakan.HGS.SE>\br
+ Erik Thiele <erik at unterland.de>\br
+ Ernie Pasveer <erniep at vsl.com>\br
+ F R Ball <frb at umr.edu>\br
+ Fergal Mc Carthy <fergal at ilo.dec.com>\br
+ Frank Gockel <gockel at etecs4.uni-duisburg.de>\br
+ Frank Roscher <frank at chemnitz.abs-rz.de>\br
+ Franklin <franklin at goodhorse.idv.tw>\br
+ Fredrik Markstr\ouml\c{}m <fredrik at zod.campus.luth.se>\br
+ Fredrik Nehr <fredrik_nehr at ivab.se>\br
+ FrenzelBhv at aol.com\br
+ Frugal <frugal at wardrobe.demon.co.uk>\br
+ Frugal the Curious <Chris.Ward at softcare.co.uk>\br
+ Fujimoto Koji <kochan at mbox.kyoto-inet.or.jp>\br
+ Gabor V. Gulyas <gabor at robiomat.com>\br
+ Gary E. Sherman <sherman at mrcc.com>\br
+ Geoff Carpenter <GCC at watson.ibm.com>\br
+ Geoffrey Higginson <ghiggins at gulf.uvic.ca>\br
+ Georg Filios <Georg.Filios at post.rwth-aachen.de>\br
+ George Simunovich <george at cia-g.com>\br
+ Giovanni Bajo <giovannibajo at gmail.com>\br
+ Giovanni Carapelli <gcarapel at mbox.vol.it>\br
+ Greg Tomalesky <tomalesk at yrkpa.kias.com>\br
+ Gregg Jensen <gwj at stl.nexen.com>\br
+ Gustav "Gurre" Kalvesten <a94guska at ida.his.se>\br
+ Hal DeVore <hdevore at crow.bmc.com>\br
+ Hans Flaechsig <hans at hannes.owl.de>\br
+ Hans Schlenker <schlenkh at informatik.uni-muenchen.de>\br
+ Hardo Mueller <hardo at ipb.uni-bonn.de>\br
+ Heiko Gerdau <heiko.gerdau at t-online.de>\br
+ Helder Correia <helder.pereira.correia at gmail.com>\br
+ Henty Waker <henty at foxbat.sur.uct.ac.za>\br
+ Holger Hans Peter Freyther <zecke at selfish.org>\br
+ Hrafnkell Eiriksson <hkelle at mmedia.is>\br
+ Ildefonso Junquero Martin-Arroyo <junquero at sainsel.es>\br
+ Ingo Stapel <ingo.stapel at tu-clausthal.de>\br
+ J. Solomon Kostelnik <roz at one.net>\br
+ Jae Cho <cs184-dc at ute.CS.Berkeley.EDU>\br
+ James McIninch <james at amber.biology.gatech.edu>\br
+ Jan Aarsaether <jaa at metis.no>\br
+ Jaromir Dolecek <dolecek at ics.muni.cz>\br
+ Jasmin Blanchette <jasminb at corel.com>\br
+ Jason Evans <evans911 at cs.uidaho.edu>\br
+ Jay Painter <jay at a42.com>\br
+ Jean-Philippe Langlois <jpl at iname.com>\br
+ Jeff Harris <jharris at cis.ohio-state.edu>\br
+ Jeff Largent <jlargent at iu.net>\br
+ Jeffrey Vetter <vetter at lanl.gov>\br
+ Jeremy Wohl <jeremy at godzilli.cs.sunysb.edu>\br
+ Jesper K. Pedersen <blackie atklaralvdalens-datakonsult.se>\br
+ Jim Lauchlan <jim.lauchlan at gecm.com>\br
+ Joachim Backes <backes at rhrk.uni-kl.de>\br
+ Jochen R&ouml;mmler <jochen at concept.de>\br
+ Jochen Scharrlach <jscharrl at BA-Stuttgart.De>\br
+ Joe Croft <jcroft at swbell.net>\br
+ Joel Lindholm <wizball at kewl.campus.luth.se>\br
+ John H. Reppy <jhr at research.att.com>\br
+ John Huertas - Jourda <octarine at gte.net>\br
+ John Ouellette <ouellet at beluga.phys.UVic.CA>\br
+ John Vidar Larring <larring at weatherone.tv>\br
+ Jon Brumfitt <jbrumfit at astro.estec.esa.nl>\br
+ Jose Castro <jocastro at erols.com>\br
+ Jukka Heinonen <jhei at iki.fi>\br
+ Julian Enticknap <Julian.Enticknap at UK.Sun.COM>\br
+ Jussi-Pekka Sairanen <jussi-pekka.sairanen at research.nokia.com>\br
+ Kalle Dalheimer <kalle at dalheimer.hh.eunet.de>\br
+ Karl Robillard <karl at skygames.com>\br
+ Keith Brown <ksbrown at ix.netcom.com>\br
+ Keith Dowsett <kdowsett at rpms.ac.uk>\br
+ Ken Hollis <khollis at northwest.com>\br
+ Kirill Konyagin <kirill at asplinux.ru>\br
+ Klaus Ebner <klaus at gaspode.ndh.com>\br
+ Klaus-Georg Adams <Klaus-Georg.Adams at chemie.uni-karlsruhe.de>\br
+ Klaus Schmidinger <Klaus.Schmidinger at cadsoft.de>\br
+ Kristian Freed <d00freed at dtek.chalmers.se>\br
+ Kristof Depraetere <Kristof.Depraetere at rug.ac.be>\br
+ Kurt L Anderson <kurt+ at osu.edu>\br
+ Larry Lee <lclee at primenet.com>\br
+ Lars Knoll <knoll at mpi-hd.mpg.de>\br
+ M. G. Berberich <berberic at fmi.uni-passau.de>\br
+ Maas-Maarten Zeeman <mzeeman at cs.vu.nl>\br
+ Magnus Persson <mpersson at eritel.se>\br
+ Mario Weilguni <mweilguni at arctica.sime.com>\br
+ Marius Storm-Olsen <marius at storm-olsen.com>\br
+ Mariya <muha at iclub.nsu.ru>\br
+ Mark Summerfield <summer at perlpress.com>\br
+ Markku Hihnala <mah at ee.oulu.fi>\br
+ Marko Macek <Marko.Macek at snet.fer.uni-lj.si>\br
+ Martin Baehr <mbaehr at email.archlab.tuwien.ac.at>\br
+ Martin Mueller <mm at lunetix.de>\br
+ Martin van Velsen <vvelsen at ronix.ptf.hro.nl>\br
+ Matthias Ettrich <ettrich at fisher.informatik.uni-tuebingen.de>\br
+ Matthias Kretz <kretz at kde.org>
+ Matthias Suencksen <msuencks at techfak.uni-bielefeld.de>\br
+ Mattias Engdeg\aring\c{}rd <f91-men at nada.kth.se>\br
+ Michael Doppler <m.doppler at icoserve.com>\br
+ Michael Figley <figley at ibmoto.com>\br
+ Michael George <george at quark.im4u.net>\br
+ Michael Graff <explorer at flame.org>\br
+ Michael H. Price II <price at ERC.MsState.Edu>\br
+ Michael Harnois <mharnois at sbt.net>\br
+ Michael Hohmuth <hohmuth at inf.tu-dresden.de>\br
+ Michael Leodolter <michael at lab1.psy.univie.ac.at>\br
+ Michael Roth <mroth at nessie.de>\br
+ Michael Schwendt <Michael_Schwendt at public.uni-hamburg.de>\br
+ Michal Polak <mpolak at fi.muni.cz>\br
+ Mikael Bourges-Sevenier <bourges at int-evry.fr>\br
+ Mike Fearn <hp003 at dra.hmg.gb>\br
+ Mike Perik <mikep at crt.com>\br
+ Mike Sharkey <msharkey at softarc.com>\br
+ Mikko Ala-Fossi <mikko.ala-fossi at vaisala.com>\br
+ Miroslav Flidr <flidr at kky.zcu.cz>\br
+ Miyata Shigeru <miyata at kusm.kyoto-u.ac.jp>\br
+ Myron Uecker <muecker at csd.net>\br
+ Neal Sanche <neal at nsdev.org>\br
+ Ngok Yuk Yau <zzy at compuserve.com>\br
+ Niclas Anderberg <agony at sparta.lu.se>\br
+ Nicolas Goutte <goutte at kde.org>\br
+ Oliver Eiden <o.eiden at pop.ruhr.de>\br
+ Oliver Elphick <olly at lfix.co.uk>\br
+ Olivier Verloove <overloov at ulb.ac.be>\br
+ Osku Salerma <osku at iki.fi>\br
+ P. J. Leonard <eespjl at ee.bath.ac.uk>\br
+ Paolo Galatola <paolo at iris.polito.it>\br
+ Pat Dowler <dowler at pt1B1106.FSH.UVic.CA>\br
+ Patrice Trognon <trognon at apogee-com.fr>\br
+ Patrick Voigt <Patrick.Voigt at Informatik.TU-Chemnitz.DE>\br
+ Paul Bucheit <ptb at k2.cwru.edu>\br
+ Paul Curtis <plc at rowley.co.uk>\br
+ Paul Kendall <paul at kcbbs.gen.nz>\br
+ Paul Marquis <pmarquis at iddptm.iddis.com>\br
+ Peter Bender <bender at iib.bauwesen.th-darmstadt.de>\br
+ Peter Klotz <p.klotz at icoserve.com>\br
+ Peter Pletcher <peter at delilah>\br
+ Pierre Rocque <rocque at CRHSC.Umontreal.CA>\br
+ Pohorecki Wladyslaw <pohorecki at novell.ftj.agh.edu.pl>\br
+ R.S. Mallozzi, <mallozzi at bowie.msfc.nasa.gov>\br
+ Ralf Stanke <ralf at mcshh.hanse.de>\br
+ Reginald Stadlbauer <reggie at kde.org>\br
+ Richard Fric <Richard.Fric at kdemail.net>\br
+ Richard D. Jackson <rjackson at bga.com>\br
+ Richard Keech <rkeech at colesmyer.com.au>\br
+ Richard Moore <rich at kde.org>\br
+ Rick Brohl <rbrohl at uswest.com>\br
+ Robert Anderson <Robert.E.Anderson at unh.edu>\br
+ Robert Cimrman <cimrman at marius.univ-mrs.fr>\br
+ Roberto Alsina <ralsina at ultra7.unl.edu.ar>\br
+ Robin Helgelin <robin at garcio.com>\br
+ Rohlfs Reiner <Reiner.Rohlfs at obs.unige.ch>\br
+ Salman Sheikh <salman at vdragon.gsfc.nasa.gov>\br
+ Sandro Giessl <sandro at giessl.com>\br
+ Sandro Sigala <ssigala at globalnet.it>\br
+ Scott Coppen <scoppen at emerald.tufts.edu>\br
+ Sean Echevarria <sean at beatnik.com>\br
+ Sean Vyain <svyain at mail.tds.net>\br
+ Sirtaj Singh Kang <ssk at physics.unimelb.EDU.AU>\br
+ Sivan Toledo\br
+ Stefan Cronert <d93-scr at nada.kth.se>\br
+ Stefan Taferner <taf at porsche.co.at>\br
+ Steffen Hansen <stefh at dit.ou.dk>\br
+ Stephan Pfab <pfab at mathematik.uni-ulm.de>\br
+ Stephane Zermatten <szermat at ibm.net>\br
+ Sven Fischer <sven at comnets.rwth-aachen.de>\br
+ Sven Riedel <lynx at heim8.tu-clausthal.de>\br
+ Terje Dalen <terje at norcontrol.no>\br
+ Thomas Degrange <thomas.degrange at danaher-motion.ch>\br
+ Thomas Lineal <thomas at ricci.allcon.com>\br
+ Thomas Rath <rath at mac-info-link.de>\br
+ Thorsten Ende <the at is-bremen.de>\br
+ Tiaan Wessels <tiaan at inetsys.alt.za>\br
+ Tim D. Gilman <tdgilman at best.com>\br
+ Tom Houlder <thoulder at icor.fr>\br
+ Tony Albrecht <Tony.Albrecht at adelaide.maptek.com.au>\br
+ Torgeir Hovden <hovden at akkurat.idt.ntnu.no>\br
+ Trenton W. Schulz <twschulz at cord.edu>\br
+ Trond Hellem B\oslash <s638 at ii.uib.no>\br
+ Trond Solli <Trond.Solli at marintek.sintef.no>\br
+ Ulf Stelbe <ust at egd.igd.fhg.de>\br
+ Ulrich Hertlein <uhe at cs.tu-berlin.de>\br
+ Ulrich Ring <ur at daveg.com>\br
+ Uwe Thiem <uwe at uwix.alt.na>\br
+ Vadim Zaliva <lord at crocodile.org>\br
+ Val Gough <val at stellacore.com>\br
+ Vilhelm Sj\ouml\c{}berg <ville at swipnet.se>\br
+ Vlad Karpinsky <vlad at crocodile.org>\br
+ Volker Hilsheimer <vohi at gmx.de>\br
+ Volker Poplawski <volkerp at stepnet.de>\br
+ Warwick Allison <warwick at it.uq.edu.au>\br
+ Witold Wysota <wysota at qtcentre.org>\br
+ Xiaojian Li <lixj at monte.rutgers.edu>\br
+ Ximenes <ximenes at netset.com>\br
+ Y. N. Lo <ynlo at netcom.ca>\br
+ Zyklon <zyk at dds.nl>\br
+ atsushi konno <jibe at ppp.bekkoame.or.jp>\br
+ berry at hxi.com\br
+ boris passek <boris at ice.fb12.TU-Berlin.DE>\br
+ fidaire <fidaire at bip.fr>\br
+ joeh at sugar-river.net\br
+ rinsch at aea.ruhr-uni-bochum.de\br
+ tsutsui at kekvax.kek.jp\br
+ vandevod at cs.rpi.edu\br
+ Vincent Ricard <magic at magicninja.org>\br
+ vinckeg at sebb.bel.alcatel.be\br
+ yleffler at ucis.vill.edu\br
+ Houssem BDIOUI <houssem.bdioui at gmail.com>\br
+
+ We hope there are not too many omissions from the list.
+ Please submit any corrections to the \l{Task Tracker}
+ on the Qt website.
+*/
diff --git a/doc/src/custom-types.qdoc b/doc/src/custom-types.qdoc
new file mode 100644
index 0000000..81eecfc
--- /dev/null
+++ b/doc/src/custom-types.qdoc
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page custom-types.html
+ \title Creating Custom Qt Types
+ \ingroup architecture
+ \brief How to create and register new types with Qt.
+
+ \tableofcontents
+
+ \section1 Overview
+
+ When creating user interfaces with Qt, particularly those with specialized controls and
+ features, developers sometimes need to create new data types that can be used alongside
+ or in place of Qt's existing set of value types.
+
+ Standard types such as QSize, QColor and QString can all be stored in QVariant objects,
+ used as the types of properties in QObject-based classes, and emitted in signal-slot
+ communication.
+
+ In this document, we take a custom type and describe how to integrate it into Qt's object
+ model so that it can be stored in the same way as standard Qt types. We then show how to
+ register the custom type to allow it to be used in signals and slots connections.
+
+ \section1 Creating a Custom Type
+
+ Before we begin, we need to ensure that the custom type we are creating meets all the
+ requirements imposed by QMetaType. In other words, it must provide:
+
+ \list
+ \o a public default constructor,
+ \o a public copy constructor, and
+ \o a public destructor.
+ \endlist
+
+ The following \c Message class definition includes these members:
+
+ \snippet examples/tools/customtype/message.h custom type definition
+
+ The class also provides a constructor for normal use and two public member functions
+ that are used to obtain the private data.
+
+ \section1 Declaring the Type with QMetaType
+
+ The \c Message class only needs a suitable implementation in order to be usable.
+ However, Qt's type system will not be able to understand how to store, retrieve
+ and serialize instances of this class without some assistance. For example, we
+ will be unable to store \c Message values in QVariant.
+
+ The class in Qt responsible for custom types is QMetaType. To make the type known
+ to this class, we invoke the Q_DECLARE_METATYPE() macro on the class in the header
+ file where it is defined:
+
+ \snippet examples/tools/customtype/message.h custom type meta-type declaration
+
+ This now makes it possible for \c Message values to be stored in QVariant objects
+ and retrieved later. See the \l{Custom Type Example} for code that demonstrates
+ this.
+
+ The Q_DECLARE_METATYPE() macro also makes it possible for these values to be used as
+ arguments to signals, but \e{only in direct signal-slot connections}.
+ To make the custom type generally usable with the signals and slots mechanism, we
+ need to perform some extra work.
+
+ \section1 Creating and Destroying Custom Objects
+
+ Although the declaration in the previous section makes the type available for use
+ in direct signal-slot connections, it cannot be used for queued signal-slot
+ connections, such as those that are made between objects in different threads.
+ This is because the meta-object system does not know how to handle creation and
+ destruction of objects of the custom type at run-time.
+
+ To enable creation of objects at run-time, call the qRegisterMetaType() template
+ function to register it with the meta-object system. This also makes the type
+ available for queued signal-slot communication as long as you call it before you
+ make the first connection that uses the type.
+
+ The \l{Queued Custom Type Example} declares a \c Block class which is registered
+ in the \c{main.cpp} file:
+
+ \snippet examples/threads/queuedcustomtype/main.cpp main start
+ \dots
+ \snippet examples/threads/queuedcustomtype/main.cpp register meta-type for queued communications
+ \dots
+ \snippet examples/threads/queuedcustomtype/main.cpp main finish
+
+ This type is later used in a signal-slot connection in the \c{window.cpp} file:
+
+ \snippet examples/threads/queuedcustomtype/window.cpp Window constructor start
+ \dots
+ \snippet examples/threads/queuedcustomtype/window.cpp connecting signal with custom type
+ \dots
+ \snippet examples/threads/queuedcustomtype/window.cpp Window constructor finish
+
+ If a type is used in a queued connection without being registered, a warning will be
+ printed at the console; for example:
+
+ \code
+ QObject::connect: Cannot queue arguments of type 'Block'
+ (Make sure 'Block' is registered using qRegisterMetaType().)
+ \endcode
+
+ \section1 Making the Type Printable
+
+ It is often quite useful to make a custom type printable for debugging purposes,
+ as in the following code:
+
+ \snippet examples/tools/customtype/main.cpp printing a custom type
+
+ This is achieved by creating a streaming operator for the type, which is often
+ defined in the header file for that type:
+
+ \snippet examples/tools/customtype/message.h custom type streaming operator
+
+ The implementation for the \c Message type in the \l{Custom Type Example}
+ goes to some effort to make the printable representation as readable as
+ possible:
+
+ \snippet examples/tools/customtype/message.cpp custom type streaming operator
+
+ The output sent to the debug stream can, of course, be made as simple or as
+ complicated as you like. Note that the value returned by this function is
+ the QDebug object itself, though this is often obtained by calling the
+ maybeSpace() member function of QDebug that pads out the stream with space
+ characters to make it more readable.
+
+ \section1 Further Reading
+
+ The Q_DECLARE_METATYPE() macro and qRegisterMetaType() function documentation
+ contain more detailed information about their uses and limitations.
+
+ The \l{Custom Type Example}{Custom Type},
+ \l{Custom Type Sending Example}{Custom Type Sending}
+ and \l{Queued Custom Type Example}{Queued Custom Type} examples show how to
+ implement a custom type with the features outlined in this document.
+
+ The \l{Debugging Techniques} document provides an overview of the debugging
+ mechanisms discussed above.
+*/
diff --git a/doc/src/datastreamformat.qdoc b/doc/src/datastreamformat.qdoc
new file mode 100644
index 0000000..3c651fb
--- /dev/null
+++ b/doc/src/datastreamformat.qdoc
@@ -0,0 +1,312 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Documentation of the Format of the QDataStream operators.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page datastreamformat.html
+ \title Format of the QDataStream Operators
+ \ingroup architecture
+ \brief Representations of data types that can be serialized by QDataStream.
+
+ The \l QDataStream allows you to serialize some of the Qt data types.
+ The table below lists the data types that QDataStream can serialize
+ and how they are represented. The format described below is
+ \l{QDataStream::setVersion()}{version 8}.
+
+ It is always best to cast integers to a Qt integer type, such as
+ qint16 or quint32, when reading and writing. This ensures that
+ you always know exactly what size integers you are reading and
+ writing, no matter what the underlying platform and architecture
+ the application happens to be running on.
+
+ \table
+ \row \o qint8
+ \o \list
+ \o signed byte
+ \endlist
+ \row \o qint16
+ \o \list
+ \o signed 16-bit integer
+ \endlist
+ \row \o qint32
+ \o \list
+ \o signed 32-bit integer
+ \endlist
+ \row \o qint64
+ \o \list
+ \o signed 64-bit integer
+ \endlist
+ \row \o quint8
+ \o \list
+ \o unsigned byte
+ \endlist
+ \row \o quint16
+ \o \list
+ \o unsigned 16-bit integer
+ \endlist
+ \row \o quint32
+ \o \list
+ \o unsigned 32-bit integer
+ \endlist
+ \row \o quint64
+ \o \list
+ \o unsigned 64-bit integer
+ \endlist
+ \row \o \c float
+ \o \list
+ \o 32-bit floating point number using the standard IEEE 754 format
+ \endlist
+ \row \o \c double
+ \o \list
+ \o 64-bit floating point number using the standard IEEE 754 format
+ \endlist
+ \row \o \c {const char *}
+ \o \list
+ \o The string length (quint32)
+ \o The string bytes, excluding the terminating 0
+ \endlist
+ \row \o QBitArray
+ \o \list
+ \o The array size (quint32)
+ \o The array bits, i.e. (size + 7)/8 bytes
+ \endlist
+ \row \o QBrush
+ \o \list
+ \o The brush style (quint8)
+ \o The brush color (QColor)
+ \o If style is CustomPattern, the brush pixmap (QPixmap)
+ \endlist
+ \row \o QByteArray
+ \o \list
+ \o If the byte array is null: 0xFFFFFFFF (quint32)
+ \o Otherwise: the array size (quint32) followed by the array bytes, i.e. size bytes
+ \endlist
+ \row \o \l QColor
+ \o \list
+ \o Color spec (qint8)
+ \o Alpha value (quint16)
+ \o Red value (quint16)
+ \o Green value (quint16)
+ \o Blue value (quint16)
+ \o Pad value (quint16)
+ \endlist
+ \row \o QCursor
+ \o \list
+ \o Shape ID (qint16)
+ \o If shape is BitmapCursor: The bitmap (QPixmap), mask (QPixmap), and hot spot (QPoint)
+ \endlist
+ \row \o QDate
+ \o \list
+ \o Julian day (quint32)
+ \endlist
+ \row \o QDateTime
+ \o \list
+ \o Date (QDate)
+ \o Time (QTime)
+ \o 0 for Qt::LocalTime, 1 for Qt::UTC (quint8)
+ \endlist
+ \row \o QFont
+ \o \list
+ \o The family (QString)
+ \o The point size (qint16)
+ \o The style hint (quint8)
+ \o The char set (quint8)
+ \o The weight (quint8)
+ \o The font bits (quint8)
+ \endlist
+ \row \o QHash<Key, T>
+ \o \list
+ \o The number of items (quint32)
+ \o For all items, the key (Key) and value (T)
+ \endlist
+ \row \o QIcon
+ \o \list
+ \o The number of pixmap entries (quint32)
+ \o For all pixmap entries:
+ \list
+ \o The pixmap (QPixmap)
+ \o The file name (QString)
+ \o The pixmap size (QSize)
+ \o The \l{QIcon::Mode}{mode} (quint32)
+ \o The \l{QIcon::State}{state} (quint32)
+ \endlist
+ \endlist
+ \row \o QImage
+ \o \list
+ \o If the image is null a "null image" marker is saved;
+ otherwise the image is saved in PNG or BMP format (depending
+ on the stream version). If you want control of the format,
+ stream the image into a QBuffer (using QImageIO) and stream
+ that.
+ \endlist
+ \row \o QKeySequence
+ \o \list
+ \o A QList<int>, where each integer is a key in the key sequence
+ \endlist
+ \row \o QLinkedList<T>
+ \o \list
+ \o The number of items (quint32)
+ \o The items (T)
+ \endlist
+ \row \o QList<T>
+ \o \list
+ \o The number of items (quint32)
+ \o The items (T)
+ \endlist
+ \row \o QMap<Key, T>
+ \o \list
+ \o The number of items (quint32)
+ \o For all items, the key (Key) and value (T)
+ \endlist
+ \row \o QMatrix
+ \o \list
+ \o m11 (double)
+ \o m12 (double)
+ \o m21 (double)
+ \o m22 (double)
+ \o dx (double)
+ \o dy (double)
+ \endlist
+ \row \o QPair<T1, T2>
+ \o \list
+ \o first (T1)
+ \o second (T2)
+ \endlist
+ \row \o QPalette
+ \o The disabled, active, and inactive color groups, each of which consists
+ of the following:
+ \list
+ \o foreground (QBrush)
+ \o button (QBrush)
+ \o light (QBrush)
+ \o midlight (QBrush)
+ \o dark (QBrush)
+ \o mid (QBrush)
+ \o text (QBrush)
+ \o brightText (QBrush)
+ \o buttonText (QBrush)
+ \o base (QBrush)
+ \o background (QBrush)
+ \o shadow (QBrush)
+ \o highlight (QBrush)
+ \o highlightedText (QBrush)
+ \o link (QBrush)
+ \o linkVisited (QBrush)
+ \endlist
+ \row \o QPen
+ \o \list
+ \o The pen styles (quint8)
+ \o The pen width (quint16)
+ \o The pen color (QColor)
+ \endlist
+ \row \o QPicture
+ \o \list
+ \o The size of the picture data (quint32)
+ \o The raw bytes of picture data (char)
+ \endlist
+ \row \o QPixmap
+ \o \list
+ \o Save it as a PNG image.
+ \endlist
+ \row \o QPoint
+ \o \list
+ \o The x coordinate (qint32)
+ \o The y coordinate (qint32)
+ \endlist
+ \row \o QRect
+ \o \list
+ \o left (qint32)
+ \o top (qint32)
+ \o right (qint32)
+ \o bottom (qint32)
+ \endlist
+ \row \o QRegExp
+ \o \list
+ \o The regexp pattern (QString)
+ \o Case sensitivity (quint8)
+ \o Regular expression syntax (quint8)
+ \o Minimal matching (quint8)
+ \endlist
+ \row \o QRegion
+ \o \list
+ \o The size of the data, i.e. 8 + 16 * (number of rectangles) (quint32)
+ \o 10 (qint32)
+ \o The number of rectangles (quint32)
+ \o The rectangles in sequential order (QRect)
+ \endlist
+ \row \o QSize
+ \o \list
+ \o width (qint32)
+ \o height (qint32)
+ \endlist
+ \row \o QString
+ \o \list
+ \o If the string is null: 0xFFFFFFFF (quint32)
+ \o Otherwise: The string length in bytes (quint32) followed by the data in UTF-16
+ \endlist
+ \row \o QTime
+ \o \list
+ \o Milliseconds since midnight (quint32)
+ \endlist
+ \row \o QVariant
+ \o \list
+ \o The type of the data (quint32)
+ \o The null flag (qint8)
+ \o The data of the specified type
+ \endlist
+ \row \o QVector<T>
+ \o \list
+ \o The number of items (quint32)
+ \o The items (T)
+ \endlist
+ \endtable
+*/
diff --git a/doc/src/debug.qdoc b/doc/src/debug.qdoc
new file mode 100644
index 0000000..da5a82f
--- /dev/null
+++ b/doc/src/debug.qdoc
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Qt Debugging Techniques
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page debug.html
+ \title Debugging Techniques
+ \ingroup buildsystem
+
+ Here we present some useful hints to help you with debugging your
+ Qt-based software.
+
+ \tableofcontents
+
+ \section1 Configuring Qt for Debugging
+
+ When \l{Installation}{configuring Qt for installation}, it is possible
+ to ensure that it is built to include debug symbols that can make it
+ easier to track bugs in applications and libraries. However, on some
+ platforms, building Qt in debug mode will cause applications to be larger
+ than desirable.
+
+ \section2 Debugging in Mac OS X and Xcode
+
+ \section3 Debugging With/Without Frameworks
+
+ The basic stuff you need to know about debug libraries and
+ frameworks is found at developer.apple.com in:
+ \l{http://developer.apple.com/technotes/tn2004/tn2124.html#SECDEBUGLIB}
+ {Apple Technicle Note TN2124} Qt follows that.
+
+ When you build Qt, frameworks are built by default, and inside the
+ framework you will find both a release and a debug version (e.g.,
+ QtCore and QtCore_debug). If you pass the \c{-no-framework} flag
+ when you build Qt, two dylibs are built for each Qt library (e.g.,
+ libQtCore.4.dylib and libQtCore_debug.4.dylib).
+
+ What happens when you link depends on whether you use frameworks
+ or not. We don't see a compelling reason to recommend one over the
+ other.
+
+ \section4 With Frameworks:
+
+ Since the release and debug libraries are inside the framework,
+ the app is simply linked against the framework. Then when you run
+ in the debugger, you will get either the release version or the
+ debug version, depending on whether you set \c{DYLD_IMAGE_SUFFIX}.
+ If you don't set it, you get the release version by default (i.e.,
+ non _debug). If you set \c{DYLD_IMAGE_SUFFIX=_debug}, you get the
+ debug version.
+
+ \section4 Without Frameworks:
+
+ When you tell \e{qmake} to generate a Makefile with the debug
+ config, it will link against the _debug version of the libraries
+ and generate debug symbols for the app. Running this program in
+ GDB will then work like running GDB on other platforms, and you
+ will be able to trace inside Qt.
+
+ \section3 Debug Symbols and Size
+
+ The amount of space taken up by debug symbols generated by GCC can
+ be excessively large. However, with the release of Xcode 2.3 it is
+ now possible to use Dwarf symbols which take up a significantly
+ smaller amount of space. To enable this feature when configuring
+ Qt, pass the \c{-dwarf-2} option to the configure script.
+
+ This is not enabled by default because previous versions of Xcode
+ will not work with the compiler flag used to implement this
+ feature. Mac OS X 10.5 will use dwarf-2 symbols by default.
+
+ dwarf-2 symbols contain references to source code, so the size of
+ the final debug application should compare favorably to a release
+ build.
+
+ \omit
+ Although it is not necessary to build Qt with debug symbols to use the
+ other techniques described in this document, certain features are only
+ available when Qt is configured for debugging.
+ \endomit
+
+ \section1 Command Line Options Recognized by Qt
+
+ When you run a Qt application, you can specify several
+ command-line options that can help with debugging. These are
+ recognized by QApplication.
+
+ \table
+ \header \o Option \o Description
+ \row \o \c -nograb
+ \o The application should never grab \link QWidget::grabMouse()
+ the mouse\endlink or \link QWidget::grabKeyboard() the
+ keyboard \endlink. This option is set by default when the
+ program is running in the \c gdb debugger under Linux.
+ \row \o \c -dograb
+ \o Ignore any implicit or explicit \c{-nograb}. \c -dograb wins over
+ \c -nograb even when \c -nograb is last on the command line.
+ \row \o \c -sync
+ \o Runs the application in X synchronous mode. Synchronous mode
+ forces the X server to perform each X client request
+ immediately and not use buffer optimization. It makes the
+ program easier to debug and often much slower. The \c -sync
+ option is only valid for the X11 version of Qt.
+ \endtable
+
+ \section1 Warning and Debugging Messages
+
+ Qt includes four global functions for writing out warning and debug
+ text. You can use them for the following purposes:
+
+ \list
+ \o qDebug() is used for writing custom debug output.
+ \o qWarning() is used to report warnings and recoverable errors in
+ your application.
+ \o qCritical() is used for writing critical error mesages and
+ reporting system errors.
+ \o qFatal() is used for writing fatal error messages shortly before exiting.
+ \endlist
+
+ If you include the <QtDebug> header file, the \c qDebug() function
+ can also be used as an output stream. For example:
+
+ \snippet doc/src/snippets/code/doc_src_debug.qdoc 0
+
+ The Qt implementation of these functions prints the text to the
+ \c stderr output under Unix/X11 and Mac OS X. With Windows, if it
+ is a console application, the text is sent to console; otherwise, it
+ is sent to the debugger. You can take over these functions by
+ installing a message handler using qInstallMsgHandler().
+
+ If the \c QT_FATAL_WARNINGS environment variable is set,
+ qWarning() exits after printing the warning message. This makes
+ it easy to obtain a backtrace in the debugger.
+
+ Both qDebug() and qWarning() are debugging tools. They can be
+ compiled away by defining \c QT_NO_DEBUG_OUTPUT and \c
+ QT_NO_WARNING_OUTPUT during compilation.
+
+ The debugging functions QObject::dumpObjectTree() and
+ QObject::dumpObjectInfo() are often useful when an application
+ looks or acts strangely. More useful if you use \l{QObject::setObjectName()}{object names}
+ than not, but often useful even without names.
+
+ \section1 Providing Support for the qDebug() Stream Operator
+
+ You can implement the stream operator used by qDebug() to provide
+ debugging support for your classes. The class that implements the
+ stream is \c QDebug. The functions you need to know about in \c
+ QDebug are \c space() and \c nospace(). They both return a debug
+ stream; the difference between them is whether a space is inserted
+ between each item. Here is an example for a class that represents
+ a 2D coordinate.
+
+ \snippet doc/src/snippets/qdebug/qdebugsnippet.cpp 0
+
+ Integration of custom types with Qt's meta-object system is covered
+ in more depth in the \l{Creating Custom Qt Types} document.
+
+ \section1 Debugging Macros
+
+ The header file \c <QtGlobal> contains some debugging macros and
+ \c{#define}s.
+
+ Three important macros are:
+ \list
+ \o \l{Q_ASSERT()}{Q_ASSERT}(cond), where \c cond is a boolean
+ expression, writes the warning "ASSERT: '\e{cond}' in file xyz.cpp, line
+ 234" and exits if \c cond is false.
+ \o \l{Q_ASSERT_X()}{Q_ASSERT_X}(cond, where, what), where \c cond is a
+ boolean expression, \c where a location, and \c what a message,
+ writes the warning: "ASSERT failure in \c{where}: '\c{what}', file xyz.cpp, line 234"
+ and exits if \c cond is false.
+ \o \l{Q_CHECK_PTR()}{Q_CHECK_PTR}(ptr), where \c ptr is a pointer.
+ Writes the warning "In file xyz.cpp, line 234: Out of memory" and
+ exits if \c ptr is 0.
+ \endlist
+
+ These macros are useful for detecting program errors, e.g. like this:
+
+ \snippet doc/src/snippets/code/doc_src_debug.qdoc 1
+
+ Q_ASSERT(), Q_ASSERT_X(), and Q_CHECK_PTR() expand to nothing if
+ \c QT_NO_DEBUG is defined during compilation. For this reason,
+ the arguments to these macro should not have any side-effects.
+ Here is an incorrect usage of Q_CHECK_PTR():
+
+ \snippet doc/src/snippets/code/doc_src_debug.qdoc 2
+
+ If this code is compiled with \c QT_NO_DEBUG defined, the code in
+ the Q_CHECK_PTR() expression is not executed and \e alloc returns
+ an unitialized pointer.
+
+ The Qt library contains hundreds of internal checks that will
+ print warning messages when a programming error is detected. We
+ therefore recommend that you use a debug version of Qt when
+ developing Qt-based software.
+
+ \section1 Common Bugs
+
+ There is one bug that is so common that it deserves mention here:
+ If you include the Q_OBJECT macro in a class declaration and
+ run \link moc.html the meta-object compiler\endlink (\c{moc}),
+ but forget to link the \c{moc}-generated object code into your
+ executable, you will get very confusing error messages. Any link
+ error complaining about a lack of \c{vtbl}, \c{_vtbl}, \c{__vtbl}
+ or similar is likely to be a result of this problem.
+*/
diff --git a/doc/src/demos.qdoc b/doc/src/demos.qdoc
new file mode 100644
index 0000000..9cc8df5
--- /dev/null
+++ b/doc/src/demos.qdoc
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page demos.html
+ \title Qt Demonstrations
+ \brief Information about the demonstration programs provided with Qt.
+ \ingroup howto
+
+ This is the list of demonstrations in Qt's \c demos directory.
+ These are larger and more complicated programs than the
+ \l{Qt Examples} and are used to highlight certain features of
+ Qt. You can launch any of these programs from the
+ \l{Examples and Demos Launcher} application.
+
+ If you are new to Qt, and want to start developing applications,
+ you should probably start by going through the \l{Tutorials}.
+
+ \section1 Painting
+
+ \list
+ \o \l{demos/composition}{Composition Modes} demonstrates the range of
+ composition modes available with Qt.
+ \o \l{demos/deform}{Vector Deformation} demonstrates effects that are made
+ possible with a vector-oriented paint engine.
+ \o \l{demos/gradients}{Gradients} shows the different types of gradients
+ that are available in Qt.
+ \o \l{demos/pathstroke}{Path Stroking} shows Qt's built-in dash patterns
+ and shows how custom patterns can be used to extend the range of
+ available patterns.
+ \o \l{demos/affine}{Affine Transformations} demonstrates the different
+ affine transformations that can be used to influence painting operations.
+ \o \l{demos/arthurplugin}{Arthur Plugin} shows the widgets from the
+ other painting demos packaged as a custom widget plugin for \QD.
+ \endlist
+
+ \section1 Item Views
+
+ \list
+ \o \l{demos/interview}{Interview} shows the same model and selection being
+ shared between three different views.
+ \o \l{demos/spreadsheet}{Spreadsheet} demonstrates the use of a table view
+ as a spreadsheet, using custom delegates to render each item according to
+ the type of data it contains.
+ \endlist
+
+ \section1 SQL
+
+ \list
+ \o \l{demos/books}{Books} shows how Qt's SQL support and model/view integration
+ enables the user to modify the contents of a database without requiring
+ knowledge of SQL.
+ \o \l{demos/sqlbrowser}{SQL Browser} demonstrates a console for executing SQL
+ statements on a live database and provides a data browser for interactively
+ visualizing the results.
+ \endlist
+
+ \section1 Rich Text
+
+ \list
+ \o \l{demos/textedit}{Text Edit} shows Qt's rich text editing features and provides
+ an environment for experimenting with them.
+ \endlist
+
+ \section1 Main Window
+
+ \list
+ \o \l{demos/mainwindow}{Main Window} shows Qt's extensive support for main window
+ features, such as tool bars, dock windows, and menus.
+ \o \l{demos/macmainwindow}{Mac Main Window} shows how to create main window applications that has
+ the same appearance as other Mac OS X applications.
+ \endlist
+
+ \section1 Graphics View
+
+ \list
+ \o \l{demos/chip}{40000 Chips} uses the
+ \l{The Graphics View Framework}{Graphics View} framework to efficiently
+ display a large number of individual graphical items on a scrolling canvas,
+ highlighting features such as rotation, zooming, level of detail control,
+ and item selection.
+ \o \l{demos/embeddeddialogs}{Embedded Dialogs} showcases Qt 4.4's \e{Widgets on
+ the Canvas} feature by embedding a multitude of fully-working dialogs into a
+ scene.
+ \o \l{demos/boxes}{Boxes} showcases Qt's OpenGL support and the
+ integration with the Graphics View framework.
+ \endlist
+
+ \section1 Tools
+
+ \list
+ \o \l{demos/undo}{Undo Framework} demonstrates how Qt's
+ \l{Overview of Qt's Undo Framework}{undo framework} is used to
+ provide advanced undo/redo functionality.
+ \endlist
+
+ \section1 QtWebKit
+
+ \list
+ \o \l{Web Browser} demonstrates how Qt's \l{QtWebKit Module}{WebKit module}
+ can be used to implement a small Web browser.
+ \endlist
+
+ \section1 Phonon
+
+ \list
+ \o \l{demos/mediaplayer}{Media Player} demonstrates how the \l{Phonon Module} can be
+ used to implement a basic media player application.
+ \endlist
+
+ \note The Phonon demos are currently not available for the MinGW platform.
+
+*/
diff --git a/doc/src/demos/affine.qdoc b/doc/src/demos/affine.qdoc
new file mode 100644
index 0000000..25e496e
--- /dev/null
+++ b/doc/src/demos/affine.qdoc
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/affine
+ \title Affine Transformations
+
+ In this demo we show Qt's ability to perform affine transformations
+ on painting operations.
+
+ \image affine-demo.png
+
+ Transformations can be performed on any kind of graphics drawn using QPainter.
+ The transformations used to display the vector graphics, images, and text can be adjusted
+ in the following ways:
+
+ \list
+ \o Dragging the red circle in the centre of each drawing moves it to a new position.
+ \o Dragging the displaced red circle causes the current drawing to be rotated about the
+ central circle. Rotation can also be controlled with the \key Rotate slider.
+ \o Scaling is controlled with the \key Scale slider.
+ \o Each drawing can be sheared with the \key Shear slider.
+ \endlist
+*/
diff --git a/doc/src/demos/arthurplugin.qdoc b/doc/src/demos/arthurplugin.qdoc
new file mode 100644
index 0000000..38c5d3c
--- /dev/null
+++ b/doc/src/demos/arthurplugin.qdoc
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/arthurplugin
+ \title Arthur Plugin
+
+ In this demo we demonstrate the abilities of Qt's painting system
+ in combination with \QD's custom widget plugin facilities.
+
+ \image arthurplugin-demo.png
+
+ The specialized widgets used in the other demonstrations of the Arthur
+ painting system are provided as custom widgets to be used with \QD.
+ Since each of the widgets provides a set of signals and slots, the
+ effects they show can be controlled by connecting them up to standard
+ input widgets.
+*/
diff --git a/doc/src/demos/books.qdoc b/doc/src/demos/books.qdoc
new file mode 100644
index 0000000..b491b2a
--- /dev/null
+++ b/doc/src/demos/books.qdoc
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/books
+ \title Books Demonstration
+
+ The Books demonstration shows how Qt's SQL classes can be used with the model/view
+ framework to create rich user interfaces for information stored in a database.
+
+ \image books-demo.png
+
+ Information about a collection of books is held in a database. The books are
+ catalogued by author, title, genre, and year of publication. Although each of
+ these fields can be displayed and edited using standard widgets, an additional
+ field describing an arbitrary rating for the book needs something extra.
+
+ Books are rated using a system where each is allocated a number of stars; the
+ more a book has, the better it is supposed to be. By clicking on a cell
+ containing the rating, the number of stars can be modified, and the rating in
+ the database is updated.
+*/
diff --git a/doc/src/demos/boxes.qdoc b/doc/src/demos/boxes.qdoc
new file mode 100644
index 0000000..db1155e
--- /dev/null
+++ b/doc/src/demos/boxes.qdoc
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/boxes
+ \title Boxes
+
+ This demo shows Qt's ability to combine advanced OpenGL rendering with the
+ the \l{The Graphics View Framework}{Graphics View} framework.
+
+ \image boxes-demo.png
+
+ Elements in the demo can be controlled using the mouse in the following
+ ways:
+ \list
+ \o Dragging the mouse while pressing the left mouse button rotates the
+ box in the center.
+ \o Dragging the mouse while pressing the right mouse button rotates the
+ satellite boxes.
+ \o Scrolling the mouse wheel zooms in and out of the scene.
+ \endlist
+
+ The options pane can be used to fine-tune various parameters in the demo,
+ including colors and pixel shaders.
+*/
diff --git a/doc/src/demos/browser.qdoc b/doc/src/demos/browser.qdoc
new file mode 100644
index 0000000..34bb80d
--- /dev/null
+++ b/doc/src/demos/browser.qdoc
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page demos-browser.html
+ \title Web Browser
+
+ The Web Browser demonstration shows Qt's WebKit module in action,
+ providing a little Web browser application.
+
+ \image browser-demo.png
+
+ This browser is the foundation for the \l{Arora Browser}, a simple cross-platform
+ Web browser.
+*/
diff --git a/doc/src/demos/chip.qdoc b/doc/src/demos/chip.qdoc
new file mode 100644
index 0000000..9e9b7b4
--- /dev/null
+++ b/doc/src/demos/chip.qdoc
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/chip
+ \title 40000 Chips
+
+ This demo shows how to visualize a huge scene with 40000 chip items
+ using Graphics View. It also shows Graphics View's powerful navigation
+ and interaction features, allowing you to zoom and rotate each of four
+ views independently, and you can select and move items around the scene.
+
+ \image chip-demo.png
+*/
diff --git a/doc/src/demos/composition.qdoc b/doc/src/demos/composition.qdoc
new file mode 100644
index 0000000..9c2c9d7
--- /dev/null
+++ b/doc/src/demos/composition.qdoc
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/composition
+ \title Composition Modes
+
+ This demo shows some of the more advanced composition modes supported by Qt.
+
+ \image composition-demo.png
+
+ The two most common forms of composition are \bold{Source} and \bold{SourceOver}.
+ \bold{Source} is used to draw opaque objects onto a paint device. In this mode,
+ each pixel in the source replaces the corresponding pixel in the destination.
+ In \bold{SourceOver} composition mode, the source object is transparent and is
+ drawn on top of the destination.
+
+ In addition to these standard modes, Qt defines the complete set of composition modes
+ as defined by X. Porter and Y. Duff. See the QPainter documentation for details.
+*/
diff --git a/doc/src/demos/deform.qdoc b/doc/src/demos/deform.qdoc
new file mode 100644
index 0000000..2b94e15
--- /dev/null
+++ b/doc/src/demos/deform.qdoc
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/deform
+ \title Vector Deformation
+
+ This demo shows how to use advanced vector techniques to draw text
+ using a \c QPainterPath.
+
+ \image deform-demo.png
+
+ We define a vector deformation field in the shape of a lens and apply
+ this to all points in a path. This means that what is rendered on
+ screen is not pixel manipulation, but modified vector representations of
+ the glyphs themselves. This is visible from the high quality of the
+ antialiased edges for the deformed glyphs.
+
+ To get a fairly complex path we allow the user to type in text and
+ convert the text to paths. This is done using the
+ QPainterPath::addText() function.
+
+ The lens is drawn using a single call to QPainter::drawEllipse(),
+ using a QRadialGradient to fill it with a specialized color
+ table, giving the effect of the sun's reflection and a drop
+ shadow. The lens is cached as a pixmap for better performance.
+*/
diff --git a/doc/src/demos/embeddeddialogs.qdoc b/doc/src/demos/embeddeddialogs.qdoc
new file mode 100644
index 0000000..f7d20cc
--- /dev/null
+++ b/doc/src/demos/embeddeddialogs.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/embeddeddialogs
+ \title Embedded Dialogs
+
+ This example shows how to embed standard dialogs into
+ Graphics View. It also shows how you can customize the
+ proxy class and add window shadows.
+
+ \image embeddeddialogs-demo.png
+*/
diff --git a/doc/src/demos/gradients.qdoc b/doc/src/demos/gradients.qdoc
new file mode 100644
index 0000000..3e8575a
--- /dev/null
+++ b/doc/src/demos/gradients.qdoc
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/gradients
+ \title Gradients
+
+ In this demo we show the various types of gradients that can
+ be used in Qt.
+
+ \image gradients-demo.png
+
+ There are three types of gradients:
+
+ \list
+ \o \bold{Linear} gradients interpolate colors between start and end points.
+ \o \bold{Radial} gradients interpolate colors between a focal point and the
+ points on a circle surrounding it.
+ \o \bold{Conical} gradients interpolate colors around a center point.
+ \endlist
+
+ The panel on the right contains a color table editor that defines
+ the colors in the gradient. The three topmost controls determine the red,
+ green and blue components while the last defines the alpha of the
+ gradient. You can move points, and add new ones, by clicking with the left
+ mouse button, and remove points by clicking with the right button.
+
+ There are three default configurations available at the bottom of
+ the page that are provided as suggestions on how a color table could be
+ configured.
+*/
diff --git a/doc/src/demos/interview.qdoc b/doc/src/demos/interview.qdoc
new file mode 100644
index 0000000..c32c13c
--- /dev/null
+++ b/doc/src/demos/interview.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/interview
+ \title Interview
+
+ The Interview demonstration explores the flexibility and scalability of the
+ model/view framework by presenting an infinitely deep data structure using a model
+ and three different types of view.
+
+ \image interview-demo.png
+*/
diff --git a/doc/src/demos/macmainwindow.qdoc b/doc/src/demos/macmainwindow.qdoc
new file mode 100644
index 0000000..3a59275
--- /dev/null
+++ b/doc/src/demos/macmainwindow.qdoc
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/macmainwindow
+ \title Mac Main Window Demo
+
+ This demo shows how to create a main window that has the
+ same appearance as other Mac OS X applications such as Mail or iTunes.
+ This includes customizing the item views and QSplitter and wrapping native
+ widgets such as the search field.
+
+ \image macmainwindow.png
+
+ See \c{$QTDIR/demos/macmainwindow} for the source code.
+*/
+
+
diff --git a/doc/src/demos/mainwindow.qdoc b/doc/src/demos/mainwindow.qdoc
new file mode 100644
index 0000000..58f2b65
--- /dev/null
+++ b/doc/src/demos/mainwindow.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/mainwindow
+ \title Main Window
+
+ The Main Window demonstration shows Qt's extensive support for tool bars,
+ dock windows, menus, and other standard application features.
+
+ \image mainwindow-demo.png
+*/
diff --git a/doc/src/demos/mediaplayer.qdoc b/doc/src/demos/mediaplayer.qdoc
new file mode 100644
index 0000000..0e66908
--- /dev/null
+++ b/doc/src/demos/mediaplayer.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/mediaplayer
+ \title Media Player
+
+ The Media Player demonstration shows how \l{Phonon Module}{Phonon}
+ can be used in Qt applications to handle audio and video playback.
+
+ \image mediaplayer-demo.png
+*/
diff --git a/doc/src/demos/pathstroke.qdoc b/doc/src/demos/pathstroke.qdoc
new file mode 100644
index 0000000..1c817f6
--- /dev/null
+++ b/doc/src/demos/pathstroke.qdoc
@@ -0,0 +1,61 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/pathstroke
+ \title Path Stroking
+
+ In this demo we show some of the various types of pens that can be
+ used in Qt.
+
+ \image pathstroke-demo.png
+
+ Qt defines cap styles for how the end points are treated and join
+ styles for how path segments are joined together. A standard set of
+ predefined dash patterns are also included that can be used with
+ QPen.
+
+ In addition to the predefined patterns available in
+ QPen we also demonstrate direct use of the
+ QPainterPathStroker class which can be used to define
+ custom dash patterns. You can see this by enabling the
+ \e{Custom Pattern} option.
+*/
diff --git a/doc/src/demos/spreadsheet.qdoc b/doc/src/demos/spreadsheet.qdoc
new file mode 100644
index 0000000..88eb7d6
--- /dev/null
+++ b/doc/src/demos/spreadsheet.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/spreadsheet
+ \title Spreadsheet
+
+ The Spreadsheet demonstration shows how a table view can be used to create a
+ simple spreadsheet application. Custom delegates are used to render different
+ types of data in distinctive colors.
+
+ \image spreadsheet-demo.png
+*/
diff --git a/doc/src/demos/sqlbrowser.qdoc b/doc/src/demos/sqlbrowser.qdoc
new file mode 100644
index 0000000..68c3656
--- /dev/null
+++ b/doc/src/demos/sqlbrowser.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/sqlbrowser
+ \title SQL Browser
+
+ The SQL Browser demonstration shows how a data browser can be used to visualize
+ the results of SQL statements on a live database.
+
+ \image sqlbrowser-demo.png
+*/
diff --git a/doc/src/demos/textedit.qdoc b/doc/src/demos/textedit.qdoc
new file mode 100644
index 0000000..a99fc4a
--- /dev/null
+++ b/doc/src/demos/textedit.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/textedit
+ \title Text Edit
+
+ The Text Edit demonstration shows Qt's rich text editing facilities in action,
+ providing an example document for you to experiment with.
+
+ \image textedit-demo.png
+*/
diff --git a/doc/src/demos/undo.qdoc b/doc/src/demos/undo.qdoc
new file mode 100644
index 0000000..401986a
--- /dev/null
+++ b/doc/src/demos/undo.qdoc
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example demos/undo
+ \title Undo Framework
+
+ This demo shows Qt's undo framework in action.
+
+ \image undodemo.png
+
+ Qt's undo framework is an implementation of the Command
+ pattern, which provides advanced undo/redo functionality.
+
+ To show the abilities of the framework, we have implemented a
+ small diagram application in which the diagram items are geometric
+ primitives. You can edit the diagram in the following ways: add,
+ move, change the color of, and delete the items.
+*/
diff --git a/doc/src/deployment.qdoc b/doc/src/deployment.qdoc
new file mode 100644
index 0000000..d2c7a9e
--- /dev/null
+++ b/doc/src/deployment.qdoc
@@ -0,0 +1,1472 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \group deployment
+ \title Deploying Qt Applications
+ \ingroup buildsystem
+
+ Deploying an Qt application does not require any C++
+ programming. All you need to do is to build Qt and your
+ application in release mode, following the procedures described in
+ this documentation. We will demonstrate the procedures in terms of
+ deploying the \l {tools/plugandpaint}{Plug & Paint} application
+ that is provided in Qt's examples directory.
+
+ \section1 Static vs. Shared Libraries
+
+ There are two ways of deploying an application:
+
+ \list
+ \o Static Linking
+ \o Shared Libraries (Frameworks on Mac)
+ \endlist
+
+ Static linking results in a stand-alone executable. The advantage
+ is that you will only have a few files to deploy. The
+ disadvantages are that the executables are large and with no
+ flexibility (i.e a new version of the application, or of Qt, will
+ require that the deployment process is repeated), and that you
+ cannot deploy plugins.
+
+ To deploy plugin-based applications, you can use the shared
+ library approach. Shared libraries also provide smaller, more
+ flexible executables. For example, using the shared library
+ approach, the user is able to independently upgrade the Qt library
+ used by the application.
+
+ Another reason why you might want to use the shared library
+ approach, is if you want to use the same Qt libraries for a family
+ of applications. In fact, if you download the binary installation
+ of Qt, you get Qt as a shared library.
+
+ The disadvantage with the shared library approach is that you
+ will get more files to deploy.
+
+ \section1 Deploying Qt's Libraries
+
+ \table
+ \header
+ \o {4,1} Qt's Libraries
+ \row
+ \o \l {QtAssistant}
+ \o \l {QAxContainer}
+ \o \l {QAxServer}
+ \o \l {QtCore}
+ \row
+ \o \l {QtDBus}
+ \o \l {QtDesigner}
+ \o \l {QtGui}
+ \o \l {QtHelp}
+ \row
+ \o \l {QtNetwork}
+ \o \l {QtOpenGL}
+ \o \l {QtScript}
+ \o \l {QtSql}
+ \row
+ \o \l {QtSvg}
+ \o \l {QtWebKit}
+ \o \l {QtXml}
+ \o \l {QtXmlPatterns}
+ \row
+ \o \l {Phonon Module}{Phonon}
+ \o \l {Qt3Support}
+ \endtable
+
+ Since Qt is not a system library, it has to be redistributed along
+ with your application; the minimum is to redistribute the run-time
+ of the libraries used by the application. Using static linking,
+ however, the Qt run-time is compiled into the executable.
+
+ In particular, you will need to deploy Qt plugins, such as
+ JPEG support or SQL drivers. For more information about plugins,
+ see the \l {plugins-howto.html}{How to Create Qt Plugins}
+ documentation.
+
+ When deploying an application using the shared library approach
+ you must ensure that the Qt libraries will use the correct path to
+ find the Qt plugins, documentation, translation etc. To do this you
+ can use a \c qt.conf file. For more information, see the \l {Using
+ qt.conf} documentation.
+
+ Depending on configuration, compiler specific libraries must be
+ redistributed as well. For more information, see the platform
+ specific Application Dependencies sections: \l
+ {deployment-x11.html#application-dependencies}{X11}, \l
+ {deployment-windows.html#application-dependencies}{Windows}, \l
+ {deployment-mac.html#application-dependencies}{Mac}.
+
+ \section1 Licensing
+
+ Some of Qt's libraries are based on third party libraries that are
+ not licensed using the same dual-license model as Qt. As a result,
+ care must be taken when deploying applications that use these
+ libraries, particularly when the application is statically linked
+ to them.
+
+ The following table contains an inexhaustive summary of the issues
+ you should be aware of.
+
+ \table
+ \header \o Qt Library \o Dependency
+ \o Licensing Issue
+ \row \o QtHelp \o CLucene
+ \o The version of clucene distributed with Qt is licensed
+ under the GNU LGPL version 2.1 or later. This has implications for
+ developers of closed source applications. Please see
+ \l{QtHelp Module#License Information}{the QtHelp module documentation}
+ for more information.
+
+ \row \o QtNetwork \o OpenSSL
+ \o Some configurations of QtNetwork use OpenSSL at run-time. Deployment
+ of OpenSSL libraries is subject to both licensing and export restrictions.
+ More information can be found in the \l{Secure Sockets Layer (SSL) Classes}
+ documentation.
+
+ \row \o QtWebKit \o WebKit
+ \o WebKit is licensed under the GNU LGPL version 2 or later.
+ This has implications for developers of closed source applications.
+ Please see \l{QtWebKit Module#License Information}{the QtWebKit module
+ documentation} for more information.
+
+ \row \o Phonon \o Phonon
+ \o Phonon relies on the native multimedia engines on different platforms.
+ Phonon itself is licensed under the GNU LGPL version 2. Please see
+ \l{Phonon Module#License Information}{the Phonon module documentation}
+ for more information.
+ \endtable
+
+ \section1 Platform-Specific Notes
+
+ The procedure of deploying Qt applications is different for the
+ various platforms:
+
+ \list
+ \o \l{Deploying an Application on X11 Platforms}{Qt for X11 Platforms}
+ \o \l{Deploying an Application on Windows}{Qt for Windows}
+ \o \l{Deploying an Application on Mac OS X}{Qt for Mac OS X}
+ \o \l{Deploying Qt for Embedded Linux Applications}{Qt for Embedded Linux}
+ \endlist
+
+ \sa Installation {Window System Specific Notes}
+*/
+
+/*!
+ \page deployment-x11.html
+ \contentspage Deploying Qt Applications
+
+ \title Deploying an Application on X11 Platforms
+ \ingroup deployment
+
+ Due to the proliferation of Unix systems (commercial Unices, Linux
+ distributions, etc.), deployment on Unix is a complex
+ topic. Before we start, be aware that programs compiled for one
+ Unix flavor will probably not run on a different Unix system. For
+ example, unless you use a cross-compiler, you cannot compile your
+ application on Irix and distribute it on AIX.
+
+ Contents:
+
+ \tableofcontents
+
+ This documentation will describe how to determine which files you
+ should include in your distribution, and how to make sure that the
+ application will find them at run-time. We will demonstrate the
+ procedures in terms of deploying the \l {tools/plugandpaint}{Plug
+ & Paint} application that is provided in Qt's examples directory.
+
+ \section1 Static Linking
+
+ Static linking is often the safest and easiest way to distribute
+ an application on Unix since it relieves you from the task of
+ distributing the Qt libraries and ensuring that they are located
+ in the default search path for libraries on the target system.
+
+ \section2 Building Qt Statically
+
+ To use this approach, you must start by installing a static version
+ of the Qt library:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 0
+
+ We specify the prefix so that we do not overwrite the existing Qt
+ installation. The example above only builds the Qt libraries,
+ i.e. the examples and Qt Designer will not be built. When \c make
+ is done, you will find the Qt libraries in the \c /path/to/Qt/lib
+ directory.
+
+ When linking your application against static Qt libraries, note
+ that you might need to add more libraries to the \c LIBS line in
+ your project file. For more information, see the \l {Application
+ Dependencies} section.
+
+ \section2 Linking the Application to the Static Version of Qt
+
+ Once Qt is built statically, the next step is to regenerate the
+ makefile and rebuild the application. First, we must go into the
+ directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 1
+
+ Now run qmake to create a new makefile for the application, and do
+ a clean build to create the statically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 2
+
+ You probably want to link against the release libraries, and you
+ can specify this when invoking \c qmake. Note that we must set the
+ path to the static Qt that we just built.
+
+ To check that the application really links statically with Qt, run
+ the \c ldd tool (available on most Unices):
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 3
+
+ Verify that the Qt libraries are not mentioned in the output.
+
+ Now, provided that everything compiled and linked without any
+ errors, we should have a \c plugandpaint file that is ready for
+ deployment. One easy way to check that the application really can
+ be run stand-alone is to copy it to a machine that doesn't have Qt
+ or any Qt applications installed, and run it on that machine.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must still be redistributed along with your
+ application. For more information, see the \l {Application
+ Dependencies} section.
+
+ The \l {tools/plugandpaint}{Plug & Paint} example consists of
+ several components: The core application (\l
+ {tools/plugandpaint}{Plug & Paint}), and the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
+ {tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugins. Since we cannot deploy plugins using the static linking
+ approach, the executable we have prepared so far is
+ incomplete. The application will run, but the functionality will
+ be disabled due to the missing plugins. To deploy plugin-based
+ applications we should use the shared library approach.
+
+ \section1 Shared Libraries
+
+ We have two challenges when deploying the \l
+ {tools/plugandpaint}{Plug & Paint} application using the shared
+ libraries approach: The Qt runtime has to be correctly
+ redistributed along with the application executable, and the
+ plugins have to be installed in the correct location on the target
+ system so that the application can find them.
+
+ \section2 Building Qt as a Shared Library
+
+ We assume that you already have installed Qt as a shared library,
+ which is the default when installing Qt, in the \c /path/to/Qt
+ directory. For more information on how to build Qt, see the \l
+ {Installation} documentation.
+
+ \section2 Linking the Application to Qt as a Shared Library
+
+ After ensuring that Qt is built as a shared library, we can build
+ the \l {tools/plugandpaint}{Plug & Paint} application. First, we
+ must go into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 4
+
+ Now run qmake to create a new makefile for the application, and do
+ a clean build to create the dynamically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 5
+
+ This builds the core application, the following will build the
+ plugins:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 6
+
+ If everything compiled and linked without any errors, we will get
+ a \c plugandpaint executable and the \c libpnp_basictools.so and
+ \c libpnp_extrafilters.so plugin files.
+
+ \section2 Creating the Application Package
+
+ There is no standard package management on Unix, so the method we
+ present below is a generic solution. See the documentation for
+ your target system for information on how to create a package.
+
+ To deploy the application, we must make sure that we copy the
+ relevant Qt libraries (corresponding to the Qt modules used in the
+ application) as well as the executable to the same
+ directory. Remember that if your application depends on compiler
+ specific libraries, these must also be redistributed along with
+ your application. For more information, see the \l {Application
+ Dependencies} section.
+
+ We'll cover the plugins shortly, but the main issue with shared
+ libraries is that you must ensure that the dynamic linker will
+ find the Qt libraries. Unless told otherwise, the dynamic linker
+ doesn't search the directory where your application resides. There
+ are many ways to solve this:
+
+ \list
+ \o You can install the Qt libraries in one of the system
+ library paths (e.g. \c /usr/lib on most systems).
+
+ \o You can pass a predetermined path to the \c -rpath command-line
+ option when linking the application. This will tell the dynamic
+ linker to look in this directory when starting your application.
+
+ \o You can write a startup script for your application, where you
+ modify the dynamic linker configuration (e.g. adding your
+ application's directory to the \c LD_LIBRARY_PATH environment
+ variable. \note If your application will be running with "Set
+ user ID on execution," and if it will be owned by root, then
+ LD_LIBRARY_PATH will be ignored on some platforms. In this
+ case, use of the LD_LIBRARY_PATH approach is not an option).
+
+ \endlist
+
+ The disadvantage of the first approach is that the user must have
+ super user privileges. The disadvantage of the second approach is
+ that the user may not have privileges to install into the
+ predetemined path. In either case, the users don't have the option
+ of installing to their home directory. We recommend using the
+ third approach since it is the most flexible. For example, a \c
+ plugandpaint.sh script will look like this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 7
+
+ By running this script instead of the executable, you are sure
+ that the Qt libraries will be found by the dynamic linker. Note
+ that you only have to rename the script to use it with other
+ applications.
+
+ When looking for plugins, the application searches in a plugins
+ subdirectory inside the directory of the application
+ executable. Either you have to manually copy the plugins into the
+ \c plugins directory, or you can set the \c DESTDIR in the
+ plugins' project files:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 8
+
+ An archive distributing all the Qt libraries, and all the plugins,
+ required to run the \l {tools/plugandpaint}{Plug & Paint}
+ application, would have to include the following files:
+
+ \table 100%
+ \header
+ \o Component \o {2, 1} File Name
+ \row
+ \o The executable
+ \o {2, 1} \c plugandpaint
+ \row
+ \o The script to run the executable
+ \o {2, 1} \c plugandpaint.sh
+ \row
+ \o The Basic Tools plugin
+ \o {2, 1} \c plugins\libpnp_basictools.so
+ \row
+ \o The ExtraFilters plugin
+ \o {2, 1} \c plugins\libpnp_extrafilters.so
+ \row
+ \o The Qt Core module
+ \o {2, 1} \c libQtCore.so.4
+ \row
+ \o The Qt GUI module
+ \o {2, 1} \c libQtGui.so.4
+ \endtable
+
+ On most systems, the extension for shared libraries is \c .so. A
+ notable exception is HP-UX, which uses \c .sl.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must still be redistributed along with your
+ application. For more information, see the \l {Application
+ Dependencies} section.
+
+ To verify that the application now can be successfully deployed,
+ you can extract this archive on a machine without Qt and without
+ any compiler installed, and try to run it, i.e. run the \c
+ plugandpaint.sh script.
+
+ An alternative to putting the plugins in the \c plugins
+ subdirectory is to add a custom search path when you start your
+ application using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 9
+
+ \section1 Application Dependencies
+
+ \section2 Additional Libraries
+
+ To find out which libraries your application depends on, run the
+ \c ldd tool (available on most Unices):
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 10
+
+ This will list all the shared library dependencies for your
+ application. Depending on configuration, these libraries must be
+ redistributed along with your application. In particular, the
+ standard C++ library must be redistributed if you're compiling
+ your application with a compiler that is binary incompatible with
+ the system compiler. When possible, the safest solution is to link
+ against these libraries statically.
+
+ You will probably want to link dynamically with the regular X11
+ libraries, since some implementations will try to open other
+ shared libraries with \c dlopen(), and if this fails, the X11
+ library might cause your application to crash.
+
+ It's also worth mentioning that Qt will look for certain X11
+ extensions, such as Xinerama and Xrandr, and possibly pull them
+ in, including all the libraries that they link against. If you
+ can't guarantee the presence of a certain extension, the safest
+ approach is to disable it when configuring Qt (e.g. \c {./configure
+ -no-xrandr}).
+
+ FontConfig and FreeType are other examples of libraries that
+ aren't always available or that aren't always binary
+ compatible. As strange as it may sound, some software vendors have
+ had success by compiling their software on very old machines and
+ have been very careful not to upgrade any of the software running
+ on them.
+
+ When linking your application against the static Qt libraries, you
+ must explicitly link with the dependent libraries mentioned
+ above. Do this by adding them to the \c LIBS variable in your
+ project file.
+
+ \section2 Qt Plugins
+
+ Your application may also depend on one or more Qt plugins, such
+ as the JPEG image format plugin or a SQL driver plugin. Be sure
+ to distribute any Qt plugins that you need with your application,
+ and note that each type of plugin should be located within a
+ specific subdirectory (such as \c imageformats or \c sqldrivers)
+ within your distribution directory, as described below.
+
+ \note If you are deploying an application that uses QtWebKit to display
+ HTML pages from the World Wide Web, you should include all text codec
+ plugins to support as many HTML encodings possible.
+
+ The search path for Qt plugins (as well as a few other paths) is
+ hard-coded into the QtCore library. By default, the first plugin
+ search path will be hard-coded as \c /path/to/Qt/plugins. As
+ mentioned above, using pre-determined paths has certain
+ disadvantages, so you need to examine various alternatives to make
+ sure that the Qt plugins are found:
+
+ \list
+
+ \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
+ approach since it provides the most flexibility.
+
+ \o Using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \o Using a third party installation utility or the target system's
+ package manager to change the hard-coded paths in the QtCore
+ library.
+
+ \endlist
+
+ The \l{How to Create Qt Plugins} document outlines the issues you
+ need to pay attention to when building and deploying plugins for
+ Qt applications.
+*/
+
+/*!
+ \page deployment-windows.html
+ \contentspage Deploying Qt Applications
+
+ \title Deploying an Application on Windows
+ \ingroup deployment
+
+ This documentation will describe how to determine which files you
+ should include in your distribution, and how to make sure that the
+ application will find them at run-time. We will demonstrate the
+ procedures in terms of deploying the \l {tools/plugandpaint}{Plug
+ & Paint} application that is provided in Qt's examples directory.
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Static Linking
+
+ If you want to keep things simple by only having a few files to
+ deploy, i.e. a stand-alone executable with the associated compiler
+ specific DLLs, then you must build everything statically.
+
+ \section2 Building Qt Statically
+
+ Before we can build our application we must make sure that Qt is
+ built statically. To do this, go to a command prompt and type the
+ following:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 11
+
+ Remember to specify any other options you need, such as data base
+ drivers, as arguments to \c configure. Once \c configure has
+ finished, type the following:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 12
+
+ This will build Qt statically. Note that unlike with a dynamic build,
+ building Qt statically will result in libraries without version numbers;
+ e.g. \c QtCore4.lib will be \c QtCore.lib. Also, we have used \c nmake
+ in all the examples, but if you use MinGW you must use
+ \c mingw32-make instead.
+
+ \note If you later need to reconfigure and rebuild Qt from the
+ same location, ensure that all traces of the previous configuration are
+ removed by entering the build directory and typing \c{nmake distclean}
+ before running \c configure again.
+
+ \section2 Linking the Application to the Static Version of Qt
+
+ Once Qt has finished building we can build the \l
+ {tools/plugandpaint}{Plug & Paint} application. First we must go
+ into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 13
+
+ We must then run \c qmake to create a new makefile for the
+ application, and do a clean build to create the statically linked
+ executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 14
+
+ You probably want to link against the release libraries, and you
+ can specify this when invoking \c qmake. Now, provided that
+ everything compiled and linked without any errors, we should have
+ a \c plugandpaint.exe file that is ready for deployment. One easy
+ way to check that the application really can be run stand-alone is
+ to copy it to a machine that doesn't have Qt or any Qt
+ applications installed, and run it on that machine.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must still be redistributed along with your
+ application. You can check which libraries your application is
+ linking against by using the \c depends tool. For more
+ information, see the \l {Application Dependencies} section.
+
+ The \l {tools/plugandpaint}{Plug & Paint} example consists of
+ several components: The application itself (\l
+ {tools/plugandpaint}{Plug & Paint}), and the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
+ {tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugins. Since we cannot deploy plugins using the static linking
+ approach, the application we have prepared is incomplete. It will
+ run, but the functionality will be disabled due to the missing
+ plugins. To deploy plugin-based applications we should use the
+ shared library approach.
+
+ \section1 Shared Libraries
+
+ We have two challenges when deploying the \l
+ {tools/plugandpaint}{Plug & Paint} application using the shared
+ libraries approach: The Qt runtime has to be correctly
+ redistributed along with the application executable, and the
+ plugins have to be installed in the correct location on the target
+ system so that the application can find them.
+
+ \section2 Building Qt as a Shared Library
+
+ We assume that you already have installed Qt as a shared library,
+ which is the default when installing Qt, in the \c C:\path\to\Qt
+ directory. For more information on how to build Qt, see the \l
+ {Installation} documentation.
+
+ \section2 Linking the Application to Qt as a Shared Library
+
+ After ensuring that Qt is built as a shared library, we can build
+ the \l {tools/plugandpaint}{Plug & Paint} application. First, we
+ must go into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 15
+
+ Now run \c qmake to create a new makefile for the application, and
+ do a clean build to create the dynamically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 16
+
+ This builds the core application, the following will build the
+ plugins:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 17
+
+ If everything compiled and linked without any errors, we will get
+ a \c plugandpaint.exe executable and the \c pnp_basictools.dll and
+ \c pnp_extrafilters.dll plugin files.
+
+ \section2 Creating the Application Package
+
+ To deploy the application, we must make sure that we copy the
+ relevant Qt DLL (corresponding to the Qt modules used in
+ the application) as well as the executable to the same directory
+ in the \c release subdirectory.
+
+ Remember that if your application depends on compiler specific
+ libraries, these must be redistributed along with your
+ application. You can check which libraries your application is
+ linking against by using the \c depends tool. For more
+ information, see the \l {Application Dependencies} section.
+
+ We'll cover the plugins shortly, but first we'll check that the
+ application will work in a deployed environment: Either copy the
+ executable and the Qt DLLs to a machine that doesn't have Qt
+ or any Qt applications installed, or if you want to test on the
+ build machine, ensure that the machine doesn't have Qt in its
+ environment.
+
+ If the application starts without any problems, then we have
+ successfully made a dynamically linked version of the \l
+ {tools/plugandpaint}{Plug & Paint} application. But the
+ application's functionality will still be missing since we have
+ not yet deployed the associated plugins.
+
+ Plugins work differently to normal DLLs, so we can't just
+ copy them into the same directory as our application's executable
+ as we did with the Qt DLLs. When looking for plugins, the
+ application searches in a \c plugins subdirectory inside the
+ directory of the application executable.
+
+ So to make the plugins available to our application, we have to
+ create the \c plugins subdirectory and copy over the relevant DLLs:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 18
+
+ An archive distributing all the Qt DLLs and application
+ specific plugins required to run the \l {tools/plugandpaint}{Plug
+ & Paint} application, would have to include the following files:
+
+ \table 100%
+ \header
+ \o Component \o {2, 1} File Name
+ \row
+ \o The executable
+ \o {2, 1} \c plugandpaint.exe
+ \row
+ \o The Basic Tools plugin
+ \o {2, 1} \c plugins\pnp_basictools.dll
+ \row
+ \o The ExtraFilters plugin
+ \o {2, 1} \c plugins\pnp_extrafilters.dll
+ \row
+ \o The Qt Core module
+ \o {2, 1} \c qtcore4.dll
+ \row
+ \o The Qt GUI module
+ \o {2, 1} \c qtgui4.dll
+ \endtable
+
+ In addition, the archive must contain the following compiler
+ specific libraries depending on your version of Visual Studio:
+
+ \table 100%
+ \header
+ \o \o VC++ 6.0 \o VC++ 7.1 (2003) \o VC++ 8.0 (2005)
+ \row
+ \o The C run-time
+ \o \c msvcrt.dll
+ \o \c msvcr71.dll
+ \o \c msvcr80.dll
+ \row
+ \o The C++ run-time
+ \o \c msvcp60.dll
+ \o \c msvcp71.dll
+ \o \c msvcp80.dll
+ \endtable
+
+ To verify that the application now can be successfully deployed,
+ you can extract this archive on a machine without Qt and without
+ any compiler installed, and try to run it.
+
+ An alternative to putting the plugins in the plugins subdirectory
+ is to add a custom search path when you start your application
+ using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 19
+
+ One benefit of using plugins is that they can easily be made
+ available to a whole family of applications.
+
+ It's often most convenient to add the path in the application's \c
+ main() function, right after the QApplication object is
+ created. Once the path is added, the application will search it
+ for plugins, in addition to looking in the \c plugins subdirectory
+ in the application's own directory. Any number of additional paths
+ can be added.
+
+ \section2 Visual Studio 2005 Onwards
+
+ When deploying an application compiled with Visual Studio 2005 onwards,
+ there are some additional steps to be taken.
+
+ First, we need to copy the manifest file created when linking the
+ application. This manifest file contains information about the
+ application's dependencies on side-by-side assemblies, such as the runtime
+ libraries.
+
+ The manifest file needs to be copied into the \bold same folder as the
+ application executable. You do not need to copy the manifest files for
+ shared libraries (DLLs), since they are not used.
+
+ If the shared library has dependencies that are different from the
+ application using it, the manifest file needs to be embedded into the DLL
+ binary. Since Qt 4.1.3, the follwoing \c CONFIG options are available for
+ embedding manifests:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 20
+
+ To use the options, add
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 21
+
+ to your .pro file. The \c embed_manifest_dll option is enabled by default.
+
+ You can find more information about manifest files and side-by-side
+ assemblies at the
+ \l {http://msdn.microsoft.com/en-us/library/aa376307.aspx}{MSDN website}.
+
+ There are two ways to include the run time libraries: by bundling them
+ directly with your application or by installing them on the end-user's
+ system.
+
+ To bundle the run time libraries with your application, copy the directory
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 22
+
+ into the folder where your executable is, so that you are including a
+ \c Microsoft.VC80.CRT directory alongside your application's executable. If
+ you are bundling the runtimes and need to deploy plugins as well, you have
+ to remove the manifest from the plugins (embedded as a resource) by adding
+ the following line to the \c{.pro} file of the plugins you are compiling:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 23
+
+ \warning If you skip the step above, the plugins will not load on some
+ systems.
+
+ To install the runtime libraries on the end-user's system, you need to
+ include the appropriate Visual C++ Redistributable Package (VCRedist)
+ executable with your application and ensure that it is executed when the
+ user installs your application.
+
+ For example, on an 32-bit x86-based system, you would include the
+ \l{http://www.microsoft.com/downloads/details.aspx?FamilyId=32BC1BEE-A3F9-4C13-9C99-220B62A191EE}{vcredist_x86.exe}
+ executable. The \l{http://www.microsoft.com/downloads/details.aspx?familyid=526BF4A7-44E6-4A91-B328-A4594ADB70E5}{vcredist_IA64.exe}
+ and \l{http://www.microsoft.com/downloads/details.aspx?familyid=90548130-4468-4BBC-9673-D6ACABD5D13B}{vcredist_x64.exe}
+ executables provide the appropriate libraries for the IA64 and 64-bit x86
+ architectures, respectively.
+
+ \note The application you ship must be compiled with exactly the same
+ compiler version against the same C runtime version. This prevents
+ deploying errors caused by different versions of the C runtime libraries.
+
+
+ \section1 Application Dependencies
+
+ \section2 Additional Libraries
+
+ Depending on configuration, compiler specific libraries must be
+ redistributed along with your application. You can check which
+ libraries your application is linking against by using the
+ \l{Dependency Walker} tool. All you need to do is to run it like
+ this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 24
+
+ This will provide a list of the libraries that your application
+ depends on and other information.
+
+ \image deployment-windows-depends.png
+
+ When looking at the release build of the Plug & Paint executable
+ (\c plugandpaint.exe) with the \c depends tool, the tool lists the
+ following immediate dependencies to non-system libraries:
+
+ \table 100%
+ \header
+ \o Qt
+ \o VC++ 6.0
+ \o VC++ 7.1 (2003)
+ \o VC++ 8.0 (2005)
+ \o MinGW
+ \row
+ \o \list
+ \o QTCORE4.DLL - The QtCore runtime
+ \o QTGUI4.DLL - The QtGui runtime
+ \endlist
+ \o \list
+ \o MSVCRT.DLL - The C runtime
+ \o MSVCP60.DLL - The C++ runtime (only when STL is installed)
+ \endlist
+ \o \list
+ \o MSVCR71.DLL - The C runtime
+ \o MSVCP71.DLL - The C++ runtime (only when STL is installed)
+ \endlist
+ \o \list
+ \o MSVCR80.DLL - The C runtime
+ \o MSVCP80.DLL - The C++ runtime (only when STL is installed)
+ \endlist
+ \o \list
+ \o MINGWM10.DLL - The MinGW run-time
+ \endlist
+ \endtable
+
+ When looking at the plugin DLLs the exact same dependencies
+ are listed.
+
+ \section2 Qt Plugins
+
+ Your application may also depend on one or more Qt plugins, such
+ as the JPEG image format plugin or a SQL driver plugin. Be sure
+ to distribute any Qt plugins that you need with your application,
+ and note that each type of plugin should be located within a
+ specific subdirectory (such as \c imageformats or \c sqldrivers)
+ within your distribution directory, as described below.
+
+ \note If you are deploying an application that uses QtWebKit to display
+ HTML pages from the World Wide Web, you should include all text codec
+ plugins to support as many HTML encodings possible.
+
+ The search path for Qt plugins is hard-coded into the QtCore library.
+ By default, the plugins subdirectory of the Qt installation is the first
+ plugin search path. However, pre-determined paths like the default one
+ have certain disadvantages. For example, they may not exist on the target
+ machine. For that reason, you need to examine various alternatives to make
+ sure that the Qt plugins are found:
+
+ \list
+
+ \o \l{qt-conf.html}{Using \c qt.conf}. This approach is the recommended
+ if you have executables in different places sharing the same plugins.
+
+ \o Using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths(). This approach is recommended if you only
+ have one executable that will use the plugin.
+
+ \o Using a third party installation utility to change the
+ hard-coded paths in the QtCore library.
+
+ \endlist
+
+ If you add a custom path using QApplication::addLibraryPath it could
+ look like this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 54
+
+ Then qApp->libraryPaths() would return something like this:
+
+ "C:/customPath/plugins "
+ "C:/Qt/4.5.0/plugins"
+ "E:/myApplication/directory/"
+
+ The executable will look for the plugins in these directories and
+ the same order as the QStringList returned by qApp->libraryPaths().
+ The newly added path is prepended to the qApp->libraryPaths() which
+ means that it will be searched through first. However, if you use
+ qApp->setLibraryPaths(), you will be able to determend which paths
+ and in which order they will be searched.
+
+ The \l{How to Create Qt Plugins} document outlines the issues you
+ need to pay attention to when building and deploying plugins for
+ Qt applications.
+*/
+
+/*!
+ \page deployment-mac.html
+ \contentspage Deploying Qt Applications
+
+ \title Deploying an Application on Mac OS X
+ \ingroup deployment
+
+ Starting with version 4.5, Qt now includes a \l {macdeploy}{deployment tool}
+ that automates the prodecures described in this document.
+
+ This documentation will describe how to create a bundle, and how
+ to make sure that the application will find the resources it needs
+ at run-time. We will demonstrate the procedures in terms of
+ deploying the \l {tools/plugandpaint}{Plug & Paint} application
+ that is provided in Qt's examples directory.
+
+ \tableofcontents
+
+ \section1 The Bundle
+
+ On the Mac, a GUI application must be built and run from a
+ bundle. A bundle is a directory structure that appears as a single
+ entity when viewed in the Finder. A bundle for an application
+ typcially contains the executable and all the resources it
+ needs. See the image below:
+
+ \image deployment-mac-bundlestructure.png
+
+ The bundle provides many advantages to the user. One primary
+ advantage is that, since it is a single entity, it allows for
+ drag-and-drop installation. As a programmer you can access bundle
+ information in your own code. This is specific to Mac OS X and
+ beyond the scope of this document. More information about bundles
+ is available on \l
+ {http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFBundles/index.html}{Apple's Developer Website}.
+
+ A Qt command line application on Mac OS X works similar to a
+ command line application on Unix and Windows. You probably don't
+ want to run it in a bundle: Add this to your application's .pro:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 26
+
+ This will tell \c qmake not to put the executable inside a
+ bundle. Please refer to the \l{Deploying an Application on
+ X11 Platforms}{X11 deployment documentation} for information about how
+ to deploy these "bundle-less" applications.
+
+ \section1 Xcode
+
+ We will only concern ourselves with command-line tools here. While
+ it is possible to use Xcode for this, Xcode has changed enough
+ between each version that it makes it difficult to document it
+ perfectly for each version. A future version of this document may
+ include more information for using Xcode in the deployment
+ process.
+
+ \section1 Static Linking
+
+ If you want to keep things simple by only having a few files to
+ deploy, then you must build everything statically.
+
+ \section2 Building Qt Statically
+
+ Start by installing a static version of the Qt library. Remember
+ that you will not be able to use plugins and you must build in all
+ the image formats, SQL drivers, etc..
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 27
+
+ You can check the various options that are available by running \c
+ configure -help.
+
+ \section2 Linking the Application to the Static Version of Qt
+
+ Once Qt is built statically, the next step is to regenerate the
+ makefile and rebuild the application. First, we must go into the
+ directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 28
+
+ Now run \c qmake to create a new makefile for the application, and do
+ a clean build to create the statically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 29
+
+ You probably want to link against the release libraries, and you
+ can specify this when invoking \c qmake. If you have Xcode Tools
+ 1.5 or higher installed, you may want to take advantage of "dead
+ code stripping" to reduce the size of your binary even more. You
+ can do this by passing \c {LIBS+= -dead_strip} to \c qmake in
+ addition to the \c {-config release} parameter. This doesn't have
+ as large an effect if you are using GCC 4, since Qt will then have
+ function visibility hints built-in, but if you use GCC 3.3, it
+ could make a difference.
+
+ Now, provided that everything compiled and linked without any
+ errors, we should have a \c plugandpaint.app bundle that is ready
+ for deployment. One easy way to check that the application really
+ can be run stand-alone is to copy the bundle to a machine that
+ doesn't have Qt or any Qt applications installed, and run the
+ application on that machine.
+
+ You can check what other libraries your application links to using
+ the \c otool:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 30
+
+ Here is what the output looks like for the static \l
+ {tools/plugandpaint}{Plug & Paint}:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 31
+
+ For more information, see the \l {Application Dependencies}
+ section.
+
+ If you see \e Qt libraries in the output, it probably
+ means that you have both dynamic and static Qt libraries installed
+ on your machine. The linker will always choose dynamic over
+ static. There are two solutions: Either move your Qt dynamic
+ libraries (\c .dylibs) away to another directory while you link
+ the application and then move them back, or edit the \c Makefile
+ and replace link lines for the Qt libraries with the absolute path
+ to the static libraries. For example, replace
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 32
+
+ with
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 33
+
+ The \l {tools/plugandpaint}{Plug & Paint} example consists of
+ several components: The core application (\l
+ {tools/plugandpaint}{Plug & Paint}), and the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} and \l
+ {tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugins. Since we cannot deploy plugins using the static linking
+ approach, the bundle we have prepared so far is incomplete. The
+ application will run, but the functionality will be disabled due
+ to the missing plugins. To deploy plugin-based applications we
+ should use the framework approach.
+
+ \section1 Frameworks
+
+ We have two challenges when deploying the \l
+ {tools/plugandpaint}{Plug & Paint} application using frameworks:
+ The Qt runtime has to be correctly redistributed along with the
+ application bundle, and the plugins have to be installed in the
+ correct location so that the application can find them.
+
+ When distributing Qt with your application using frameworks, you
+ have two options: You can either distribute Qt as a private
+ framework within your application bundle, or you can distribute Qt
+ as a standard framework (alternatively use the Qt frameworks in
+ the installed binary). These two approaches are essentially the
+ same. The latter option is good if you have many Qt applications
+ and you would prefer to save memory. The former is good if you
+ have Qt built in a special way, or want to make sure the framework
+ is there. It just comes down to where you place the Qt frameworks.
+
+ \section2 Building Qt as Frameworks
+
+ We assume that you already have installed Qt as frameworks, which
+ is the default when installing Qt, in the /path/to/Qt
+ directory. For more information on how to build Qt, see the \l
+ Installation documentation.
+
+ When installing, the identification name of the frameworks will
+ also be set. The identification name is what the dynamic linker
+ (\c dyld) uses to find the libraries for your application.
+
+ \section2 Linking the Application to Qt as Frameworks
+
+ After ensuring that Qt is built as frameworks, we can build the \l
+ {tools/plugandpaint}{Plug & Paint} application. First, we must go
+ into the directory that contains the application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 34
+
+ Now run qmake to create a new makefile for the application, and do
+ a clean build to create the dynamically linked executable:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 35
+
+ This builds the core application, the following will build the
+ plugins:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 36
+
+ Now run the \c otool for the Qt frameworks, for example Qt Gui:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 37
+
+ You will get the following output:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 38
+
+ For the Qt frameworks, the first line (i.e. \c
+ {path/to/Qt/lib/QtGui.framework/Versions/4/QtGui (compatibility
+ version 4.0.0, current version 4.0.1)}) becomes the framework's
+ identification name which is used by the dynamic linker (\c dyld).
+
+ But when you are deploying the application, your users may not
+ have the Qt frameworks installed in the specified location. For
+ that reason, you must either provide the frameworks in an agreed
+ upon location, or store the frameworks in the bundle itself.
+ Regardless of which solution you choose, you must make sure that
+ the frameworks return the proper identification name for
+ themselves, and that the application will look for these
+ names. Luckily we can control this with the \c install_name_tool
+ command-line tool.
+
+ The \c install_name_tool works in two modes, \c -id and \c
+ -change. The \c -id mode is for libraries and frameworks, and
+ allows us to specify a new identification name. We use the \c
+ -change mode to change the paths in the application.
+
+ Let's test this out by copying the Qt frameworks into the Plug &
+ Paint bundle. Looking at \c otool's output for the bundle, we can
+ see that we must copy both the QtCore and QtGui frameworks into
+ the bundle. We will assume that we are in the directory where we
+ built the bundle.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 39
+
+ First we create a \c Frameworks directory inside the bundle. This
+ follows the Mac OS X application convention. We then copy the
+ frameworks into the new directory. Since frameworks contain
+ symbolic links, and we want to preserve them, we use the \c -R
+ option.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 40
+
+ Then we run \c install_name_tool to set the identification names
+ for the frameworks. The first argument after \c -id is the new
+ name, and the second argument is the framework which
+ identification we wish to change. The text \c @executable_path is
+ a special \c dyld variable telling \c dyld to start looking where
+ the executable is located. The new names specifies that these
+ frameworks will be located "one directory up and over" in the \c
+ Frameworks directory.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 41
+
+ Now, the dynamic linker knows where to look for QtCore and
+ QtGui. Then we must make the application aware of the library
+ locations as well using \c install_name_tool's \c -change mode.
+ This basically comes down to string replacement, to match the
+ identification names that we set for the frameworks.
+
+ Finally, since the QtGui framework depends on QtCore, we must
+ remember to change the reference for QtGui:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 42
+
+ After all this we can run \c otool again and see that the
+ application will look in the right locations.
+
+ Of course, the thing that makes the \l {tools/plugandpaint}{Plug &
+ Paint} example interesting are its plugins. The basic steps we
+ need to follow with plugins are:
+
+ \list
+ \o Put the plugins inside the bundle
+ \o Make sure that the plugins use the correct library using the
+ \c install_name_tool
+ \o Make sure that the application knows where to get the plugins
+ \endlist
+
+ While we can put the plugins anywhere we want in the bundle, the
+ best location to put them is under Contents/Plugins. When we built
+ the Plug & Paint plugins, the \c DESTDIR variable in their \c .pro
+ file put the plugins' \c .dylib files in a \c plugins subdirectory
+ in the \c plugandpaint directory. So, in this example, all we need
+ to do is move this directory:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 43
+
+ If we run \c otool on for example the \l
+ {tools/plugandpaintplugins/basictools}{Basic Tools} plugin's \c
+ .dylib file we get the following information.
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 44
+
+ Then we can see that the plugin links to the Qt frameworks it was
+ built against. Since we want the plugins to use the framework in
+ the application bundle we change them the same way as we did for
+ the application. For example for the Basic Tools plugin:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 45
+
+
+ We must also modify the code in \c
+ tools/plugandpaint/mainwindow.cpp to \l {QDir::cdUp()}{cdUp()} one
+ directory since the plugins live in the bundle. Add the following
+ code to the \c mainwindow.cpp file:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 46
+
+ \table
+ \row
+ \o \inlineimage deployment-mac-application.png
+ \o
+ The additional code in \c tools/plugandpaint/mainwindow.cpp also
+ enables us to view the plugins in the Finder, as shown to the left.
+
+ We can also add plugins extending Qt, for example adding SQL
+ drivers or image formats. We just need to follow the directory
+ structure outlined in plugin documentation, and make sure they are
+ included in the QCoreApplication::libraryPaths(). Let's quickly do
+ this with the image formats, following the approach from above.
+
+ Copy Qt's image format plugins into the bundle:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 47
+
+ Use \c install_name_tool to link the plugins to the frameworks in
+ the bundle:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 48
+
+ Then we update the source code in \c tools/plugandpaint/main.cpp
+ to look for the the new plugins. After constructing the
+ QApplication, we add the following code:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 49
+
+ First, we tell the application to only look for plugins in this
+ directory. In our case, this is what we want since we only want to
+ look for the plugins that we distribute with the bundle. If we
+ were part of a bigger Qt installation we could have used
+ QCoreApplication::addLibraryPath() instead.
+
+ \endtable
+
+ \warning When deploying plugins, and thus make changes to the
+ source code, the default identification names are reset when
+ rebuilding the application, and you must repeat the process of
+ making your application link to the Qt frameworks in the bundle
+ using \c install_name_tool.
+
+ Now you should be able to move the application to another Mac OS X
+ machine and run it without Qt installed. Alternatively, you can
+ move your frameworks that live outside of the bundle to another
+ directory and see if the application still runs.
+
+ If you store the frameworks in another location than in the
+ bundle, the technique of linking your application is similar; you
+ must make sure that the application and the frameworks agree where
+ to be looking for the Qt libraries as well as the plugins.
+
+ \section2 Creating the Application Package
+
+ When you are done linking your application to Qt, either
+ statically or as frameworks, the application is ready to be
+ distributed. Apple provides a fair bit of information about how to
+ do this and instead of repeating it here, we recommend that you
+ consult their \l
+ {http://developer.apple.com/documentation/DeveloperTools/Conceptual/SoftwareDistribution/index.html}{software delivery}
+ documentation.
+
+ Although the process of deploying an application do have some
+ pitfalls, once you know the various issues you can easily create
+ packages that all your Mac OS X users will enjoy.
+
+ \section1 Application Dependencies
+
+ \section2 Qt Plugins
+
+ Your application may also depend on one or more Qt plugins, such
+ as the JPEG image format plugin or a SQL driver plugin. Be sure
+ to distribute any Qt plugins that you need with your application,
+ and note that each type of plugin should be located within a
+ specific subdirectory (such as \c imageformats or \c sqldrivers)
+ within your distribution directory, as described below.
+
+ \note If you are deploying an application that uses QtWebKit to display
+ HTML pages from the World Wide Web, you should include all text codec
+ plugins to support as many HTML encodings possible.
+
+ The search path for Qt plugins (as well as a few other paths) is
+ hard-coded into the QtCore library. By default, the first plugin
+ search path will be hard-coded as \c /path/to/Qt/plugins. But
+ using pre-determined paths has certain disadvantages. For example,
+ they may not exist on the target machine. For that reason you need
+ to examine various alternatives to make sure that the Qt plugins
+ are found:
+
+ \list
+
+ \o \l{qt-conf.html}{Using \c qt.conf}. This is the recommended
+ approach since it provides the most flexibility.
+
+ \o Using QApplication::addLibraryPath() or
+ QApplication::setLibraryPaths().
+
+ \o Using a third party installation utility to change the
+ hard-coded paths in the QtCore library.
+
+ \endlist
+
+ The \l{How to Create Qt Plugins} document outlines the issues you
+ need to pay attention to when building and deploying plugins for
+ Qt applications.
+
+ \section2 Additional Libraries
+
+ You can check which libraries your application is linking against
+ by using the \c otool tool. To use \c otool, all you need to do is
+ to run it like this:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 50
+
+ Unlike the deployment processes on \l {Deploying an Application on
+ X11 Platforms}{X11} and \l {Deploying an Application on
+ Windows}{Windows}, compiler specific libraries rarely have to
+ be redistributed along with your application. But since Qt can be
+ configured, built, and installed in several ways on Mac OS X,
+ there are also several ways to deploy applications. Typically your
+ goals help determine how you are going to deploy the
+ application. The last sections describe a couple of things to keep
+ in mind when you are deploying your application.
+
+ \section2 Mac OS X Version Dependencies
+
+ Qt 4.2 has been designed to be built and deployed on Mac OS X 10.3
+ up until the current version as of this writing, Mac OS X 10.4 and
+ all their minor releases. Qt achieves this by using "weak
+ linking." This means that Qt tests if a function added in newer
+ versions of Mac OS X is available on the computer it is running on
+ before it uses it. This results in getting access to newer
+ features when running on newer versions of OS X while still
+ remaining compatible on older versions.
+
+ For more information about cross development issues on Mac OS X,
+ see \l
+ {http://developer.apple.com/documentation/DeveloperTools/Conceptual/cross_development/index.html}{Apple's Developer Website}.
+
+ Since the linker is set to be compatible with all OS X version, you have to
+ change the \c MACOSX_DEPLOYMENT_TARGET environment variable to get weak
+ linking to work for your application. You can add:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51
+
+ to your .pro file and qmake will take care of this for you.
+
+ However, there is a bit of a wrinkle to keep in mind when your are
+ deploying. Mac OS X 10.4 ("Tiger") ships GCC 4.0 as its default
+ compiler. This is also the GCC compiler we use for building the
+ binary Qt package. If you use GCC 4.0 to build your application,
+ it will link against a dynamic libstdc++ that is only available on
+ Mac OS X 10.4 and Mac OS X 10.3.9. The application will refuse to
+ run on older versions of the operating system.
+
+ For more information about C++ runtime environment, see \l
+ {http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/index.html}{Apple's Developer Website}
+
+ If you want to deploy to versions of Mac OS X earlier than 10.3.9,
+ you must build with GCC 3.3 which is the default on Mac OS X
+ 10.3. GCC 3.3 is also available on the Mac OS X 10.4 "Xcode Tools"
+ CD and as a download for earlier versions of Mac OS X from Apple
+ (\l {https://connect.apple.com/}{connect.apple.com}). You can use
+ Apple's \c gcc_select(1) command line tool to switch the default
+ complier on your system.
+
+ \section3 Deploying Phonon Applications on Mac OS X
+
+ \list
+ \o If you build your Phonon application on Tiger, it will work on
+ Tiger, Leopard and Panther.
+ \o If you build your application on Leopard, it will \bold not work
+ on Panther unless you rename the libraries with the following command
+ after you have built your application:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51a
+
+ This command must be invoked in the directory where
+ \c{libphonon_qt7.dylib} is located, usually in
+ \c{yourapp.app/Contents/plugins/phonon_backend/}.
+ \o The \l {macdeploy}{deployment tool} will perform this step for you.
+
+ \o If you are using Leopard, but would like to build your application
+ against Tiger, you can use:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 51b
+ \endlist
+
+ \section2 Architecture Dependencies
+
+ The Qt for Mac OS X libraries, tools, and examples can be built "universal"
+ (i.e. they run natively on both Intel and PowerPC machines). This
+ is accomplished by passing \c -universal on the \c configure line
+ of the source package, and requires that you use GCC 4.0.x. On
+ PowerPC hardware you will need to pass the universal SDK as a
+ command line argument to the Qt configure command. For example:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 52
+
+ From 4.1.1 the Qt binary package is already universal.
+
+ If you want to create a binary that runs on older versions of
+ PowerPC and x86, it is possible to build Qt for the PowerPC using
+ GCC 3.3, and for x86 one using GCC 4.0, and use Apple's \c lipo(1)
+ tool to stitch them together. This is beyond the scope of this
+ document and is not something we have tried, but Apple documents
+ it on their \l
+ {http://developer.apple.com/documentation/}{developer website}.
+
+ Once you have a universal Qt, \a qmake will generate makefiles
+ that will build for its host architecture by default. If you want
+ to build for a specific architecture, you can control this with
+ the \c CONFIG line in your \c .pro file. Use \c CONFIG+=ppc for
+ PowerPC, and \c CONFIG+=x86 for x86. If you desire both, simply
+ add both to the \c CONFIG line. PowerPC users also need an
+ SDK. For example:
+
+ \snippet doc/src/snippets/code/doc_src_deployment.qdoc 53
+
+ Besides \c lipo, you can also check your binaries with the \c file(1)
+ command line tool or the Finder.
+
+ \section1 The Mac Deployment Tool
+ \target macdeploy
+ The Mac deployment tool can be found in QTDIR/bin/macdeployqt. It is
+ designed to automate the process of creating a deployable
+ application bundle that contains the Qt libraries as private
+ frameworks.
+
+ The mac deployment tool also deploys the Qt plugins, according
+ to the following rules:
+ \list
+ \o Debug versions of the plugins are not deployed.
+ \o The designer plugins are not deployed.
+ \o The Image format plugins are always deployed.
+ \o SQL driver plugins are deployed if the application uses the QtSql module.
+ \o Script plugins are deployed if the application uses the QtScript module.
+ \o The Phonon backend plugin is deployed if the application uses the \l{Phonon Module} {Phonon} module.
+ \o The svg icon plugin is deployed if the application uses the QtSvg module.
+ \o The accessibility plugin is always deployed.
+ \o Accessibility for Qt3Support is deployed if the application uses the Qt3Support module.
+ \endlist
+
+ macdeployqt supports the following options:
+ \list
+ \o -no-plugins: Skip plugin deployment
+ \o -dmg : Create a .dmg disk image
+ \o -no-strip : Don't run 'strip' on the binaries
+ \endlist
+*/
diff --git a/doc/src/designer-manual.qdoc b/doc/src/designer-manual.qdoc
new file mode 100644
index 0000000..9eb43b7
--- /dev/null
+++ b/doc/src/designer-manual.qdoc
@@ -0,0 +1,2762 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page designer-manual.html
+
+ \title Qt Designer Manual
+ \ingroup qttools
+ \keyword Qt Designer
+
+ \QD is Qt Software's tool for designing and building graphical user
+ interfaces (GUIs) from Qt components. You can compose and customize your
+ widgets or dialogs in a what-you-see-is-what-you-get (WYSIWYG) manner, and
+ test them using different styles and resolutions.
+
+ Widgets and forms created with \QD integrated seamlessly with programmed
+ code, using Qt's signals and slots mechanism, that lets you easily assign
+ behavior to graphical elements. All properties set in \QD can be changed
+ dynamically within the code. Furthermore, features like widget promotion
+ and custom plugins allow you to use your own components with \QD.
+
+ If you are new to \QD, you can take a look at the
+ \l{Getting To Know Qt Designer} document.
+
+ Qt Designer 4.5 boasts a long list of improvements. For a detailed list of
+ what is new, refer \l{What's New in Qt Designer 4.5}.
+
+ \image designer-multiple-screenshot.png
+
+ For more information on using \QD, you can take a look at the following
+ links:
+
+ \list
+ \o \l{Qt Designer's Editing Modes}
+ \list
+ \o \l{Qt Designer's Widget Editing Mode}{Widget Editing Mode}
+ \o \l{Qt Designer's Signals and Slots Editing Mode}
+ {Signals and Slots Editing Mode}
+ \o \l{Qt Designer's Buddy Editing Mode}
+ {Buddy Editing Mode}
+ \o \l{Qt Designer's Tab Order Editing Mode}
+ {Tab Order Editing Mode}
+ \endlist
+ \o \l{Using Layouts in Qt Designer}
+ \o \l{Saving, Previewing and Printing Forms in Qt Designer}
+ \o \l{Using Containers in Qt Designer}
+ \o \l{Creating Main Windows in Qt Designer}
+ \o \l{Editing Resources with Qt Designer}
+ \o \l{Using Stylesheets with Qt Designer}
+ \o \l{Using a Designer .ui File in Your Application}
+ \endlist
+
+ For advanced usage of \QD, you can refer to these links:
+
+ \list
+ \o \l{Customizing Qt Designer Forms}
+ \o \l{Using Custom Widgets with Qt Designer}
+ \o \l{Creating Custom Widgets for Qt Designer}
+ \o \l{Creating Custom Widget Extensions}
+ \o \l{Qt Designer's UI File Format}
+ \endlist
+
+
+ \section1 Legal Notices
+
+ Some source code in \QD is licensed under specific highly permissive
+ licenses from the original authors. Trolltech gratefully acknowledges
+ these contributions to \QD and all uses of \QD should also acknowledge
+ these contributions and quote the following license statements in an
+ appendix to the documentation.
+
+ \list
+ \i \l{Implementation of the Recursive Shadow Casting Algorithm in Qt Designer}
+ \endlist
+*/
+
+
+
+/*!
+ \page designer-whats-new.html
+ \contentspage {Qt Designer Manual}{Contents}
+
+
+ \title What's New in Qt Designer 4.5
+
+ \section1 General Changes
+
+
+ \table
+ \header
+ \i Widget Filter Box
+ \i Widget Morphing
+ \i Disambiguation Field
+ \row
+ \i \inlineimage designer-widget-filter.png
+ \i \inlineimage designer-widget-morph.png
+ \i \inlineimage designer-disambiguation.png
+ \endtable
+
+ \list 1
+ \i Displaying only icons in the \gui{Widget Box}: It is now possible
+ for the \gui{Widget Box} to display icons only. Simply select
+ \gui{Icon View} from the context menu.
+ \i Filter for \gui{Widget Box}: A filter is now provided to quickly
+ locate the widget you need. If you use a particular widget
+ frequently, you can always add it to the
+ \l{Getting to Know Qt Designer#WidgetBox}{scratch pad}.
+ \i Support for QButtonGroup: It is available via the context
+ menu of a selection of QAbstractButton objects.
+ \i Improved support for item widgets: The item widgets' (e.g.,
+ QListWidget, QTableWidget, and QTreeWidget) contents dialogs have
+ been improved. You can now add translation comments and also modify
+ the header properties.
+ \i Widget morphing: A widget can now be morphed from one type to
+ another with its layout and properties preserved. To begin, click
+ on your widget and select \gui{Morph into} from the context menu.
+ \i Disambiguation field: The property editor now shows this extra
+ field under the \gui{accessibleDescription} property. This field
+ has been introduced to aid translators in the case of two source
+ texts being the same but used for different purposes. For example,
+ a dialog could have two \gui{Add} buttons for two different
+ reasons. \note To maintain compatibility, comments in \c{.ui} files
+ created prior to Qt 4.5 will be listed in the \gui{Disambiguation}
+ field.
+ \endlist
+
+
+
+ \section1 Improved Shortcuts for the Editing Mode
+
+ \list
+ \i The \key{Shift+Click} key combination now selects the ancestor for
+ nested layouts. This iterates from one ancestor to the other.
+
+ \i The \key{Ctrl} key is now used to toggle and copy drag. Previously
+ this was done with the \key{Shift} key but is now changed to
+ conform to standards.
+
+ \i The left mouse button does rubber band selection for form windows;
+ the middle mouse button does rubber band selection everywhere.
+ \endlist
+
+
+ \section1 Layouts
+ \list
+ \i It is now possible to switch a widget's layout without breaking it
+ first. Simply select the existing layout and change it to another
+ type using the context menu or the layout buttons on the toolbar.
+
+ \i To quickly populate a \gui{Form Layout}, you can now use the
+ \gui{Add form layout row...} item available in the context menu or
+ double-click on the red layout.
+ \endlist
+
+
+ \section1 Support for Embedded Design
+
+ \table
+ \header
+ \i Comboboxes to Select a Device Profile
+ \row
+ \i \inlineimage designer-embedded-preview.png
+ \endtable
+
+ It is now possible to specify embedded device profiles, e.g., Style, Font,
+ Screen DPI, resolution, default font, etc., in \gui{Preferences}. These
+ settings will affect the \gui{Form Editor}. The profiles will also be
+ visible with \gui{Preview}.
+
+
+ \section1 Related Classes
+
+ \list
+ \i QUiLoader \mdash forms loaded with this class will now react to
+ QEvent::LanguageChange if QUiLoader::setLanguageChangeEnabled() or
+ QUiLoader::isLanguageChangeEnabled() is set to true.
+
+ \i QDesignerCustomWidgetInterface \mdash the
+ \l{QDesignerCustomWidgetInterface::}{domXml()} function now has new
+ attributes for its \c{<ui>} element. These attributes are
+ \c{language} and \c{displayname}. The \c{language} element can be
+ one of the following "", "c++", "jambi". If this element is
+ specified, it must match the language in which Designer is running.
+ Otherwise, this element will not be available. The \c{displayname}
+ element represents the name that will be displayed in the
+ \gui{Widget Box}. Previously this was hardcoded to be the class
+ name.
+
+ \i QWizard \mdash QWizard's page now has a string \c{id} attribute that
+ can be used to fill in enumeration values to be used by the
+ \c{uic}. However, this attribute has no effect on QUiLoader.
+ \endlist
+*/
+
+
+/*!
+ \page designer-to-know.html
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \title Getting to Know Qt Designer
+
+ \tableofcontents
+
+ \image designer-screenshot.png
+
+ \section1 Launching Designer
+
+ The way that you launch \QD depends on your platform:
+
+ \list
+ \i On Windows, click the Start button, under the \gui Programs submenu,
+ open the \gui{Qt 4} submenu and click \gui Designer.
+ \i On Unix or Linux, you might find a \QD icon on the desktop
+ background or in the desktop start menu under the \gui Programming
+ or \gui Development submenus. You can launch \QD from this icon.
+ Alternatively, you can type \c{designer} in a terminal window.
+ \i On Mac OS X, double click on \QD in \gui Finder.
+ \endlist
+
+ \section1 The User Interface
+
+ When used as a standalone application, \QD's user interface can be
+ configured to provide either a multi-window user interface (the default
+ mode), or it can be used in docked window mode. When used from within an
+ integrated development environment (IDE) only the multi-window user
+ interface is available. You can switch modes in the \gui Preferences dialog
+ from the \gui Edit menu.
+
+ In multi-window mode, you can arrange each of the tool windows to suit your
+ working style. The main window consists of a menu bar, a tool bar, and a
+ widget box that contains the widgets you can use to create your user
+ interface.
+
+ \target MainWindow
+ \table
+ \row
+ \i \inlineimage designer-main-window.png
+ \i \bold{Qt Designer's Main Window}
+
+ The menu bar provides all the standard actions for managing forms,
+ using the clipboard, and accessing application-specific help.
+ The current editing mode, the tool windows, and the forms in use can
+ also be accessed via the menu bar.
+
+ The tool bar displays common actions that are used when editing a form.
+ These are also available via the main menu.
+
+ The widget box provides common widgets and layouts that are used to
+ design components. These are grouped into categories that reflect their
+ uses or features.
+ \endtable
+
+ Most features of \QD are accessible via the menu bar, the tool bar, or the
+ widget box. Some features are also available through context menus that can
+ be opened over the form windows. On most platforms, the right mouse is used
+ to open context menus.
+
+ \target WidgetBox
+ \table
+ \row
+ \i \inlineimage designer-widget-box.png
+ \i \bold{Qt Designer's Widget Box}
+
+ The widget box provides a selection of standard Qt widgets, layouts,
+ and other objects that can be used to create user interfaces on forms.
+ Each of the categories in the widget box contain widgets with similar
+ uses or related features.
+
+ \note Since Qt 4.4, new widgets have been included, e.g.,
+ QPlainTextEdit, QCommandLinkButton, QScrollArea, QMdiArea, and
+ QWebView.
+
+ You can display all of the available objects in a category by clicking
+ on the handle next to the category label. When in
+ \l{Qt Designer's Widget Editing Mode}{Widget Editing
+ Mode}, you can add objects to a form by dragging the appropriate items
+ from the widget box onto the form, and dropping them in the required
+ locations.
+
+ \QD provides a scratch pad feature that allows you to collect
+ frequently used objects in a separate category. The scratch pad
+ category can be filled with any widget currently displayed in a form
+ by dragging them from the form and dropping them onto the widget box.
+ These widgets can be used in the same way as any other widgets, but
+ they can also contain child widgets. Open a context menu over a widget
+ to change its name or remove it from the scratch pad.
+ \endtable
+
+
+ \section1 The Concept of Layouts in Qt
+
+ A layout is used to arrange and manage the elements that make up a user
+ interface. Qt provides a number of classes to automatically handle layouts
+ -- QHBoxLayout, QVBoxLayout, QGridLayout, and QFormLayout. These classes
+ solve the challenge of laying out widgets automatically, providing a user
+ interface that behaves predictably. Fortunately knowledge of the layout
+ classes is not required to arrange widgets with \QD. Instead, select one of
+ the \gui{Lay Out Horizontally}, \gui{Lay Out in a Grid}, etc., options from
+ the context menu.
+
+ Each Qt widget has a recommended size, known as \l{QWidget::}{sizeHint()}.
+ The layout manager will attempt to resize a widget to meet its size hint.
+ In some cases, there is no need to have a different size. For example, the
+ height of a QLineEdit is always a fixed value, depending on font size and
+ style. In other cases, you may require the size to change, e.g., the width
+ of a QLineEdit or the width and height of item view widgets. This is where
+ the widget size constraints -- \l{QWidget::minimumSize()}{minimumSize} and
+ \l{QWidget::maximumSize()}{maximumSize} constraints come into play. These
+ are properties you can set in the property editor. Alternatively, to use
+ the current size as a size constraint value, choose one of the
+ \gui{Size Constraint} options from the widget's context menu. The layout
+ will then ensure that those constraints are met.
+
+ The screenshot below shows the breakdown of a basic user interface designed
+ using a grid. The coordinates on the screenshot show the position of each
+ widget within the grid.
+
+ \image addressbook-tutorial-part3-labeled-layout.png
+
+ \note Inside the grid, the QPushButton objects are actually nested. The
+ buttons on the right are first placed in a QVBoxLayout; the buttons at the
+ bottom are first placed in a QHBoxLayout. Finally, they are put into
+ coordinates (1,2) and (3,1) of the QGridLayout.
+
+ To visualize, imagine the layout as a box that shrinks as much as possible,
+ attempting to \e squeeze your widgets in a neat arrangement, and, at the
+ same time, maximize the use of available space.
+
+ Qt's layouts help when you:
+
+ \list 1
+ \i Resize the user face to fit different window sizes.
+ \i Resize elements within the user interface to suit different
+ localizations.
+ \i Arrange elements to adhere to layout guidelines for different
+ platforms.
+ \endlist
+
+ So, you no longer have to worry about rearranging widgets for different
+ platforms, settings, and languages.
+
+ The example below shows how different localizations can affect the user
+ interface. When a localization requires more space for longer text strings
+ the Qt layout automatically scales to accommodate this, while ensuring that
+ the user interface looks presentable and still matches the platform
+ guidelines.
+
+ \table
+ \header
+ \i A Dialog in English
+ \i A Dialog in French
+ \row
+ \i \image designer-english-dialog.png
+ \i \image designer-french-dialog.png
+ \endtable
+
+ The process of laying out widgets consists of creating the layout hierarchy
+ while setting as few widget size constraints as possible.
+
+ For a more technical perspective on Qt's layout classes, refer to the
+ \l{Layout Classes} document.
+*/
+
+
+/*!
+ \page designer-quick-start.html
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \title A Quick Start to Qt Designer
+
+ Using \QD involves \bold four basic steps:
+
+ \list 1
+ \o Choose your form and objects
+ \o Lay the objects out on the form
+ \o Connect the signals to the slots
+ \o Preview the form
+ \endlist
+
+ \omit
+ \image rgbController-screenshot.png
+ \endomit
+
+ Suppose you would like to design a small widget (see screenshot above)
+ that contains the controls needed to manipulate Red, Green and Blue (RGB)
+ values -- a type of widget that can be seen everywhere in image
+ manipulation programs.
+
+ \table
+ \row
+ \i \inlineimage designer-choosing-form.png
+ \i \bold{Choosing a Form}
+
+ You start by choosing \gui Widget from the \gui{New Form} dialog.
+ \endtable
+
+ Then you drag three labels, three spin boxes and three vertical sliders
+ on to your form. You can roughly arrange them according to how you would
+ like them to be laid out.
+
+ \omit
+ \table
+ \row \o \inlineimage rgbController-widgetBox.png
+ \o \inlineimage rgbController-arrangement.png
+ \endtable
+ \endomit
+
+ To ensure that they are laid out exactly like this in your program, you
+ need to place these widgets into a layout. We will do this in groups of
+ three. Select the "RED" label. Then, hold down \key Shift while you select
+ its corresponding spin box and slider. In the \gui{Form} menu, select
+ \gui{Lay Out in a Grid}.
+
+ \omit
+ \table
+ \row
+ \i \inlineimage rgbController-form-gridLayout.png
+ \i \inlineimage rgbController-selectForLayout.png
+ \endtable
+ \endomit
+
+
+ Repeat the step for the other two labels along with their corresponding
+ spin boxes and sliders as well. Your form will now look similar to the
+ screenshot below.
+
+ \omit
+ \image rgbController-almostLaidOut.png
+ \endomit
+
+ The next step is to combine all three layouts into one \bold{main layout}.
+ It is important that your form has a main layout; otherwise, the widgets
+ on your form will not resize when your form is resized. To set the main
+ layout, \gui{Right click} anywhere on your form, outside of the three
+ separate layouts, and select \gui{Lay Out Horizontally}. Alternatively, you
+ could also select \gui{Lay Out in a Grid} -- you will still see the same
+ arrangement.
+
+ \note Main layouts cannot be seen on the form. To check if you have a main
+ layout installed, try resizing your form; your widgets should resize
+ accordingly.
+
+ When you click on the slider and drag it to a certain value, you want the
+ spin box to display the slider's position. To do this, you need to connect
+ the slider's \l{QAbstractSlider::}{valueChanged()} signal to the spin box's
+ \l{QSpinBox::}{setValue()} slot. You also need to make the reverse
+ connections, e.g., connect the spin box's \l{QSpinBox::}{valueChanged()}
+ signal to the slider's \l{QAbstractSlider::value()}{setValue()} slot.
+
+ To do this, you have to switch to \gui{Edit Signals/Slots} mode, either by
+ pressing \key{F4} or something \gui{Edit Signals/Slots} from the \gui{Edit}
+ menu.
+
+ \omit
+ \table
+ \row
+ \i \inlineimage rgbController-signalsAndSlots.png
+ \i \bold{Connecting Signals to Slots}
+
+ Click on the slider and drag the cursor towards the spin box. The
+ \gui{Configure Connection} dialog, shown below, will pop up. Select the
+ correct signal and slot and click \gui OK.
+ \endtable
+ \endomit
+
+ \omit
+ \image rgbController-configureConnection.png
+ \endomit
+
+ Repeat the step (in reverse order), clicking on the spin box and dragging
+ the cursor towards the slider, to connect the spin box's
+ \l{QSpinBox::}{valueChanged()} signal to the slider's
+ \l{QAbstractSlider::value()}{setValue()} slot.
+
+ Now that you have successfully connected the objects for the "RED"
+ component of the RGB Controller, do the same for the "GREEN" and "BLUE"
+ components as well.
+
+ Since RGB values range between 0 and 255, we need to limit the spin box
+ and slider to that particular range.
+
+ \omit
+ \table
+ \row
+ \i \inlineimage rgbController-property-editing.png
+ \i \bold{Setting Widget Properties}
+
+ Click on the first spin box. Within the \gui{Property Editor}, you will
+ see \l{QSpinBox}'s properties. Enter "255" for the
+ \l{QSpinBox::}{maximum} property. Then, click on the first vertical
+ slider, you will see \l{QAbstractSlider}'s properties. Enter "255" for
+ the \l{QAbstractSlider::}{maximum} property as well. Repeat this
+ process for the remaining spin boxes and sliders.
+ \endtable
+ \endomit
+
+ Now, we preview your form to see how it would look in your application. To
+ preview your form, press \key{Ctrl + R} or select \gui Preview from the
+ \gui Form menu.
+
+ \omit
+ \image rgbController-preview.png
+ \endomit
+
+ Try dragging the slider - the spin box will mirror its value too (and vice
+ versa). Also, you can resize it to see how the layouts used to manage the
+ child widgets respond to different window sizes.
+*/
+
+
+/*!
+ \page designer-editing-mode.html
+ \previouspage Getting to Know Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Using Layouts in Qt Designer
+
+ \title Qt Designer's Editing Modes
+
+ \QD provides four editing modes: \l{Qt Designer's Widget Editing Mode}
+ {Widget Editing Mode}, \l{Qt Designer's Signals and Slots Editing Mode}
+ {Signals and Slots Editing Mode}, \l{Qt Designer's Buddy Editing Mode}
+ {Buddy Editing Mode} and \l{Qt Designer's Tab Order Editing Mode}
+ {Tab Order Editing Mode}. When working with \QD, you will always be in one
+ of these four modes. To switch between modes, simply select it from the
+ \gui{Edit} menu or the toolbar. The table below describes these modes in
+ further detail.
+
+ \table
+ \header \i \i \bold{Editing Modes}
+ \row
+ \i \inlineimage designer-widget-tool.png
+ \i In \l{Qt Designer's Widget Editing Mode}{Edit} mode, we can
+ change the appearance of the form, add layouts, and edit the
+ properties of each widget. To switch to this mode, press
+ \key{F3}. This is \QD's default mode.
+
+ \row
+ \i \inlineimage designer-connection-tool.png
+ \i In \l{Qt Designer's Signals and Slots Editing Mode}
+ {Signals and Slots} mode, we can connect widgets together using
+ Qt's signals and slots mechanism. To switch to this mode, press
+ \key{F4}.
+
+ \row
+ \i \inlineimage designer-buddy-tool.png
+ \i In \l{Qt Designer's Buddy Editing Mode}{Buddy Editing Mode},
+ buddy widgets can be assigned to label widgets to help them
+ handle keyboard focus correctly.
+
+ \row
+ \i \inlineimage designer-tab-order-tool.png
+ \i In \l{Qt Designer's Tab Order Editing Mode}
+ {Tab Order Editing Mode}, we can set the order in which widgets
+ receive the keyboard focus.
+ \endtable
+
+*/
+
+
+/*!
+ \page designer-widget-mode.html
+ \previouspage Qt Designer's Editing Modes
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Qt Designer's Signals and Slots Editing Mode
+
+ \title Qt Designer's Widget Editing Mode
+
+ \image designer-editing-mode.png
+
+ In the Widget Editing Mode, objects can be dragged from the main window's
+ widget box to a form, edited, resized, dragged around on the form, and even
+ dragged between forms. Object properties can be modified interactively, so
+ that changes can be seen immediately. The editing interface is intuitive
+ for simple operations, yet it still supports Qt's powerful layout
+ facilities.
+
+
+ \tableofcontents
+
+ To create and edit new forms, open the \gui File menu and select
+ \gui{New Form...} or press \key{Ctrl+N}. Existing forms can also be edited
+ by selecting \gui{Open Form...} from the \gui File menu or pressing
+ \key{Ctrl+O}.
+
+ At any point, you can save your form by selecting the \gui{Save From As...}
+ option from the \gui File menu. The \c{.ui} files saved by \QD contain
+ information about the objects used, and any details of signal and slot
+ connections between them.
+
+
+ \section1 Editing A Form
+
+ By default, new forms are opened in widget editing mode. To switch to Edit
+ mode from another mode, select \gui{Edit Widgets} from the \gui Edit menu
+ or press the \key F3 key.
+
+ Objects are added to the form by dragging them from the main widget box
+ and dropping them in the desired location on the form. Once there, they
+ can be moved around simply by dragging them, or using the cursor keys.
+ Pressing the \key Ctrl key at the same time moves the selected widget
+ pixel by pixel, while using the cursor keys alone make the selected widget
+ snap to the grid when it is moved. Objects can be selected by clicking on
+ them with the left mouse button. You can also use the \key Tab key to
+ change the selection.
+
+ ### Screenshot of widget box, again
+
+ The widget box contains objects in a number of different categories, all of
+ which can be placed on the form as required. The only objects that require
+ a little more preparation are the \gui Container widgets. These are
+ described in further detail in the \l{Using Containers in Qt Designer}
+ chapter.
+
+
+ \target SelectingObjects
+ \table
+ \row
+ \i \inlineimage designer-selecting-widget.png
+ \i \bold{Selecting Objects}
+
+ Objects on the form are selected by clicking on them with the left
+ mouse button. When an object is selected, resize handles are shown at
+ each corner and the midpoint of each side, indicating that it can be
+ resized.
+
+ To select additional objects, hold down the \key Shift key and click on
+ them. If more than one object is selected, the current object will be
+ displayed with resize handles of a different color.
+
+ To move a widget within a layout, hold down \key Shift and \key Control
+ while dragging the widget. This extends the selection to the widget's
+ parent layout.
+
+ Alternatively, objects can be selected in the
+ \l{The Object Inspector}{Object Inspector}.
+ \endtable
+
+ When a widget is selected, normal clipboard operations such as cut, copy,
+ and paste can be performed on it. All of these operations can be done and
+ undone, as necessary.
+
+ The following shortcuts can be used:
+
+ \target ShortcutsForEditing
+ \table
+ \header \i Action \i Shortcut \i Description
+ \row
+ \i Cut
+ \i \key{Ctrl+X}
+ \i Cuts the selected objects to the clipboard.
+ \row
+ \i Copy
+ \i \key{Ctrl+C}
+ \i Copies the selected objects to the clipboard.
+ \row
+ \i Paste
+ \i \key{Ctrl+V}
+ \i Pastes the objects in the clipboard onto the form.
+ \row
+ \i Delete
+ \i \key Delete
+ \i Deletes the selected objects.
+ \row
+ \i Clone object
+ \i \key{Ctrl+drag} (leftmouse button)
+ \i Makes a copy of the selected object or group of objects.
+ \row
+ \i Preview
+ \i \key{Ctrl+R}
+ \i Shows a preview of the form.
+ \endtable
+
+ All of the above actions (apart from cloning) can be accessed via both the
+ \gui Edit menu and the form's context menu. These menus also provide
+ funcitons for laying out objects as well as a \gui{Select All} function to
+ select all the objects on the form.
+
+ Widgets are not unique objects; you can make as many copies of them as you
+ need. To quickly duplicate a widget, you can clone it by holding down the
+ \key Ctrl key and dragging it. This allows widgets to be copied and placed
+ on the form more quickly than with clipboard operations.
+
+
+ \target DragAndDrop
+ \table
+ \row
+ \i \inlineimage designer-dragging-onto-form.png
+ \i \bold{Drag and Drop}
+
+ \QD makes extensive use of the drag and drop facilities provided by Qt.
+ Widgets can be dragged from the widget box and dropped onto the form.
+
+ Widgets can also be "cloned" on the form: Holding down \key Ctrl and
+ dragging the widget creates a copy of the widget that can be dragged to
+ a new position.
+
+ It is also possible to drop Widgets onto the \l {The Object Inspector}
+ {Object Inspector} to handle nested layouts easily.
+ \endtable
+
+ \QD allows selections of objects to be copied, pasted, and dragged between
+ forms. You can use this feature to create more than one copy of the same
+ form, and experiment with different layouts in each of them.
+
+
+ \section2 The Property Editor
+
+ The Property Editor always displays properties of the currently selected
+ object on the form. The available properties depend on the object being
+ edited, but all of the widgets provided have common properties such as
+ \l{QObject::}{objectName}, the object's internal name, and
+ \l{QWidget::}{enabled}, the property that determines whether an
+ object can be interacted with or not.
+
+
+ \target EditingProperties
+ \table
+ \row
+ \i \inlineimage designer-property-editor.png
+ \i \bold{Editing Properties}
+
+ The property editor uses standard Qt input widgets to manage the
+ properties of jbects on the form. Textual properties are shown in line
+ edits, integer properties are displayed in spinboxes, boolean
+ properties are displayed in check boxes, and compound properties such
+ as colors and sizes are presented in drop-down lists of input widgets.
+
+ Modified properties are indicated with bold labels. To reset them, click
+ the arrow button on the right.
+
+ Changes in properties are applied to all selected objects that have the
+ same property.
+ \endtable
+
+ Certain properties are treated specially by the property editor:
+
+ \list
+ \o Compound properties -- properties that are made up of more than one
+ value -- are represented as nodes that can be expanded, allowing
+ their values to be edited.
+ \o Properties that contain a choice or selection of flags are edited
+ via combo boxes with checkable items.
+ \o Properties that allow access to rich data types, such as QPalette,
+ are modified using dialogs that open when the properties are edited.
+ QLabel and the widgets in the \gui Buttons section of the widget box
+ have a \c text property that can also be edited by double-clicking
+ on the widget or by pressing \gui F2. \QD interprets the backslash
+ (\\) character specially, enabling newline (\\n) characters to be
+ inserted into the text; the \\\\ character sequence is used to
+ insert a single backslash into the text. A context menu can also be
+ opened while editing, providing another way to insert special
+ characters and newlines into the text.
+ \endlist
+
+
+ \section2 Dynamic Properties
+
+ The property editor can also be used to add new
+ \l{QObject#Dynamic Properties}{dynamic properties} to both standard Qt
+ widgets and to forms themselves. Since Qt 4.4, dynamic properties are added
+ and removed via the property editor's toolbar, shown below.
+
+ \image designer-property-editor-toolbar.png
+
+ To add a dynamic property, clcik on the \gui Add button
+ \inlineimage designer-property-editor-add-dynamic.png
+ . To remove it, click on the \gui Remove button
+ \inlineimage designer-property-editor-remove-dynamic.png
+ instead. You can also sort the properties alphabetically and change the
+ color groups by clickinig on the \gui Configure button
+ \inlineimage designer-property-editor-configure.png
+ .
+
+ \section2 The Object Inspector
+ \table
+ \row
+ \i \inlineimage designer-object-inspector.png
+ \i \bold{The Object Inspector}
+
+ The \gui{Object Inspector} displays a hierarchical list of all the
+ objects on the form that is currently being edited. To show the child
+ objects of a container widget or a layout, click the handle next to the
+ object label.
+
+ Each object on a form can be selected by clicking on the corresponding
+ item in the \gui{Object Inspector}. Right-clicking opens the form's
+ context menu. These features can be useful if you have many overlapping
+ objects. To locate an object in the \gui{Object Inspector}, use
+ \key{Ctrl+F}.
+
+ Since Qt 4.4, double-clicking on the object's name allows you to change
+ the object's name with the in-place editor.
+
+ Since Qt 4.5, the \gui{Object Inspector} displays the layout state of
+ the containers. The broken layout icon ###ICON is displayed if there is
+ something wrong with the layouts.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-layouts.html
+ \previouspage Qt Designer's Widget Editing Mode
+ \contentspage
+ \nextpage Qt Designer's Signals and Slots Editing Mode
+
+ \title Using Layouts in Qt Designer
+
+ Before a form can be used, the objects on the form need to be placed into
+ layouts. This ensures that the objects will be displayed properly when the
+ form is previewed or used in an application. Placing objects in a layout
+ also ensures that they will be resized correctly when the form is resized.
+
+
+ \tableofcontents
+
+ \section1 Applying and Breaking Layouts
+
+ The simplest way to manage objects is to apply a layout to a group of
+ existing objects. This is achieved by selecting the objects that you need
+ to manage and applying one of the standard layouts using the main toolbar,
+ the \gui Form menu, or the form's context menu.
+
+ Once widgets have been inserted into a layout, it is not possible to move
+ and resize them individually because the layout itself controls the
+ geometry of each widget within it, taking account of the hints provided by
+ spacers. Instead, you must either break the layout and adjust each object's
+ geometry manually, or you can influence the widget's geometry by resizing
+ the layout.
+
+ To break the layout, press \key{Ctrl+0} or choose \gui{Break Layout} from
+ the form's context menu, the \gui Form menu or the main toolbar. You can
+ also add and remove spacers from the layout to influence the geometries of
+ the widgets.
+
+
+ \target InsertingObjectsIntoALayout
+ \table
+ \row
+ \i \inlineimage designer-layout-inserting.png
+ \i \bold{Inserting Objects into a Layout}
+
+ Objects can be inserted into an existing layout by dragging them from
+ their current positions and dropping them at the required location. A
+ blue cursor is displayed in the layout as an object is dragged over
+ it to indicate where the object will be added.
+ \endtable
+
+
+ \section2 Setting A Top Level Layout
+
+ The form's top level layout can be set by clearing the slection (click the
+ left mouse button on the form itself) and applying a layout. A top level
+ layout is necessary to ensure that your widgets will resize correctly when
+ its window is resized. To check if you have set a top level layout, preview
+ your widget and attempt to resize the window by dragging the size grip.
+
+ \table
+ \row
+ \i \inlineimage designer-set-layout.png
+ \i \bold{Applying a Layout}
+
+ To apply a layout, you can select your choice of layout from the
+ toolbar shown on the left, or from the context menu shown below.
+ \endtable
+
+ \image designer-set-layout2.png
+
+
+ \section2 Horizontal and Vertical Layouts
+
+ The simplest way to arrange objects on a form is to place them in a
+ horizontal or vertical layout. Horizontal layouts ensure that the widgets
+ within are aligned horizontally; vertical layouts ensure that they are
+ aligned vertically.
+
+ Horizontal and vertical layouts can be combined and nested to any depth.
+ However, if you need more control over the placement of objects, consider
+ using the grid layout.
+
+
+ \section3 The Grid Layout
+
+ Complex form layouts can be created by placing objects in a grid layout.
+ This kind of layout gives the form designer much more freedom to arrange
+ widgets on the form, but can result in a much less flexible layout.
+ However, for some kinds of form layout, a grid arrangement is much more
+ suitable than a nested arrangement of horizontal and vertical layouts.
+
+
+ \section3 Splitter Layouts
+
+ Another common way to manage the layout of objects on a form is to place
+ them in a splitter. These splitters arrange the objects horizontally or
+ vertically in the same way as normal layouts, but also allow the user to
+ adjust the amount of space allocated to each object.
+
+ \image designer-splitter-layout.png
+
+ Although QSplitter is a container widget, \QD treats splitter objects as
+ layouts that are applied to existing widgets. To place a group of widgets
+ into a splitter, select them
+ \l{Qt Designer's Widget Editing Mode#SelectingObjects}{as described here}
+ then apply the splitter layout by using the appropriate toolbar button,
+ keyboard shortcut, or \gui{Lay out} context menu entry.
+
+
+ \section3 The Form Layout
+
+ Since Qt 4.4, another layout class has been included -- QFormLayout. This
+ class manages widgets in a two-column form; the left column holds labels
+ and the right column holds field widgets such as line edits, spin boxes,
+ etc. The QFormLayout class adheres to various platform look and feel
+ guidelines and supports wrapping for long rows.
+
+ \image designer-form-layout.png
+
+ The \c{.ui} file above results in the previews shown below.
+
+ \table
+ \header
+ \i Windows XP
+ \i Mac OS X
+ \i Cleanlooks
+ \row
+ \i \inlineimage designer-form-layout-windowsXP.png
+ \i \inlineimage designer-form-layout-macintosh.png
+ \i \inlineimage designer-form-layout-cleanlooks.png
+ \endtable
+
+
+ \section2 Shortcut Keys
+
+ In addition to the standard toolbar and context menu entries, there is also
+ a set of keyboard shortcuts to apply layouts on widgets.
+
+ \target LayoutShortcuts
+ \table
+ \header
+ \i Layout
+ \i Shortcut
+ \i Description
+ \row
+ \i Horizontal
+ \i \key{Ctrl+1}
+ \i Places the selected objects in a horizontal layout.
+ \row
+ \i Vertical
+ \i \key{Ctrl+2}
+ \i Places the selected objects in a vertical layout.
+ \row
+ \i Grid
+ \i \key{Ctrl+5}
+ \i Places the selected objects in a grid layout.
+ \row
+ \i Form
+ \i \key{Ctrl+6}
+ \i Places the selected objects in a form layout.
+ \row
+ \i Horizontal splitter
+ \i \key{Ctrl+3}
+ \i Creates a horizontal splitter and places the selected objects
+ inside it.
+ \row
+ \i Vertical splitter
+ \i \key{Ctrl+4}
+ \i Creates a vertical splitter and places the selected objects
+ inside it.
+ \row
+ \i Adjust size
+ \i \key{Ctrl+J}
+ \i Adjusts the size of the layout to ensure that each child object
+ has sufficient space to display its contents. See
+ QWidget::adjustSize() for more information.
+ \endtable
+
+ \note \key{Ctrl+0} is used to break a layout.
+
+*/
+
+
+/*!
+ \page designer-preview.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Layouts in Qt Designer
+ \nextpage Qt Designer's Buddy Editing Mode
+ \title Saving, Previewing and Printing Forms in Qt Designer
+
+ Although \QD's forms are accurate representations of the components being
+ edited, it is useful to preview the final appearance while editing. This
+ feature can be activated by opening the \gui Form menu and selecting
+ \gui Preview, or by pressing \key{Ctrl+R} when in the form.
+
+ \image designer-dialog-preview.png
+
+ The preview shows exactly what the final component will look like when used
+ in an application.
+
+ Since Qt 4.4, it is possible to preview forms with various skins - default
+ skins, skins created with Qt Style Sheets or device skins. This feature
+ simulates the effect of calling \c{QApplication::setStyleSheet()} in the
+ application.
+
+ To preview your form with skins, open the \gui Edit menu and select
+ \gui{Preferences...}
+
+ You will see the dialog shown below:
+
+ \image designer-preview-style.png
+
+ The \gui{Print/Preview Configuration} checkbox must be checked to activate
+ previews of skins. You can select the styles provided from the \gui{Style}
+ drop-down box.
+
+ \image designer-preview-style-selection.png
+
+ Alternatively, you can preview custom style sheet created with Qt Style
+ Sheets. The figure below shows an example of Qt Style Sheet syntax and the
+ corresponding output.
+
+ \image designer-preview-stylesheet.png
+
+ Another option would be to preview your form with device skins. A list of
+ generic device skins are available in \QD, however, you may also use
+ other QVFB skins with the \gui{Browse...} option.
+
+ \image designer-preview-deviceskin-selection.png
+
+
+ \section1 Viewing the Form's Code
+
+ Since Qt 4.4, it is possible to view code generated by the User Interface
+ Compiler (uic) for the \QD form.
+
+ \image designer-form-viewcode.png
+
+ Select \gui{View Code...} from the \gui{Form} menu and a dialog with the
+ generated code will be displayed. The screenshot below is an example of
+ code generated by the \c{uic}.
+
+ \image designer-code-viewer.png
+
+ \section1 Saving and Printing the Form
+
+ Forms created in \QD can be saved to an image or printed.
+
+ \table
+ \row
+ \i \inlineimage designer-file-menu.png
+ \i \bold{Saving Forms}
+
+ To save a form as an image, choose the \gui{Save Image...} option. The file
+ will be saved in \c{.png} format.
+
+ \bold{Printing Forms}
+
+ To print a form, select the \gui{Print...} option.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-connection-mode.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Layouts in Qt Designer
+ \nextpage Qt Designer's Buddy Editing Mode
+
+
+ \title Qt Designer's Signals and Slots Editing Mode
+
+ \image designer-connection-mode.png
+
+ In \QD's signals and slots editing mode, you can connect objects in a form
+ together using Qt's signals and slots mechanism. Both widgets and layouts
+ can be connected via an intuitive connection interface, using the menu of
+ compatible signals and slots provided by \QD. When a form is saved, all
+ connections are preserved so that they will be ready for use when your
+ project is built.
+
+
+ \tableofcontents
+
+ For more information on Qt's signals and sltos mechanism, refer to the
+ \l{Signals and Slots} document.
+
+
+ \section1 Connecting Objects
+
+ To begin connecting objects, enter the signals and slots editing mode by
+ opening the \gui Edit menu and selecting \gui{Edit Signals/Slots}, or by
+ pressing the \key F4 key.
+
+ All widgets and layouts on the form can be connected together. However,
+ spacers just provide spacing hints to layouts, so they cannot be connected
+ to other objects.
+
+
+ \target HighlightedObjects
+ \table
+ \row
+ \i \inlineimage designer-connection-highlight.png
+ \i \bold{Highlighted Objects}
+
+ When the cursor is over an object that can be used in a connection, the
+ object will be highlighted.
+ \endtable
+
+ To make a connectionn, press the left mouse button and drag the cursor
+ towards the object you want to connect it to. As you do this, a line will
+ extend from the source object to the cursor. If the cursor is over another
+ object on the form, the line will end with an arrow head that points to the
+ destination object. This indicates that a connection will be made between
+ the two objects when you release the mouse button.
+
+ You can abandon the connection at any point while you are dragging the
+ connection path by pressing \key{Esc}.
+
+ \target MakingAConnection
+ \table
+ \row
+ \i \inlineimage designer-connection-making.png
+ \i \bold{Making a Connection}
+
+ The connection path will change its shape as the cursor moves around
+ the form. As it passes over objects, they are highlighted, indicating
+ that they can be used in a signal and slot connection. Release the
+ mouse button to make the connection.
+ \endtable
+
+ The \gui{Configure Connection} dialog (below) is displayed, showing signals
+ from the source object and slots from the destination object that you can
+ use.
+
+ \image designer-connection-dialog.png
+
+ To complete the connection, select a signal from the source object and a
+ slot from the destination object, then click \key OK. Click \key Cancel if
+ you wish to abandon the connection.
+
+ \note If the \gui{Show all signals and slots} checkbox is selected, all
+ available signals from the source object will be shown. Otherwise, the
+ signals and slots inherited from QWidget will be hidden.
+
+ You can make as many connections as you like between objects on the form;
+ it is possible to connect signals from objects to slots in the form itself.
+ As a result, the signal and slot connections in many dialogs can be
+ completely configured from within \QD.
+
+ \target ConnectingToTheForm
+ \table
+ \row
+ \i \inlineimage designer-connection-to-form.png
+ \i \bold{Connecting to a Form}
+
+ To connect an object to the form itself, simply position the cursor
+ over the form and release the mouse button. The end point of the
+ connection changes to the electrical "ground" symbol.
+ \endtable
+
+
+ \section1 Editing and Deleting Connections
+
+ By default, connection paths are created with two labels that show the
+ signal and slot involved in the connection. These labels are usually
+ oriented along the line of the connection. You can move them around inside
+ their host widgets by dragging the red square at each end of the connection
+ path.
+
+ \target ConnectionEditor
+ \table
+ \row
+ \i \inlineimage designer-connection-editor.png
+ \i \bold{The Signal/Slot Editor}
+
+ The signal and slot used in a connection can be changed after it has
+ been set up. When a connection is configured, it becomes visible in
+ \QD's signal and slot editor where it can be further edited. You can
+ also edit signal/slot connections by double-clicking on the connection
+ path or one of its labels to display the Connection Dialog.
+ \endtable
+
+ \target DeletingConnections
+ \table
+ \row
+ \i \inlineimage designer-connection-editing.png
+ \i \bold{Deleting Connections}
+
+ The whole connection can be selected by clicking on any of its path
+ segments. Once selected, a connection can be deleted with the
+ \key Delete key, ensuring that it will not be set up in the \c{.ui}
+ file.
+ \endtable
+*/
+
+
+/*!
+ \page designer-buddy-mode.html
+ \contentspage{Qt Designer Manual}{Contents}
+ \previouspage Qt Designer's Signals and Slots Editing Mode
+ \nextpage Qt Designer's Tab Order Editing Mode
+
+ \title Qt Designer's Buddy Editing Mode
+
+ \image designer-buddy-mode.png
+
+ One of the most useful basic features of Qt is the support for buddy
+ widgets. A buddy widget accepts the input focus on behalf of a QLabel when
+ the user types the label's shortcut key combination. The buddy concept is
+ also used in Qt's \l{Model/View Programming}{model/view} framework.
+
+
+ \section1 Linking Labels to Buddy Widgets
+
+ To enter buddy editing mode, open the \gui Edit menu and select
+ \gui{Edit Buddies}. This mode presents the widgets on the form in a similar
+ way to \l{Qt Designer's Signals and Slots Editing Mode}{signals and slots
+ editing mode} but in this mode, connections must start at label widgets.
+ Ideally, you should connect each label widget that provides a shortcut with
+ a suitable input widget, such as a QLineEdit.
+
+
+ \target MakingBuddies
+ \table
+ \row
+ \i \inlineimage designer-buddy-making.png
+ \i \bold{Making Buddies}
+
+ To define a buddy widget for a label, click on the label, drag the
+ connection to another widget on the form, and release the mouse button.
+ The connection shown indicates how input focus is passed to the buddy
+ widget. You can use the form preview to test the connections between
+ each label and its buddy.
+ \endtable
+
+
+ \section1 Removing Buddy Connections
+
+ Only one buddy widget can be defined for each label. To change the buddy
+ used, it is necessary to delete any existing buddy connection before you
+ create a new one.
+
+ Connections between labels and their buddy widgets can be deleted in the
+ same way as signal-slot connections in signals and slots editing mode:
+ Select the buddy connection by clicking on it and press the \key Delete
+ key. This operation does not modify either the label or its buddy in any
+ way.
+*/
+
+
+/*!
+ \page designer-tab-order.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Qt Designer's Buddy Editing Mode
+ \nextpage Using Containers in Qt Designer
+
+ \title Qt Designer's Tab Order Editing Mode
+
+ \image designer-tab-order-mode.png
+
+ Many users expect to be able to navigate between widgets and controls
+ using only the keyboard. Qt lets the user navigate between input widgets
+ with the \key Tab and \key{Shift+Tab} keyboard shortcuts. The default
+ \e{tab order} is based on the order in which widgets are constructed.
+ Although this order may be sufficient for many users, it is often better
+ to explicitly specify the tab order to make your application easier to
+ use.
+
+
+ \section1 Setting the Tab Order
+
+ To enter tab order editing mode, open the \gui Edit menu and select
+ \gui{Edit Tab Order}. In this mode, each input widget in the form is shown
+ with a number indicating its position in the tab order. So, if the user
+ gives the first input widget the input focus and then presses the tab key,
+ the focus will move to the second input widget, and so on.
+
+ The tab order is defined by clicking on each of the numbers in the correct
+ order. The first number you click will change to red, indicating the
+ currently edited position in the tab order chain. The widget associated
+ with the number will become the first one in the tab order chain. Clicking
+ on another widget will make it the second in the tab order, and so on.
+
+ Repeat this process until you are satisfied with the tab order in the form
+ -- you do not need to click every input widget if you see that the
+ remaining widgets are already in the correct order. Numbers, for which you
+ already set the order, change to green, while those which are not clicked
+ yet, remain blue.
+
+ If you make a mistake, simply double click outside of any number or choose
+ \gui{Restart} from the form's context menu to start again. If you have many
+ widgets on your form and would like to change the tab order in the middle or
+ at the end of the tab order chain, you can edit it at any position. Press
+ \key{Ctrl} and click the number from which you want to start.
+ Alternatively, choose \gui{Start from Here} in the context menu.
+
+*/
+
+
+/*!
+ \page designer-using-containers.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Qt Designer's Tab Order Editing Mode
+ \nextpage Creating Main Windows in Qt Designer
+
+
+ \title Using Containers in Qt Designer
+
+ Container widgets provide high level control over groups of objects on a
+ form. They can be used to perform a variety of functions, such as managing
+ input widgets, providing paged and tabbed layouts, or just acting as
+ decorative containers for other objects.
+
+ \image designer-widget-morph.png
+
+ \QD provides visual feedback to help you place objects inside your
+ containers. When you drag an object from the widget box (or elsewhere) on
+ the form, each container will be highlighted when the cursor is positioned
+ over it. This indicates that you can drop the object inside, making it a
+ child object of the container. This feedback is important because it is
+ easy to place objects close to containers without actually placing them
+ inside. Both widgets and spacers can be used inside containers.
+
+ Stacked widgets, tab widgets, and toolboxes are handled specially in \QD.
+ Norwally, when adding pages (tabs, pages, compartments) to these containers
+ in your own code, you need to supply existing widgets, either as
+ placeholders or containing child widgets. In \QD, these are automatically
+ created for you, so you can add child objects to each page straight away.
+
+ Each container typically allows its child objects to be arranged in one or
+ more layouts. The type of layout management provided depends on each
+ container, although setting the layout is usually just a matter of
+ selecting the container by clicking it, and applying a layout. The table
+ below shows a list of available containers.
+
+ \table
+ \row
+ \i \inlineimage designer-containers-frame.png
+ \i \bold Frames
+
+ Frames are used to enclose and group widgets, as well as to provide
+ decoration. They are used as the foundation for more complex
+ containers, but they can also be used as placeholders in forms.
+
+ The most important properties of frames are \c frameShape,
+ \c frameShadow, \c lineWidth, and \c midLineWidth. These are described
+ in more detail in the QFrame class description.
+
+ \row
+ \i \inlineimage designer-containers-groupbox.png
+ \i \bold{Group Boxes}
+
+ Group boxes are usually used to group together collections of
+ checkboxes and radio buttons with similar purposes.
+
+ Among the significant properties of group boxes are \c title, \c flat,
+ \c checkable, and \c checked. These are demonstrated in the
+ \l{widgets/groupbox}{Group Box} example, and described in the QGroupBox
+ class documentation. Each group box can contain its own layout, and
+ this is necessary if it contains other widgets. To add a layout to the
+ group box, click inside it and apply the layout as usual.
+
+ \row
+ \i \inlineimage designer-containers-stackedwidget.png
+ \i \bold{Stacked Widgets}
+
+ Stacked widgets are collections of widgets in which only the topmost
+ layer is visible. Control over the visible layer is usually managed by
+ another widget, such as combobox, using signals and slots.
+
+ \QD shows arrows in the top-right corner of the stack to allow you to
+ see all the widgets in the stack when designing it. These arrows do not
+ appear in the preview or in the final component. To navigate between
+ pages in the stack, select the stacked widget and use the
+ \gui{Next Page} and \gui{Previous Page} entries from the context menu.
+ The \gui{Insert Page} and \gui{Delete Page} context menu options allow
+ you to add and remove pages.
+
+ \row
+ \i \inlineimage designer-containers-tabwidget.png
+ \i \bold{Tab Widgets}
+
+ Tab widgets allow the developer to split up the contents of a widget
+ into different labelled sections, only one of which is displayed at any
+ given time. By default, the tab widget contains two tabs, and these can
+ be deleted or renamed as required. You can also add additional tabs.
+
+ To delete a tab:
+ \list
+ \o Click on its label to make it the current tab.
+ \o Select the tab widget and open its context menu.
+ \o Select \gui{Delete Page}.
+ \endlist
+
+ To add a new tab:
+ \list
+ \o Select the tab widget and open its context menu.
+ \o Select \gui{Insert Page}.
+ \o You can add a page before or after the \e current page. \QD
+ will create a new widget for that particular tab and insert it
+ into the tab widget.
+ \o You can set the title of the current tab by changing the
+ \c currentTabText property in the \gui{Property Editor}.
+ \endlist
+
+ \row
+ \i \inlineimage designer-containers-toolbox.png
+ \i \bold{ToolBox Widgets}
+
+ Toolbox widgets provide a series of pages or compartments in a toolbox.
+ They are handled in a way similar to stacked widgets.
+
+ To rename a page in a toolbox, make the toolbox your current pange and
+ change its \c currentItemText property from the \gui{Property Editor}.
+
+ To add a new page, select \gui{Insert Page} from the toolbox widget's
+ context menu. You can add the page before or after the current page.
+
+ To delete a page, select \gui{Delete Page} from the toolbox widget's
+ context menu.
+
+ \row
+ \i \inlineimage designer-containers-dockwidget.png
+ \i \bold{Dock Widgets}
+
+ Dock widgets are floating panels, often containing input widgets and
+ more complex controls, that are either attached to the edges of the
+ main window in "dock areas", or floated as independent tool windows.
+
+ Although dock widgets can be added to any type of form, they are
+ typically used with forms created from the
+ \l{Creating Main Windows in Qt Designer}{main window template}.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-creating-mainwindows.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Containers in Qt Designer
+ \nextpage Editing Resources with Qt Designer
+
+ \title Creating Main Windows in Qt Designer
+
+ \QD can be used to create user interfaces for different purposes, and
+ it provides different kinds of form templates for each user interface. The
+ main window template is used to create application windows with menu bars,
+ toolbars, and dock widgets.
+
+ \omit
+ \image designer-mainwindow-example.png
+ \endomit
+
+ Create a new main window by opening the \gui File menu and selecting the
+ \gui{New Form...} option, or by pressing \key{Ctrl+N}. Then, select the
+ \gui{Main Window} template. This template provides a main application
+ window containing a menu bar and a toolbar by default -- these can be
+ removed if they are not required.
+
+ If you remove the menu bar, a new one can be created by selecting the
+ \gui{Create Menu Bar} option from the context menu, obtained by
+ right-clicking within the main window form.
+
+ An application can have only \bold one menu bar, but \bold several
+ toolbars.
+
+
+ \section1 Menus
+
+ Menus are added to the menu bar by modifying the \gui{Type Here}
+ placeholders. One of these is always present for editing purposes, and
+ will not be displayed in the preview or in the finished window.
+
+ Once created, the properties of a menu can be accessed using the
+ \l{Qt Designer's Widget Editing Mode#The Property Editor}{Property Editor},
+ and each menu can be accessed for this purpose via the
+ \l{Qt Designer's Widget Editing Mode#The Object Inspector}{The Object Inspector}.
+
+ Existing menus can be removed by opening a context menu over the label in
+ the menu bar, and selecting \gui{Remove Menu 'menu_name'}.
+
+
+ \target CreatingAMenu
+ \table
+ \row
+ \i \inlineimage designer-creating-menu1.png
+ \i \inlineimage designer-creating-menu2.png
+ \i \bold{Creating a Menu}
+
+ Double-click the placeholder item to begin editing. The menu text,
+ displayed using a line edit, can be modified.
+
+ \row
+ \i \inlineimage designer-creating-menu3.png
+ \i \inlineimage designer-creating-menu4.png
+ \i Insert the required text for the new menu. Inserting an
+ ampersand character (&) causes the letter following it to be
+ used as a mnemonic for the menu.
+
+ Press \key Return or \key Enter to accept the new text, or press
+ \key Escape to reject it. You can undo the editing operation later if
+ required.
+ \endtable
+
+ Menus can also be rearranged in the menu bar simply by dragging and
+ dropping them in the preferred location. A vertical red line indicates the
+ position where the menu will be inserted.
+
+ Menus can contain any number of entries and separators, and can be nested
+ to the required depth. Adding new entries to menus can be achieved by
+ navigating the menu structure in the usual way.
+
+ \target CreatingAMenuEntry
+ \table
+ \row
+ \i \inlineimage designer-creating-menu-entry1.png
+ \i \inlineimage designer-creating-menu-entry2.png
+ \i \bold{Creating a Menu Entry}
+
+ Double-click the \gui{new action} placeholder to begin editing, or
+ double-click \gui{new separator} to insert a new separator line after
+ the last entry in the menu.
+
+ The menu entry's text is displayed using a line edit, and can be
+ modified.
+
+ \row
+ \i \inlineimage designer-creating-menu-entry3.png
+ \i \inlineimage designer-creating-menu-entry4.png
+ \i Insert the required text for the new entry, optionally using
+ the ampersand character (&) to mark the letter to use as a
+ mnemonic for the entry.
+
+ Press \key Return or \key Enter to accept the new text, or press
+ \key Escape to reject it. The action created for this menu entry will
+ be accessible via the \l{#TheActionEditor}{Action Editor}, and any
+ associated keyboard shortcut can be set there.
+ \endtable
+
+ Just like with menus, entries can be moved around simply by dragging and
+ dropping them in the preferred location. When an entry is dragged over a
+ closed menu, the menu will open to allow it to be inserted there. Since
+ menu entries are based on actions, they can also be dropped onto toolbars,
+ where they will be displayed as toolbar buttons.
+
+
+ \section1 Toolbars
+
+
+ ### SCREENSHOT
+
+ Toolbars ared added to a main window in a similar way to the menu bar:
+ Select the \gui{Add Tool Bar} option from the form's context menu.
+ Alternatively, if there is an existing toolbar in the main window, you can
+ click the arrow on its right end to create a new toolbar.
+
+ Toolbar buttons are created using the action system to populate each
+ toolbar, rather than by using specific button widgets from the widget box.
+ Since actions can be represented by menu entries and toolbar buttons, they
+ can be moved between menus and toolbars. To share an action between a menu
+ and a toolbar, drag its icon from the \l{#TheActionEditor}{Action Editor}
+ to the toolbar rather than from the menu where its entry is located.
+
+ New actions for menus and toolbars can be created in the
+ \l{#TheActionEditor}{Action Editor}.
+
+
+ \section1 Actions
+
+ With the menu bar and the toolbars in place, it's time to populate them
+ with action: \QD provides an action editor to simplify the creation and
+ management of actions.
+
+
+ \target TheActionEditor
+ \table
+ \row
+ \i \inlineimage designer-action-editor.png
+ \i \bold{The Action Editor}
+
+ Enable the action editor by opening the \gui Tools menu, and switching
+ on the \gui{Action Editor} option.
+
+ The action editor allows you to create \gui New actions and \gui Delete
+ actions. It also provides a search function, \gui Filter, using the
+ action's text.
+
+ \QD's action editor can be viewed in the classic \gui{Icon View} and
+ \gui{Detailed View}. The screenshot below shows the action editor in
+ \gui{Detailed View}. You can also copy and paste actions between menus,
+ toolbars and forms.
+ \endtable
+
+ To create an action, use the action editor's \gui New button, which will
+ then pop up an input dialog. Provide the new action with a \gui Text --
+ this is the text that will appear in a menu entry and as the action's
+ tooltip. The text is also automatically added to an "action" prefix,
+ creating the action's \gui{Object Name}.
+
+ In addition, the dialog provides the option of selecting an \gui Icon for
+ the action, as well as removing the current icon.
+
+ Once the action is created, it can be used wherever actions are applicable.
+
+
+ \target AddingAnAction
+ \table
+ \row
+ \i \inlineimage designer-adding-menu-action.png
+ \i \inlineimage designer-adding-toolbar-action.png
+ \i \bold{Adding an Action}
+
+ To add an action to a menu or a toolbar, simply press the left mouse
+ button over the action in the action editor, and drag it to the
+ preferred location.
+
+ \QD provides highlighted guide lines that tell you where the action
+ will be added. Release the mouse button to add the action when you have
+ found the right spot.
+ \endtable
+
+
+ \section1 Dock Widgets
+
+ Since dock widgets are \l{Using Containers in Qt Designer}
+ {container widgets}, they can be added to a form in the usuasl way. Once
+ added to a form, dock widgets are not placed in any particular dock area by
+ default; you need to set the \gui{docked} property to true for each widget
+ and choose an appropriate value for its \gui{dockWidgetArea} property.
+
+ \target AddingADockWidget
+ \table
+ \row
+ \i \inlineimage designer-adding-dockwidget.png
+ \i \bold{Adding a Dock Widget}
+
+ To add a dock widget, simply drag one from the \gui Containers section
+ of the widget box, and drop it onto the main form area. Just like other
+ widgets, its properties can be modified with the \gui{Property Editor}.
+
+ Dock widgets can be optionally floated as indpendent tool windows.
+ Hence, it is useful to give them window titles by setting their
+ \gui{windowTitle} property. This also helps to identify them on the
+ form.
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-resources.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Creating Main Windows in Qt Designer
+ \nextpage Using Stylesheets with Qt Designer
+
+ \title Editing Resources with Qt Designer
+
+ \image designer-resources-editing.png
+
+ \QD fully supports the \l{The Qt Resource System}{Qt Resource System},
+ enabling resources to be specified together with forms as they are
+ designed. To aid designers and developers manage resources for their
+ applications, \QD's resource editor allows resources to be defined on a
+ per-form basis. In other words, each form can have a separate resource
+ file.
+
+ \section1 Defining a Resource File
+
+ To specify a resource file you must enable the resource editor by opening
+ the \gui Tools menu, and switching on the \gui{Resource Browser} option.
+
+ \target ResourceFiles
+ \table
+ \row
+ \i \inlineimage designer-resource-browser.png
+ \i \bold{Resource Files}
+
+ Within the resource browser, you can open existing resource files or
+ create new ones. Click the \gui{Edit Resources} button
+ \inlineimage designer-edit-resources-button.png
+ to edit your resources. To reload resources, click on the \gui Reload
+ button
+ \inlineimage designer-reload-resources-button.png
+ .
+ \endtable
+
+
+ Once a resource file is loaded, you can create or remove entries in it
+ using the given \gui{Add Files}
+ \inlineimage designer-add-resource-entry-button.png
+ and \gui{Remove Files}
+ \inlineimage designer-remove-resource-entry-button.png
+ buttons, and specify resources (e.g., images) using the \gui{Add Files}
+ button
+ \inlineimage designer-add-files-button.png
+ . Note that these resources must reside within the current resource file's
+ directory or one of its subdirectories.
+
+
+ \target EditResource
+ \table
+ \row
+ \i \inlineimage designer-edit-resource.png
+ \i \bold{Editing Resource Files}
+
+ Press the
+ \inlineimage designer-add-resource-entry-button.png
+ button to add a new resource entry to the file. Then use the
+ \gui{Add Files} button
+ \inlineimage designer-add-files-button.png
+ to specify the resource.
+
+ You can remove resources by selecting the corresponding entry in the
+ resource editor, and pressing the
+ \inlineimage designer-remove-resource-entry-button.png
+ button.
+ \endtable
+
+
+ \section1 Using the Resources
+
+ Once the resources are defined you can use them actively when composing
+ your form. For example, you might want to create a tool button using an
+ icon specified in the resource file.
+
+ \target UsingResources
+ \table
+ \row
+ \i \inlineimage designer-resources-using.png
+ \i \bold{Using Resources}
+
+ When changing properties with values that may be defined within a
+ resource file, \QD's property editor allows you to specify a resource
+ in addition to the option of selecting a source file in the ordinary
+ way.
+
+ \row
+ \i \inlineimage designer-resource-selector.png
+ \i \bold{Selecting a Resource}
+
+ You can open the resource selector by clicking \gui{Choose Resource...}
+ to add resources any time during the design process.
+
+\omit
+... check with Friedemann
+To quickly assign icon pixmaps to actions or pixmap properties, you may
+drag the pixmap from the resource editor to the action editor, or to the
+pixmap property in the property editor.
+\endomit
+
+ \endtable
+*/
+
+
+/*!
+ \page designer-stylesheet.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Editing Resources with Qt Designer
+ \nextpage Using a Designer .ui File in Your Application
+
+ \title Using Stylesheets with Qt Designer
+
+ Since Qt 4.2, it is possible to edit stylesheets in \QD with the stylesheet
+ editor.
+
+ \target UsingStylesheets
+ \table
+ \row
+ \i \inlineimage designer-stylesheet-options.png
+ \bold{Setting a Stylesheet}
+
+ The stylesheet editor can be accessed by right-clicking a widget
+ and selecting \gui{Change styleSheet...}
+
+ \row
+ \i \inlineimage designer-stylesheet-usage.png
+ \endtable
+
+*/
+
+
+/*!
+ \page designer-using-a-ui-file.html
+ \previouspage Using Stylesheets with Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Using Custom Widgets with Qt Designer
+
+ \title Using a Designer .ui File in Your Application
+
+ With Qt's integrated build tools, \l{qmake Manual}{qmake} and \l uic, the
+ code for user interface components created with \QD is automatically
+ generated when the rest of your application is built. Forms can be included
+ and used directly from your application. Alternatively, you can use them to
+ extend subclasses of standard widgets. These forms can be processed at
+ compile time or at run time, depending on the approach used.
+
+
+ \tableofcontents
+ \section1 Compile Time Form Processing
+
+ A compile time processed form can be used in your application with one of
+ the following approaches:
+
+ \list
+ \o The Direct Approach: you construct a widget to use as a placeholder
+ for the component, and set up the user interface inside it.
+ \o The Single Inheritance Approach: you subclass the form's base class
+ (QWidget or QDialog, for example), and include a private instance
+ of the form's user interface object.
+ \o The MultipleInheritance Approach: you subclass both the form's base
+ class and the form's user interface object. This allows the widgets
+ defined in the form to be used directly from within the scope of
+ the subclass.
+ \endlist
+
+
+ \section2 The Direct Approach
+
+ To demonstrate how to use user interface (\c{.ui}) files straight from
+ \QD, we create a simple Calculator Form application. This is based on the
+ original \l{Calculator Form Example}{Calculator Form} example.
+
+ The application consists of one source file, \c main.cpp and a \c{.ui}
+ file.
+
+ The \c{calculatorform.ui} file designed with \QD is shown below:
+
+ \image directapproach-calculatorform.png
+
+ We will use \c qmake to build the executable, so we need to write a
+ \c{.pro} file:
+
+ \snippet doc/src/snippets/uitools/calculatorform/calculatorform.pro 0
+
+ The special feature of this file is the \c FORMS declaration that tells
+ \c qmake which files to process with \c uic. In this case, the
+ \c calculatorform.ui file is used to create a \c ui_calculatorform.h file
+ that can be used by any file listed in the \c SOURCES declaration. To
+ ensure that \c qmake generates the \c ui_calculatorform.h file, we need to
+ include it in a file listed in \c SOURCES. Since we only have \c main.cpp,
+ we include it there:
+
+ \snippet doc/src/snippets/uitools/calculatorform/main.cpp 0
+
+ This include is an additional check to ensure that we do not generate code
+ for \c .ui files that are not used.
+
+ The \c main function creates the calculator widget by constructing a
+ standard QWidget that we use to host the user interface described by the
+ \c calculatorform.ui file.
+
+ \snippet doc/src/snippets/uitools/calculatorform/main.cpp 1
+
+ In this case, the \c{Ui::CalculatorForm} is an interface description object
+ from the \c ui_calculatorform.h file that sets up all the dialog's widgets
+ and the connections between its signals and slots.
+
+ This approach provides a quick and easy way to use simple, self-contained
+ components in your applications, but many componens created with \QD will
+ require close integration with the rest of the application code. For
+ instance, the \c CalculatorForm code provided above will compile and run,
+ but the QSpinBox objects will not interact with the QLabel as we need a
+ custom slot to carry out the add operation and display the result in the
+ QLabel. To achieve this, we need to subclass a standard Qt widget (known as
+ the single inheritance approach).
+
+
+ \section2 The Single Inheritance Approach
+
+ In this approach, we subclass a Qt widget and set up the user interface
+ from within the constructor. Components used in this way expose the widgets
+ and layouts used in the form to the Qt widget subclass, and provide a
+ standard system for making signal and slot connections between the user
+ interface and other objects in your application.
+
+ This approach is used in the \l{Calculator Form Example}{Calculator Form}
+ example.
+
+ To ensure that we can use the user interface, we need to include the header
+ file that \c uic generates before referring to \c{Ui::CalculatorForm}:
+
+ \snippet examples/designer/calculatorform/calculatorform.h 0
+
+ This means that the \c{.pro} file must be updated to include
+ \c{calculatorform.h}:
+
+ \snippet examples/designer/calculatorform/calculatorform.pro 0
+
+ The subclass is defined in the following way:
+
+ \snippet examples/designer/calculatorform/calculatorform.h 1
+
+ The important feature of the class is the private \c ui object which
+ provides the code for setting up and managing the user interface.
+
+ The constructor for the subclass constructs and configures all the widgets
+ and layouts for the dialog just by calling the \c ui object's \c setupUi()
+ function. Once this has been done, it is possible to modify the user
+ interface as needed.
+
+ \snippet examples/designer/calculatorform/calculatorform.cpp 0
+
+ We can connect signals and slots in user interface widgets in the usual
+ way, taking care to prefix the \c ui object to each widget used.
+
+ The advantages of this approach are its simple use of inheritance to
+ provide a QWidget-based interface, and its encapsulation of the user
+ interface widget variables within the \c ui data member. We can use this
+ method to define a number of user interfaces within the same widget, each
+ of which is contained within its own namespace, and overlay (or compose)
+ them. This approach can be used to create individual tabs from existing
+ forms, for example.
+
+
+ \section2 The Multiple Inheritance Approach
+
+ Forms created with \QD can be subclassed together with a standard
+ QWidget-based class. This approach makes all the user interface components
+ defined in the form directly accessible within the scope of the subclass,
+ and enables signal and slot connections to be made in the usual way with
+ the \l{QObject::connect()}{connect()} function.
+
+ This approach is used in the \l{Multiple Inheritance Example}
+ {Multiple Inheritance} example.
+
+ We need to include the header file that \c uic generates from the
+ \c calculatorform.ui file:
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.h 0
+
+ The class is defined in a similar way to the one used in the
+ \l{The Single Inheritance Approach}{single inheritance approach}, except that
+ this time we inherit from \e{both} QWidget and \c{Ui::CalculatorForm}:
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.h 1
+
+ We inherit \c{Ui::CalculatorForm} privately to ensure that the user
+ interface objects are private in our subclass. We can also inherit it with
+ the \c public or \c protected keywords in the same way that we could have
+ made \c ui public or protected in the previous case.
+
+ The constructor for the subclass performs many of the same tasks as the
+ constructor used in the \l{The Single Inheritance Approach}
+ {single inheritance} example:
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.cpp 0
+
+ In this case, the widgets used in the user interface can be accessed in the
+ same say as a widget created in code by hand. We no longer require the
+ \c{ui} prefix to access them.
+
+ Subclassing using multiple inheritance gives us more direct access to the
+ contents of the form, is slightly cleaner than the single inheritance
+ approach, but does not conveniently support composition of multiple user
+ interfaces.
+
+
+ \section1 Run Time Form Processing
+
+ Alternatively, forms can be processed at run time, producing dynamically-
+ generated user interfaces. This can be done using the QtUiTools module
+ that provides the QUiLoader class to handle forms created with \QD.
+
+
+ \section2 The UiTools Approach
+
+ A resource file containing a \c{.ui} file is required to process forms at
+ run time. Also, the application needs to be configured to use the QtUiTools
+ module. This is done by including the following declaration in a \c qmake
+ project file, ensuring that the application is compiled and linked
+ appropriately.
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 0
+
+ The QUiLoader class provides a form loader object to construct the user
+ interface. This user interface can be retrieved from any QIODevice, e.g.,
+ a QFile object, to obtain a form stored in a project's resource file. The
+ QUiLoader::load() function constructs the form widget using the user
+ interface description contained in the file.
+
+ The QtUiTools module classes can be included using the following directive:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 1
+
+ The QUiLoader::load() function is invoked as shown in this code from the
+ \l{Text Finder Example}{Text Finder} example:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 4
+
+ In a class that uses QtUiTools to build its user interface at run time, we
+ can locate objects in the form using qFindChild(). For example, in the
+ follownig code, we locate some components based on their object names and
+ widget types:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 1
+
+ Processing forms at run-time gives the developer the freedom to change a
+ program's user interface, just by changing the \c{.ui} file. This is useful
+ when customizing programs to suit various user needs, such as extra large
+ icons or a different colour scheme for accessibility support.
+
+
+ \section1 Automatic Connections
+
+ The signals and slots connections defined for compile time or run time
+ forms can either be set up manually or automatically, using QMetaObject's
+ ability to make connections between signals and suitably-named slots.
+
+ Generally, in a QDialog, if we want to process the information entered by
+ the user before accepting it, we need to connect the clicked() signal from
+ the \gui OK button to a custom slot in our dialog. We will first show an
+ example of the dialog in which the slot is connected by hand then compare
+ it with a dialog that uses automatic connection.
+
+
+ \section2 A Dialog Without Auto-Connect
+
+ We define the dialog in the same way as before, but now include a slot in
+ addition to the constructor:
+
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.h 0
+
+ The \c checkValues() slot will be used to validate the values provided by
+ the user.
+
+ In the dialog's constructor we set up the widgets as before, and connect
+ the \gui Cancel button's \l{QPushButton::clicked()}{clicked()} signal to
+ the dialog's reject() slot. We also disable the
+ \l{QPushButton::autoDefault}{autoDefault} property in both buttons to
+ ensure that the dialog does not interfere with the way that the line edit
+ handles return key events:
+
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 0
+ \dots
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 1
+
+ We connect the \gui OK button's \l{QPushButton::clicked()}{clicked()}
+ signal to the dialog's checkValues() slot which we implement as follows:
+
+ \snippet doc/src/snippets/designer/noautoconnection/imagedialog.cpp 2
+
+ This custom slot does the minimum necessary to ensure that the data
+ entered by the user is valid - it only accepts the input if a name was
+ given for the image.
+
+ \section2 Widgets and Dialogs with Auto-Connect
+
+ Although it is easy to implement a custom slot in the dialog and connect
+ it in the constructor, we could instead use QMetaObject's auto-connection
+ facilities to connect the \gui OK button's clicked() signal to a slot in
+ our subclass. \c{uic} automatically generates code in the dialog's
+ \c setupUi() function to do this, so we only need to declare and
+ implement a slot with a name that follows a standard convention:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 2
+
+ Using this convention, we can define and implement a slot that responds to
+ mouse clicks on the \gui OK button:
+
+ \snippet doc/src/snippets/designer/autoconnection/imagedialog.h 0
+
+ Another example of automatic signal and slot connection would be the
+ \l{Text Finder Example}{Text Finder} with its \c{on_findButton_clicked()}
+ slot.
+
+ We use QMetaObject's system to enable signal and slot connections:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 2
+
+ This enables us to implement the slot, as shown below:
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 6
+ \dots
+ \snippet examples/uitools/textfinder/textfinder.cpp 8
+
+ Automatic connection of signals and slots provides both a standard naming
+ convention and an explicit interface for widget designers to work to. By
+ providing source code that implements a given interface, user interface
+ designers can check that their designs actually work without having to
+ write code themselves.
+*/
+
+
+/*!
+ \page designer-customizing-forms.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Using Stylesheets with Qt Designer
+ \nextpage Using Custom Widgets with Qt Designer
+
+ \title Customizing Qt Designer Forms
+
+ \image designer-form-settings.png
+
+ When saving a form in \QD, it is stored as an \c .ui file. Several form
+ settings, for example the grid settings or the margin and spacing for the
+ default layout, are stored along with the form's components. These settings
+ are used when the \l uic generates the form's C++ code. For more
+ information on how to use forms in your application, see the
+ \l{Using a Designer .ui File in Your Application} section.
+
+
+ \section1 Modifying the Form Settings
+
+ To modify the form settings, open the \gui Form menu and select \gui{Form
+ Settings...}
+
+ In the forms settings dialog you can specify the \gui Author of the form.
+
+ You can also alter the margin and spacing properties for the form's default
+ layout (\gui {Layout Default}). These default layout properties will be
+ replaced by the corresponding \gui {Layout Function}, if the function is
+ specified, when \c uic generates code for the form. The form settings
+ dialog lets you specify functions for both the margin and the spacing.
+
+ \target LayoutFunction
+ \table
+ \row
+ \i \inlineimage designer-form-layoutfunction.png
+ \i \bold{Layout Function}
+
+ The default layout properties will be replaced by the corresponding
+ \gui{Layout Function}, when \c uic generates code for the form. This is
+ useful when different environments requires different layouts for the same
+ form.
+
+ To specify layout functions for the form's margin and spacing, check the
+ \gui{Layout Function} group box to enable the line edits.
+ \endtable
+
+ You can also specify the form's \gui{Include Hints}; i.e., provide a list
+ of the header files which will then be included in the form window's
+ associated \c .ui file. Header files may be local, i.e., relative to the
+ project's directory, \c "mywidget.h", or global, i.e. part of Qt or the
+ compilers standard libraries: \c <QtGui/QWidget>.
+
+ Finally, you can specify the function used to load pixmaps into the form
+ window (the \gui {Pixmap Function}).
+*/
+
+
+/*!
+ \page designer-using-custom-widgets.html
+ \contentspage {Qt Designer Manual}{Contents}
+ \previouspage Customizing Qt Designer Forms
+ \nextpage Creating Custom Widgets for Qt Designer
+
+ \title Using Custom Widgets with Qt Designer
+
+ \QD can display custom widgets through its extensible plugin mechanism,
+ allowing the range of designable widgets to be extended by the user and
+ third parties. This feature also allows \QD to optionally support
+ \l{Qt3Support}{Qt 3 compatibility widgets}. Alternatively, it is possible
+ to use existing widgets as placeholders for widget classes that provide
+ similar APIs.
+
+ Widgets from the Qt3Support library are made available via in \QD's support
+ for custom widgets.
+
+
+ \section1 Handling Custom Widgets
+
+ Although \QD supports all of the standard Qt widgets, and can be configured
+ to handle widgets supplied in the Qt3Support library, some specialized
+ widgets may not be available as standard for a number of reasons:
+
+ \list
+ \i Custom widgets may not be available at the time the user interface
+ is being designed.
+ \i Custom widgets may be platform-specific, and designers may be
+ developing the user interface on a different platform to end users.
+ \i The source code for a custom widget is not available, or the user
+ interface designers are unable to use the widget for non-technical
+ reasons.
+ \endlist
+
+ In the above situations, it is still possible to design forms with the aim
+ of using custom widgets in the application. To achieve this, we can use
+ the widget promotion feature of \QD.
+
+ In all other cases, where the source code to the custom widgets is
+ available, we can adapt the custom widget for use with \QD.
+
+
+ \section2 Promoting Widgets
+
+ \image designer-promoting-widgets.png
+
+ If some forms must be designed, but certain custom widgets are unavailble
+ to the designer, we can substitute similar widgets to represent the missing
+ widgets. For example, we might represent instances of a custom push button
+ class, \c MyPushButton, with instances of QPushButton and promote these to
+ \c MyPushButton so that \l{uic.html}{uic} generates suitable code for this
+ missing class.
+
+ When choosing a widget to use as a placeholder, it is useful to compare the
+ API of the missing widget with those of standard Qt widgets. For
+ specialized widgets that subclass standard classes, the obvious choice of
+ placeholder is the base class of the custom widget; for example, QSlider
+ might be used for specialized QSlider subclasses.
+
+ For specialized widgets that do not share a common API with standard Qt
+ widgets, it is worth considering adapting a custom widget for use in \QD.
+ If this is not possible then QWidget is the obvious choice for a
+ placeholder widget since it is the lowest common denominator for all
+ widgets.
+
+ To add a placeholder, select an object of a suitable base class and choose
+ \gui{Promote to ...} from the form's context menu. After entering the class
+ name and header file in the lower part of the dialog, choose \gui{Add}. The
+ placeholder class will now appear along with the base class in the upper
+ list. Click the \gui{Promote} button to accept this choice.
+
+ Now, when the form's context menu is opened over objects of the base class,
+ the placeholder class will appear in the \gui{Promote to} submenu, allowing
+ for convenient promotion of objects to that class.
+
+ A promoted widget can be reverted to its base class by choosing
+ \gui{Demote to} from the form's context menu.
+
+
+ \section2 User Defined Custom Widgets
+
+ \image worldtimeclockplugin-example.png
+
+ Custom widgets can be adapted for use with \QD, giving designers the
+ opportunity to configure the user interface using the actual widgets that
+ will be used in an application rather than placeholder widgets. The process
+ of creating a custom widget plugin is described in the
+ \l{Creating Custom Widgets for Qt Designer} chapter of this manual.
+
+ To use a plugin created in this way, it is necessary to ensure that the
+ plugin is located on a path that \QD searches for plugins. Generally,
+ plugins stored in \c{$QTDIR/plugins/designer} will be loaded when \QD
+ starts. Further information on building and installing plugins can be found
+ \l{Creating Custom Widgets for Qt Designer#BuildingandInstallingthePlugin}
+ {here}. You can also refer to the \l{How to Create Qt Plugins}
+ {Plugins HOWTO} document for information about creating plugins.
+*/
+
+
+/*!
+ \page designer-creating-custom-widgets.html
+ \previouspage Using Custom Widgets with Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+ \nextpage Creating Custom Widget Extensions
+
+ \title Creating Custom Widgets for Qt Designer
+
+ \QD's plugin-based architecture allows user-defined and third party custom
+ widgets to be edited just like you do with standard Qt widgets. All of the
+ custom widget's features are made available to \QD, including widget
+ properties, signals, and slots. Since \QD uses real widgets during the form
+ design process, custom widgets will appear the same as they do when
+ previewed.
+
+ \image worldtimeclockplugin-example.png
+
+ The \l QtDesigner module provides you with the ability to create custom
+ widgets in \QD.
+
+
+ \section1 Getting Started
+
+ To integrate a custom widget with \QD, you require a suitable description
+ for the widget and an appropriate \c{.pro} file.
+
+
+ \section2 Providing an Interface Description
+
+ To inform \QD about the type of widget you want to provide, create a
+ subclass of QDesignerCustomWidgetInterface that describes the various
+ properties your widget exposes. Most of these are supplied by functions
+ that are pure virtual in the base class, because only the author of the
+ plugin can provide this information.
+
+ \table
+ \header
+ \o Function
+ \o Description of the return value
+ \row
+ \o \c name()
+ \o The name of the class that provides the widget.
+ \row
+ \o \c group()
+ \o The group in \QD's widget box that the widget belongs to.
+ \row
+ \o \c toolTip()
+ \o A short description to help users identify the widget in \QD.
+ \row
+ \o \c whatsThis()
+ \o A longer description of the widget for users of \QD.
+ \row
+ \o \c includeFile()
+ \o The header file that must be included in applications that use
+ this widget. This information is stored in .ui files and will
+ be used by \c uic to create a suitable \c{#includes} statement
+ in the code it generates for the form containing the custom
+ widget.
+ \row
+ \o \c icon()
+ \o An icon that can be used to represent the widget in \QD's
+ widget box.
+ \row
+ \o \c isContainer()
+ \o True if the widget will be used to hold child widgets;
+ false otherwise.
+ \row
+ \o \c createWidget()
+ \o A QWidget pointer to an instance of the custom widget,
+ constructed with the parent supplied.
+ \note createWidget() is a factory function responsible for
+ creating the widget only. The custom widget's properties will
+ not be available until load() returns.
+ \row
+ \o \c domXml()
+ \o A description of the widget's properties, such as its object
+ name, size hint, and other standard QWidget properties.
+ \row
+ \o \c codeTemplate()
+ \o This function is reserved for future use by \QD.
+ \endtable
+
+ Two other virtual functions can also be reimplemented:
+
+ \table
+ \row
+ \o \c initialize()
+ \o Sets up extensions and other features for custom widgets. Custom
+ container extensions (see QDesignerContainerExtension) and task
+ menu extensions (see QDesignerTaskMenuExtension) should be set
+ up in this function.
+ \row
+ \o \c isInitialized()
+ \o Returns true if the widget has been initialized; returns false
+ otherwise. Reimplementations usually check whether the
+ \c initialize() function has been called and return the result
+ of this test.
+ \endtable
+
+
+ \section2 Notes on the \c{domXml()} Function
+
+ The \c{domXml()} function returns a \c{.ui} file snippet that is used by
+ \QD's widget factory to create a custom widget and its applicable
+ properties.
+
+ Since Qt 4.4, \QD's widget box allows for a complete \c{.ui} file to
+ describe \bold one custom widget. The \c{.ui} file can be loaded using the
+ \c{<ui>} tag. Specifying the <ui> tag allows for adding the <customwidget>
+ element that contains additional information for custom widgets. The
+ \c{<widget>} tag is sufficient if no additional information is required
+
+ If the custom widget does not provide a reasonable size hint, it is
+ necessary to specify a default geometry in the string returned by the
+ \c domXml() function in your subclass. For example, the
+ \c AnalogClockPlugin provided by the \l{designer/customwidgetplugin}
+ {Custom Widget Plugin} example, defines a default widgetgeometry in the
+ following way:
+
+ \dots
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 11
+ \dots
+
+ An additional feature of the \c domXml() function is that, if it returns
+ an empty string, the widget will not be installed in \QD's widget box.
+ However, it can still be used by other widgets in the form. This feature
+ is used to hide widgets that should not be explicitly created by the user,
+ but are required by other widgets.
+
+ If you would like to use a container widget that is not a subclass of the
+ containers provided in \QD, but the container is still based on the notion
+ of \e{Current Page}, you need to provide a container extension and
+ tell \QD which method to use to add the pages. This can be done using the
+ \c{<addpagemethod>} XML tag.
+
+
+ \section1 Plugin Requirements
+
+ In order for plugins to work correctly on all platforms, you need to ensure
+ that they export the symbols needed by \QD.
+
+ First of all, the plugin class must be exported in order for the plugin to
+ be loaded by \QD. Use the Q_EXPORT_PLUGIN2() macro to do this. Also, the
+ QDESIGNER_WIDGET_EXPORT macro must be used to define each custom widget class
+ within a plugin, that \QD will instantiate.
+
+
+ \section1 Creating Well Behaved Widgets
+
+ Some custom widgets have special user interface features that may make them
+ behave differently to many of the standard widgets found in \QD.
+ Specifically, if a custom widget grabs the keyboard as a result of a call
+ to QWidget::grabKeyboard(), the operation of \QD will be affected.
+
+ To give custom widgets special behavior in \QD, provide an implementation
+ of the initialize() function to configure the widget construction process
+ for \QD specific behavior. This function will be called for the first time
+ before any calls to createWidget() and could perhaps set an internal flag
+ that can be tested later when \QD calls the plugin's createWidget()
+ function.
+
+
+ \target BuildingandInstallingthePlugin
+ \section1 Building and Installing the Plugin
+
+ The \c{.pro} file for a plugin must specify the headers and sources for
+ both the custom widget and the plugin interface. Typically, this file only
+ has to specify that the plugin's project is to be built as a library, but
+ with specific plugin support for \QD. This is done with the following
+ declarations:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.pro 1
+
+ If Qt is configured to build in both debug and release modes, \QD will be
+ built in release mode. When this occurs, it is necessary to ensure that
+ plugins are also built in release mode. To do this, include the following
+ declaration in the plugin's \c{.pro} file:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 3
+
+ If plugins are built in a mode that is incompatible with \QD, they will
+ not be loaded and installed. For more information about plugins, see the
+ \l{plugins-howto.html}{Plugins HOWTO} document.
+
+ It is also necessary to ensure that the plugin is installed together with
+ other \QD widget plugins:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 4
+
+ The \c $[QT_INSTALL_PLUGINS] variable is a placeholder to the location of
+ the installed Qt plugins. You can configure \QD to look for plugins in
+ other locations by setting the \c QT_PLUGIN_PATH environment variable
+ before running the application.
+
+ \note \QD will look for a \c designer subdirectory in each path supplied.
+
+ See QCoreApplication::libraryPaths() for more information about customizing
+ paths for libraries and plugins with Qt applications.
+
+\omit
+ \section1 Using Qt Script to Aid in Building Forms
+
+ Starting with Qt 4.3, \c .ui files may contain
+ \l{QtScript}{Qt Script} snippets that are executed by \l uic or QUiLoader
+ when building forms.
+
+ The snippets are executed per widget. The snippet may modify properties
+ or invoke slots on the widget.
+
+ Special variables are used to access the widget:
+
+ \table
+ \header
+ \o Name
+ \o Value
+ \row \o \c widget
+ \o The widget being built.
+ \row \o \c childWidgets
+ \o An array containing the child widgets. This is useful
+ for QDesignerContainerExtension subclasses.
+ \endtable
+
+ If scripts are present in an \c {uic}-generated form, the application
+ must be configured with Qt Script support.
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 5
+
+ For security reasons, the execution of scripts is disabled
+ by default in QUiLoader. You can enable it by
+ calling the QUiLoader::setScriptingEnabled() method.
+
+ The resulting script snippet is concatenated from snippets occurring in
+ several places:
+
+ \table
+ \header
+ \o Source
+ \o Usage
+ \row \o The \c codeTemplate() function of QDesignerCustomWidgetInterface
+ \o Allows snippets to be run on a per-class basis; for example, to set up a
+ container using the QDesignerContainerExtension.
+ \row \o The \c script() method of QDesignerScriptExtension
+ \o Allows snippets to be run on a per-widget basis; for example,
+ to set up the internal state of a custom widget.
+
+ Such an internal state might be, for example, the contents of
+ a custom item view container widget, for which an editor
+ is provided by an QDesignerTaskMenuExtension object.
+
+ \row \o Snippets entered at run-time using the \gui{Change script...}
+ option of the form's context menu
+ \o Fast prototyping. To get an idea,
+ drag a QLineEdit onto the form, enter the script
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 6
+ and preview the form.
+ \endtable
+\endomit
+
+
+ \section1 Related Examples
+
+ For more information on using custom widgets in \QD, refer to the
+ \l{designer/customwidgetplugin}{Custom Widget Plugin} and
+ \l{designer/worldtimeclockplugin}{World Time Clock Plugin} examples for more
+ information about using custom widgets in \QD. Also, you can use the
+ QDesignerCustomWidgetCollectionInterface class to combine several custom
+ widgets into a single library.
+*/
+
+
+/*!
+ \page designer-creating-custom-widgets-extensions.html
+ \previouspage Creating Custom Widgets for Qt Designer
+ \nextpage Qt Designer's UI File Format
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \title Creating Custom Widget Extensions
+
+ Once you have a custom widget plugin for \QD, you can provide it with the
+ expected behavior and functionality within \QD's workspace, using custom
+ widget extensions.
+
+
+ \section1 Extension Types
+
+ There are several available types of extensions in \QD. You can use all of
+ these extensions in the same pattern, only replacing the respective
+ extension base class.
+
+ QDesignerContainerExtension is necessary when implementing a custom
+ multi-page container.
+
+ \table
+ \row
+ \i \inlineimage designer-manual-taskmenuextension.png
+ \i \bold{QDesignerTaskMenuExtension}
+
+ QDesignerTaskMenuExtension is useful for custom widgets. It provides an
+ extension that allows you to add custom menu entries to \QD's task
+ menu.
+
+ The \l{designer/taskmenuextension}{Task Menu Extension} example
+ illustrates how to use this class.
+
+ \row
+ \i \inlineimage designer-manual-containerextension.png
+ \i \bold{QDesignerContainerExtension}
+
+ QDesignerContainerExtension is necessary when implementing a custom
+ multi-page container. It provides an extension that allows you to add
+ and delete pages for a multi-page container plugin in \QD.
+
+ The \l{designer/containerextension}{Container Extension} example
+ further explains how to use this class.
+
+ \note It is not possible to add custom per-page properties for some
+ widgets (e.g., QTabWidget) due to the way they are implemented.
+ \endtable
+
+ \table
+ \row
+ \i \inlineimage designer-manual-membersheetextension.png
+ \i \bold{QDesignerMemberSheetExtension}
+
+ The QDesignerMemberSheetExtension class allows you to manipulate a
+ widget's member functions displayed when connecting signals and slots.
+
+ \row
+ \i \inlineimage designer-manual-propertysheetextension.png
+ \i \bold{QDesignerPropertySheetExtension,
+ QDesignerDynamicPropertySheetExtension}
+
+ These extension classes allow you to control how a widget's properties
+ are displayed in \QD's property editor.
+ \endtable
+
+\omit
+ \row
+ \o
+ \o \bold {QDesignerScriptExtension}
+
+ The QDesignerScriptExtension class allows you to define script
+ snippets that are executed when a form is loaded. The extension
+ is primarily intended to be used to set up the internal states
+ of custom widgets.
+ \endtable
+\endomit
+
+
+ \QD uses the QDesignerPropertySheetExtension and the
+ QDesignerMemberSheetExtension classes to feed its property and signal and
+ slot editors. Whenever a widget is selected in its workspace, \QD will
+ query for the widget's property sheet extension; likewise, whenever a
+ connection between two widgets is requested, \QD will query for the
+ widgets' member sheet extensions.
+
+ \warning All widgets have default property and member sheets. If you
+ implement custom property sheet or member sheet extensions, your custom
+ extensions will override the default sheets.
+
+
+ \section1 Creating an Extension
+
+ To create an extension you must inherit both QObject and the appropriate
+ base class, and reimplement its functions. Since we are implementing an
+ interface, we must ensure that it is made known to the meta object system
+ using the Q_INTERFACES() macro in the extension class's definition. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 7
+
+ This enables \QD to use the qobject_cast() function to query for supported
+ interfaces using a QObject pointer only.
+
+
+ \section1 Exposing an Extension to Qt Designer
+
+ In \QD the extensions are not created until they are required. For this
+ reason, when implementing extensions, you must subclass QExtensionFactory
+ to create a class that is able to make instances of your extensions. Also,
+ you must register your factory with \QD's extension manager; the extension
+ manager handles the construction of extensions.
+
+ When an extension is requested, \QD's extension manager will run through
+ its registered factories calling QExtensionFactory::createExtension() for
+ each of them until it finds one that is able to create the requested
+ extension for the selected widget. This factory will then make an instance
+ of the extension.
+
+ \image qtdesignerextensions.png
+
+
+ \section2 Creating an Extension Factory
+
+ The QExtensionFactory class provides a standard extension factory, but it
+ can also be used as an interface for custom extension factories.
+
+ The purpose is to reimplement the QExtensionFactory::createExtension()
+ function, making it able to create your extension, such as a
+ \l{designer/containerextension}{MultiPageWidget} container extension.
+
+ You can either create a new QExtensionFactory and reimplement the
+ QExtensionFactory::createExtension() function:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 8
+
+ or you can use an existing factory, expanding the
+ QExtensionFactory::createExtension() function to enable the factory to
+ create your custom extension as well:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 9
+
+
+ \section2 Accessing Qt Designer's Extension Manager
+
+ When implementing a custom widget plugin, you must subclass the
+ QDesignerCustomWidgetInterface to expose your plugin to \QD. This is
+ covered in more detail in the
+ \l{Creating Custom Widgets for Qt Designer} section. The registration of
+ an extension factory is typically made in the
+ QDesignerCustomWidgetInterface::initialize() function:
+
+ \snippet doc/src/snippets/code/doc_src_designer-manual.qdoc 10
+
+ The \c formEditor parameter in the
+ QDesignerCustomWidgetInterface::initialize() function is a pointer to \QD's
+ current QDesignerFormEditorInterface object. You must use the
+ QDesignerFormEditorInterface::extensionManager() function to retrieve an
+ interface to \QD's extension manager. Then you use the
+ QExtensionManager::registerExtensions() function to register your custom
+ extension factory.
+
+
+ \section1 Related Examples
+
+ For more information on creating custom widget extensions in \QD, refer to
+ the \l{designer/taskmenuextension}{Task Menu Extension} and
+ \l{designer/containerextension}{Container Extension} examples.
+*/
+
+
+/*!
+ \page designer-ui-file-format.html
+ \previouspage Creating Custom Widget Extensions
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \title Qt Designer's UI File Format
+
+ The \c .ui file format used by \QD is described by the
+ \l{http://www.w3.org/XML/Schema}{XML schema} presented below,
+ which we include for your convenience. Be aware that the format
+ may change in future Qt releases.
+
+ \quotefile tools/designer/data/ui4.xsd
+*/
+
+
+/*!
+ \page designer-recursive-shadow-casting.html
+ \title Implementation of the Recursive Shadow Casting Algorithm in Qt Designer
+ \contentspage {Qt Designer Manual}{Contents}
+
+ \ingroup licensing
+ \brief License information for contributions to specific parts of the Qt
+ Designer source code.
+
+ \legalese
+ Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). \BR
+ Copyright (C) 2005 Bjoern Bergstroem
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, modify, market, reproduce,
+ grant sublicenses and distribute subject to the following conditions:
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software. These
+ files are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ WARRANTY OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE.
+ \endlegalese
+*/
diff --git a/doc/src/desktop-integration.qdoc b/doc/src/desktop-integration.qdoc
new file mode 100644
index 0000000..e52b8d8
--- /dev/null
+++ b/doc/src/desktop-integration.qdoc
@@ -0,0 +1,90 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page desktop-integration.html
+ \title Desktop Integration
+ \ingroup gui-programming
+
+ Various classes in Qt are designed to help developers integrate applications into
+ users' desktop environments. These classes enable developers to take advantage
+ of native services while still using a cross-platform API.
+
+ \tableofcontents
+
+ \section1 Opening External Resources
+
+ Although Qt provides facilities to handle and display resources, such as
+ \l{QImageIOHandler}{common image formats} and \l{QTextDocument}{HTML},
+ it is sometimes necessary to open files and external resources using external
+ applications.
+
+ QDesktopServices provides an interface to services offered by the user's desktop
+ environment. In particular, the \l{QDesktopServices::}{openUrl()} function is
+ used to open resources using the appropriate application, which may have been
+ specifically configured by the user.
+
+ \section1 System Tray Icons
+
+ Many modern desktop environments feature docks or panels with \e{system trays}
+ in which applications can install icons. Applications often use system tray icons
+ to display status information, either by updating the icon itself or by showing
+ information in "balloon messages". Additionally, many applications provide
+ pop-up menus that can be accessed via their system tray icons.
+
+ The QSystemTrayIcon class exposes all of the above features via an intuitive
+ Qt-style API that can be used on all desktop platforms.
+
+ \section1 Desktop Widgets
+
+ On systems where the user's desktop is displayed using more than one screen,
+ certain types of applications may need to obtain information about the
+ configuration of the user's workspace to ensure that new windows and dialogs
+ are opened in appropriate locations.
+
+ The QDesktopWidget class can be used to monitor the positions of widgets and
+ notify applications about changes to the way the desktop is split over the
+ available screens. This enables applications to implement policies for
+ positioning new windows so that, for example, they do not distract a user
+ who is working on a specific task.
+
+
+*/
diff --git a/doc/src/developing-on-mac.qdoc b/doc/src/developing-on-mac.qdoc
new file mode 100644
index 0000000..00c54b6
--- /dev/null
+++ b/doc/src/developing-on-mac.qdoc
@@ -0,0 +1,254 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page developing-on-mac.html
+ \title Developing Qt Applications on Mac OS X
+ \brief A overview of items to be aware of when developing Qt applications
+ on Mac OS X
+ \ingroup platform-notes
+
+ \tableofcontents
+
+ Mac OS X is a UNIX platform and behaves similar to other Unix-like
+ platforms. The main difference is X11 is not used as the primary windowing
+ system. Instead, Mac OS X uses its own native windowing system that is
+ accessible through the Carbon and Cocoa APIs. Application development on
+ Mac OS X is done using Xcode Tools, an optional install included on every
+ Mac with updates available from \l {http://developer.apple.com}{Apple's
+ developer website}. Xcode Tools includes Apple-modified versions of the GCC
+ compiler.
+
+
+ \section1 What Versions of Mac OS X are Supported?
+
+ As of Qt 4.5, Qt supports Mac OS X versions 10.3 (for \bold{deployment
+ only}, not for development), 10.4 and 10.5. It is usually in the best
+ interest of the developer and user to be running the latest updates to any
+ version. We test internally against Mac OS X 10.3.9 and Mac OS X 10.4.11 as
+ well as the updated release of Mac OS X 10.5.
+
+
+ \section2 Carbon or Cocoa?
+
+ Historically, Qt has used the Carbon toolkit, which supports 32-bit
+ applications on Mac OS X 10.3 and up. Qt 4.5 adds support for the Cocoa
+ toolkit, which requires 10.5 and provides 64-bit support.
+
+ This detail is typically not important to Qt application developers. Qt is
+ cross-platform across Carbon and Cocoa, and Qt applications behave
+ the same way when configured for either one. Eventually, the Carbon
+ version will be discontinued. This is something to keep in mind when you
+ consider writing code directly against native APIs.
+
+ The current binary for Qt is built for Carbon. If you want to choose which
+ framework Qt will use, you must build from scratch. Carbon or Cocoa is
+ chosen when configuring the package for building. The configure process
+ selects Carbon by default, to specify Cocoa use the \c{-cocoa} flag.
+ configure for a 64-bit architecture using one of the \c{-arch} flags (see
+ \l{universal binaries}{Universal Binaries}).
+
+ Currently, Apple's GCC 4.0.1 is used by default. When building on 10.5,
+ Apple's GCC 4.2 is also available and selectable with the configure flag:
+ \c{-platform macx-g++42}. GCC 3.x will \e not work. Experimental LLVM-GCC
+ support is available by passing in the \c{-platform macx-llvm} flag.
+
+ The following table summarizes the different versions of Mac OS X and what
+ capabilities are used by Qt.
+
+ \table
+ \header
+ \o Mac OS X Version
+ \o Cat Name
+ \o Native API Used by Qt
+ \o Bits available to address memory
+ \o CPU Architecture Supported
+ \o Development Platform
+ \row
+ \o 10.3
+ \o Panther
+ \o Carbon
+ \o 32
+ \o PPC
+ \o No
+ \row
+ \o 10.4
+ \o Tiger
+ \o Carbon
+ \o 32
+ \o PPC/Intel
+ \o Yes
+ \row
+ \o 10.5
+ \o Leopard
+ \o Carbon
+ \o 32
+ \o PPC/Intel
+ \o Yes
+ \row
+ \o 10.5
+ \o Leopard
+ \o Cocoa
+ \o 32/64
+ \o PPC/Intel
+ \o Yes
+ \endtable
+
+ \section2 Which One Should I Use?
+
+ Carbon and Cocoa both have their advantages and disadvantages. Probably the
+ easiest way to determine is to look at the version of Mac OS X you are
+ targetting. If you are starting a new application and can target 10.5 and
+ up, then please consider Cocoa only. If you have an existing application or
+ need to target earlier versions of the operating system and do not need
+ access to 64-bit or newer Apple technologies, then Carbon is a good fit. If
+ your needs fall in between, you can go with a 64-bit Cocoa and 32-bit
+ Carbon universal application with the appropriate checks in your code to
+ choose the right path based on where you are running the application.
+
+ \target universal binaries
+ \section1 Universal Binaries
+
+ In 2006, Apple begin transitioning from PowerPC (PPC) to Intel (x86)
+ systems. Both architectures are supported by Qt. The release of Mac OS X
+ 10.5 in October 2007 added the possibility of writing and deploying 64-bit
+ GUI applications. Qt 4.5 supports both the 32-bit (PPC and x86) and 64-bit
+ (PPC64 and x86-64) versions of PowerPC and Intel-based systems are
+ supported.
+
+ Universal binaries are used to bundle binaries for more than one
+ architecture into a single package, simplifying deployment and
+ distribution. When running an application the operating system will select
+ the most appropriate architecture. Universal binaries support the following
+ architectures; they can be added to the build at configure time using the
+ \c{-arch} arguments:
+
+ \table
+ \header
+ \o Architecture
+ \o Flag
+ \row
+ \o Intel, 32-bit
+ \o \c{-arch x86}
+ \row
+ \o Intel, 64-bit
+ \o \c{-arch x86_64}
+ \row
+ \o PPC, 32-bit
+ \o \c{-arch ppc}
+ \row
+ \o PPC, 64-bit
+ \o \c{-arch ppc64}
+ \endtable
+
+ If there are no \c{-arch} flags specified, configure builds for the 32-bit
+ architecture, if you are currently on one. Universal binaries were initially
+ used to simplify the PPC to Intel migration. You can use \c{-universal} to
+ build for both the 32-bit Intel and PPC architectures.
+
+ \note The \c{-arch} flags at configure time only affect how Qt is built.
+ Applications are by default built for the 32-bit architecture you are
+ currently on. To build a universal binary, add the architectures to the
+ CONFIG variable in the .pro file:
+
+ \code
+ CONFIG += x86 ppc x86_64 ppc64
+ \endcode
+
+
+ \section1 Day-to-Day Application Development on OS X
+
+ On the command-line, applications can be built using \c qmake and \c make.
+ Optionally, \c qmake can generate project files for Xcode with
+ \c{-spec macx-xcode}. If you are using the binary package, \c qmake
+ generates Xcode projects by default; use \c{-spec macx-gcc} to generate
+ makefiles.
+
+ The result of the build process is an application bundle, which is a
+ directory structure that contains the actual application executable. The
+ application can be launched by double-clicking it in Finder, or by
+ referring directly to its executable from the command line, i. e.
+ \c{myApp.app/Contents/MacOS/myApp}.
+
+ If you wish to have a command-line tool that does not use the GUI (e.g.,
+ \c moc, \c uic or \c ls), you can tell \c qmake not to execute the bundle
+ creating steps by removing it from the \c{CONFIG} in your \c{.pro} file:
+
+ \code
+ CONFIG -= app_bundle
+ \endcode
+
+
+ \section1 Deployment - "Compile once, deploy everywhere"
+
+ In general, Qt supports building on one Mac OS X version and deploying on
+ all others, both forward and backwards. You can build on 10.4 Tiger and run
+ the same binary on 10.3 and 10.5.
+
+ Some restrictions apply:
+
+ \list
+ \o Some functions and optimization paths that exist in later versions
+ of Mac OS X will not be available if you build on an earlier
+ version of Mac OS X.
+ \o The CPU architecture should match.
+ \o Cocoa support is only available for Mac OS X 10.5 and up.
+ \endlist
+
+ Universal binaries can be used to provide a smorgasbord of configurations
+ catering to all possible architectures.
+
+ Mac applications are typically deployed as self-contained application
+ bundles. The application bundle contains the application executable as well
+ as dependencies such as the Qt libraries, plugins, translations and other
+ resources you may need. Third party libraries like Qt are normally not
+ installed system-wide; each application provides its own copy.
+
+ The most common way to distribute applications is to provide a compressed
+ disk image (.dmg file) that the user can mount in Finder. The Mac
+ deployment tool (macdeployqt) can be used to create the self-contained bundles, and
+ optionally also create a .dmg archive. See the
+ \l{Deploying an Application on Mac OS X}{Mac deployment guide} for more
+ information about deployment. It is also possible to use an installer
+ wizard. More information on this option can be found in
+ \l{http://developer.apple.com/mac/}{Apple's documentation}.
+*/
+
diff --git a/doc/src/diagrams/arthurplugin-demo.png b/doc/src/diagrams/arthurplugin-demo.png
new file mode 100644
index 0000000..3b03341
--- /dev/null
+++ b/doc/src/diagrams/arthurplugin-demo.png
Binary files differ
diff --git a/doc/src/diagrams/arthurplugin-demo.ui b/doc/src/diagrams/arthurplugin-demo.ui
new file mode 100644
index 0000000..1bf39c2
--- /dev/null
+++ b/doc/src/diagrams/arthurplugin-demo.ui
@@ -0,0 +1,58 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>Form</class>
+ <widget class="QWidget" name="Form" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>532</width>
+ <height>452</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <widget class="PathDeformRendererEx" name="pathdeformrendererex" >
+ <property name="geometry" >
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>300</width>
+ <height>200</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="PathStrokeRendererEx" name="pathstrokerendererex" >
+ <property name="geometry" >
+ <rect>
+ <x>210</x>
+ <y>230</y>
+ <width>300</width>
+ <height>200</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <customwidgets>
+ <customwidget>
+ <class>PathStrokeRendererEx</class>
+ <extends></extends>
+ <header>pathstroke.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ <customwidget>
+ <class>PathDeformRendererEx</class>
+ <extends></extends>
+ <header>deform.h</header>
+ <container>0</container>
+ <pixmap></pixmap>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/doc/src/diagrams/assistant-manual/assistant-assistant.png b/doc/src/diagrams/assistant-manual/assistant-assistant.png
new file mode 100644
index 0000000..d728889
--- /dev/null
+++ b/doc/src/diagrams/assistant-manual/assistant-assistant.png
Binary files differ
diff --git a/doc/src/diagrams/assistant-manual/assistant-assistant.zip b/doc/src/diagrams/assistant-manual/assistant-assistant.zip
new file mode 100644
index 0000000..3ea5921
--- /dev/null
+++ b/doc/src/diagrams/assistant-manual/assistant-assistant.zip
Binary files differ
diff --git a/doc/src/diagrams/assistant-manual/assistant-temp-toolbar.png b/doc/src/diagrams/assistant-manual/assistant-temp-toolbar.png
new file mode 100644
index 0000000..d85439c
--- /dev/null
+++ b/doc/src/diagrams/assistant-manual/assistant-temp-toolbar.png
Binary files differ
diff --git a/doc/src/diagrams/boat.png b/doc/src/diagrams/boat.png
new file mode 100644
index 0000000..3401dc3
--- /dev/null
+++ b/doc/src/diagrams/boat.png
Binary files differ
diff --git a/doc/src/diagrams/boat.sk b/doc/src/diagrams/boat.sk
new file mode 100644
index 0000000..01ff8ce
--- /dev/null
+++ b/doc/src/diagrams/boat.sk
@@ -0,0 +1,65 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(90,0,0,-65,35,810)
+G()
+gl([(0,(0.718,0.667,0.533)),(1,(0.839,0.739,0.586))])
+pgl(0,-1,0)
+fp()
+lw(1)
+b()
+bs(82.5,765,0)
+bs(82.5,805,0)
+bs(77.5,805,0)
+bs(77.5,765,0)
+bs(82.5,765,0)
+bC()
+G()
+fp((0.718,0.082,0.108))
+lw(1)
+b()
+bs(82.5,805,0)
+bs(82.5,800,0)
+bs(92.5,802.5,0)
+bs(82.5,805,0)
+bC()
+G()
+gl([(0,(0.718,0.667,0.533)),(1,(0.839,0.739,0.586))])
+pgl(0,-1,0)
+fp()
+lw(1)
+b()
+bs(67.5,750,0)
+bs(92.5,750,0)
+bs(117.5,765,0)
+bs(42.5,765,0)
+bs(67.5,750,0)
+bC()
+gl([(0,(0.718,0.718,0.718)),(1,(1,1,1))])
+pgl(0,-1,0)
+fp()
+lw(1)
+b()
+bs(77.5,800,0)
+bs(47.5,770,0)
+bs(77.5,770,0)
+bs(77.5,800,0)
+bC()
+gl([(0,(0.718,0.718,0.718)),(1,(1,1,1))])
+pgl(0,-1,0)
+fp()
+lw(1)
+b()
+bs(82.5,800,0)
+bs(82.5,770,0)
+bs(112.5,770,0)
+bs(82.5,800,0)
+bC()
+G_()
+G_()
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/car.png b/doc/src/diagrams/car.png
new file mode 100644
index 0000000..99c741d
--- /dev/null
+++ b/doc/src/diagrams/car.png
Binary files differ
diff --git a/doc/src/diagrams/car.sk b/doc/src/diagrams/car.sk
new file mode 100644
index 0000000..4c4c51d
--- /dev/null
+++ b/doc/src/diagrams/car.sk
@@ -0,0 +1,69 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.846,0.35,0.35))
+lw(1)
+b()
+bs(65,765,0)
+bs(95,765,0)
+bs(115,765,0)
+bs(120,770,0)
+bs(120,780,0)
+bs(115,785,0)
+bs(105,785,0)
+bs(95,795,0)
+bs(65,795,0)
+bs(55,785,0)
+bs(45,785,0)
+bs(40,780,0)
+bs(40,770,0)
+bs(45,765,0)
+bs(65,765,0)
+bC()
+fp((1,1,1))
+lw(1)
+e(7.5,0,0,-7.5,57.5,765)
+fp((1,1,1))
+lw(1)
+e(7.5,0,0,-7.5,102.5,765)
+gl([(0,(1,1,1)),(1,(0.839,0.839,0.839))])
+pgl(-0.812015,0.583636,0)
+fp()
+lw(1)
+b()
+bs(55,785,0)
+bs(105,785,0)
+bs(95,795,0)
+bs(85,795,0)
+bs(85,785,0)
+bs(80,785,0)
+bs(80,795,0)
+bs(65,795,0)
+bs(55,785,0)
+bC()
+fp((0.966,0.4,0.4))
+lw(1)
+b()
+bs(65,785,0)
+bs(65,770,0)
+bs(70,765,0)
+bs(80,765,0)
+bs(80,785,0)
+bs(65,785,0)
+bC()
+fp((0.966,0.4,0.4))
+lw(1)
+b()
+bs(80,785,0)
+bs(80,765,0)
+bs(90,765,0)
+bs(95,770,0)
+bs(95,785,0)
+bs(80,785,0)
+bC()
+le()
+lw(1)
+r(90,0,0,-65,35,810)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/chip-demo.png b/doc/src/diagrams/chip-demo.png
new file mode 100644
index 0000000..cd81ebe
--- /dev/null
+++ b/doc/src/diagrams/chip-demo.png
Binary files differ
diff --git a/doc/src/diagrams/chip-demo.zip b/doc/src/diagrams/chip-demo.zip
new file mode 100644
index 0000000..dcc6072
--- /dev/null
+++ b/doc/src/diagrams/chip-demo.zip
Binary files differ
diff --git a/doc/src/diagrams/cleanlooks-dialogbuttonbox.png b/doc/src/diagrams/cleanlooks-dialogbuttonbox.png
new file mode 100644
index 0000000..21c7981
--- /dev/null
+++ b/doc/src/diagrams/cleanlooks-dialogbuttonbox.png
Binary files differ
diff --git a/doc/src/diagrams/clock.png b/doc/src/diagrams/clock.png
new file mode 100644
index 0000000..c4bbeea
--- /dev/null
+++ b/doc/src/diagrams/clock.png
Binary files differ
diff --git a/doc/src/diagrams/completer-example-shaped.png b/doc/src/diagrams/completer-example-shaped.png
new file mode 100644
index 0000000..a3afed4
--- /dev/null
+++ b/doc/src/diagrams/completer-example-shaped.png
Binary files differ
diff --git a/doc/src/diagrams/complexwizard-flow.sk b/doc/src/diagrams/complexwizard-flow.sk
new file mode 100644
index 0000000..a4b0668
--- /dev/null
+++ b/doc/src/diagrams/complexwizard-flow.sk
@@ -0,0 +1,62 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(1083919052,'../images/complexwizard-evaluatepage.png')
+im((96.171,8.31514),1083919052)
+G()
+bm(1083939916,'../images/complexwizard-finishpage.png')
+im((598.76,309.977),1083939916)
+bm(1083947948,'../images/complexwizard-titlepage.png')
+im((-426.888,309.977),1083947948)
+G_()
+G()
+bm(1083738188,'../images/complexwizard-detailspage.png')
+im((438.772,659.042),1083738188)
+bm(1083948908,'../images/complexwizard-registerpage.png')
+im((-246.43,659.042),1083948908)
+G_()
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-135.462,551.306,0)
+bs(-53.5823,638.572,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(266.571,764.5,0)
+bs(411,764.5,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-112.837,286.275,0)
+bs(63.8503,162.378,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(617.918,157.295,0)
+bs(794.606,281.191,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(682.256,643.959,0)
+bs(764.136,556.693,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(196,641,0)
+bs(567,443.5,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,0.5,0.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/composition-demo.png b/doc/src/diagrams/composition-demo.png
new file mode 100644
index 0000000..22689ea
--- /dev/null
+++ b/doc/src/diagrams/composition-demo.png
Binary files differ
diff --git a/doc/src/diagrams/contentspropagation/background.png b/doc/src/diagrams/contentspropagation/background.png
new file mode 100644
index 0000000..21d205e
--- /dev/null
+++ b/doc/src/diagrams/contentspropagation/background.png
Binary files differ
diff --git a/doc/src/diagrams/contentspropagation/base.png b/doc/src/diagrams/contentspropagation/base.png
new file mode 100644
index 0000000..a9fc405
--- /dev/null
+++ b/doc/src/diagrams/contentspropagation/base.png
Binary files differ
diff --git a/doc/src/diagrams/contentspropagation/customwidget.py b/doc/src/diagrams/contentspropagation/customwidget.py
new file mode 100755
index 0000000..89e0b1b
--- /dev/null
+++ b/doc/src/diagrams/contentspropagation/customwidget.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+
+import os, sys
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+class CustomWidget(QWidget):
+
+ def __init__(self, parent, fake = False):
+
+ QWidget.__init__(self, parent)
+ gradient = QLinearGradient(QPointF(0, 0), QPointF(100.0, 100.0))
+ baseColor = QColor(0xa6, 0xce, 0x39, 0x7f)
+ gradient.setColorAt(0.0, baseColor.light(150))
+ gradient.setColorAt(0.75, baseColor.light(75))
+ self.brush = QBrush(gradient)
+ self.fake = fake
+ self.fakeBrush = QBrush(Qt.red, Qt.DiagCrossPattern)
+
+ qtPath = QPainterPath()
+ qtPath.setFillRule(Qt.OddEvenFill)
+ qtPath.moveTo(-45.0, -20.0)
+ qtPath.lineTo(0.0, -45.0)
+ qtPath.lineTo(45.0, -20.0)
+ qtPath.lineTo(45.0, 45.0)
+ qtPath.lineTo(-45.0, 45.0)
+ qtPath.lineTo(-45.0, -20.0)
+ qtPath.closeSubpath()
+ qtPath.moveTo(15.0, 5.0)
+ qtPath.lineTo(35.0, 5.0)
+ qtPath.lineTo(35.0, 40.0)
+ qtPath.lineTo(15.0, 40.0)
+ qtPath.lineTo(15.0, 5.0)
+ qtPath.moveTo(-35.0, -15.0)
+ qtPath.closeSubpath()
+ qtPath.lineTo(-10.0, -15.0)
+ qtPath.lineTo(-10.0, 10.0)
+ qtPath.lineTo(-35.0, 10.0)
+ qtPath.lineTo(-35.0, -15.0)
+ qtPath.closeSubpath()
+ self.path = qtPath
+
+ def paintEvent(self, event):
+
+ painter = QPainter()
+ painter.begin(self)
+ painter.setRenderHint(QPainter.Antialiasing)
+ if self.fake:
+ painter.fillRect(event.rect(), QBrush(Qt.white))
+ painter.fillRect(event.rect(), self.fakeBrush)
+ painter.setBrush(self.brush)
+ painter.translate(60, 60)
+ painter.drawPath(self.path)
+ painter.end()
+
+ def sizeHint(self):
+
+ return QSize(120, 120)
+
+ def minimumSizeHint(self):
+
+ return QSize(120, 120)
+
+
+if __name__ == "__main__":
+
+ try:
+ qt = sys.argv[1]
+ except IndexError:
+ qt = "4.1"
+
+ if qt != "4.0" and qt != "4.1":
+ sys.stderr.write("Usage: %s [4.0|4.1]\n" % sys.argv[0])
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+ exec_dir = os.path.split(os.path.abspath(sys.argv[0]))[0]
+ label = QLabel()
+ label.setPixmap(QPixmap(os.path.join(exec_dir, "background.png")))
+
+ layout = QGridLayout()
+ label.setLayout(layout)
+ if qt == "4.0":
+ layout.addWidget(CustomWidget(label), 0, 0, Qt.AlignCenter)
+ caption = QLabel("Opaque (Default)", label)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 0, Qt.AlignCenter | Qt.AlignTop)
+ elif qt == "4.1":
+ layout.addWidget(CustomWidget(label), 0, 0, Qt.AlignCenter)
+ caption = QLabel("Contents Propagated (Default)", label)
+ caption.setAutoFillBackground(True)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 0, Qt.AlignCenter | Qt.AlignTop)
+
+ if qt == "4.0":
+ contentsWidget = CustomWidget(label)
+ contentsWidget.setAttribute(Qt.WA_ContentsPropagated, True)
+ layout.addWidget(contentsWidget, 0, 1, Qt.AlignCenter)
+ caption = QLabel("With WA_ContentsPropagated set", label)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 1, Qt.AlignCenter | Qt.AlignTop)
+ elif qt == "4.1":
+ autoFillWidget = CustomWidget(label)
+ autoFillWidget.setAutoFillBackground(True)
+ layout.addWidget(autoFillWidget, 0, 1, Qt.AlignCenter)
+ caption = QLabel("With autoFillBackground set", label)
+ caption.setAutoFillBackground(True)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 1, Qt.AlignCenter | Qt.AlignTop)
+
+ if qt == "4.0":
+ noBackgroundWidget = CustomWidget(label, fake = True)
+ noBackgroundWidget.setAttribute(Qt.WA_NoBackground, True)
+ layout.addWidget(noBackgroundWidget, 0, 2, Qt.AlignCenter)
+ caption = QLabel("With WA_NoBackground set", label)
+ caption.setWordWrap(True)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 2, Qt.AlignCenter | Qt.AlignTop)
+ elif qt == "4.1":
+ opaqueWidget = CustomWidget(label, fake = True)
+ opaqueWidget.setAttribute(Qt.WA_OpaquePaintEvent, True)
+ layout.addWidget(opaqueWidget, 0, 2, Qt.AlignCenter)
+ caption = QLabel("With WA_OpaquePaintEvent set", label)
+ caption.setAutoFillBackground(True)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 2, Qt.AlignCenter | Qt.AlignTop)
+
+ if qt == "4.0":
+ label.setWindowTitle("Qt 4.0: Painting Custom Widgets")
+ elif qt == "4.1":
+ label.setWindowTitle("Qt 4.1: Painting Custom Widgets")
+
+ label.resize(404, 160)
+ label.show()
+ sys.exit(app.exec_())
diff --git a/doc/src/diagrams/contentspropagation/lightbackground.png b/doc/src/diagrams/contentspropagation/lightbackground.png
new file mode 100644
index 0000000..3006044
--- /dev/null
+++ b/doc/src/diagrams/contentspropagation/lightbackground.png
Binary files differ
diff --git a/doc/src/diagrams/contentspropagation/standardwidgets.py b/doc/src/diagrams/contentspropagation/standardwidgets.py
new file mode 100755
index 0000000..975287d
--- /dev/null
+++ b/doc/src/diagrams/contentspropagation/standardwidgets.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+
+import os, sys
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+
+def createGroupBox(parent, attributes = None, fill = False, fake = False):
+
+ background = CustomWidget(parent, fake)
+ backgroundLayout = QVBoxLayout()
+ backgroundLayout.setMargin(4)
+ background.setLayout(backgroundLayout)
+
+ groupBox = QGroupBox("&Options")
+ layout = QGridLayout()
+ groupBox.setLayout(layout)
+ layout.addWidget(QCheckBox("C&ase sensitive"), 0, 0)
+ layout.addWidget(QCheckBox("W&hole words"), 0, 1)
+ checkedBox = QCheckBox("Search &forwards")
+ checkedBox.setChecked(True)
+ layout.addWidget(checkedBox, 1, 0)
+ layout.addWidget(QCheckBox("From &start of text"), 1, 1)
+
+ backgroundLayout.addWidget(groupBox)
+
+ if attributes:
+ for attr in attributes:
+ groupBox.setAttribute(attr, True)
+ if not fake:
+ background.setAttribute(attr, True)
+
+ groupBox.setAutoFillBackground(fill)
+ background.setAutoFillBackground(fill)
+
+ return background
+
+class CustomWidget(QWidget):
+
+ def __init__(self, parent, fake = False):
+
+ QWidget.__init__(self, parent)
+ self.fake = fake
+ self.fakeBrush = QBrush(Qt.red, Qt.DiagCrossPattern)
+
+ def paintEvent(self, event):
+
+ painter = QPainter()
+ painter.begin(self)
+ painter.setRenderHint(QPainter.Antialiasing)
+ if self.fake:
+ painter.fillRect(event.rect(), QBrush(Qt.white))
+ painter.fillRect(event.rect(), self.fakeBrush)
+ painter.end()
+
+
+if __name__ == "__main__":
+
+ try:
+ qt = sys.argv[1]
+ except IndexError:
+ qt = "4.1"
+
+ if qt != "4.0" and qt != "4.1":
+ sys.stderr.write("Usage: %s [4.0|4.1]\n" % sys.argv[0])
+ sys.exit(1)
+
+ app = QApplication(sys.argv)
+ exec_dir = os.path.split(os.path.abspath(sys.argv[0]))[0]
+ label = QLabel()
+ label.setPixmap(QPixmap(os.path.join(exec_dir, "lightbackground.png")))
+
+ layout = QGridLayout()
+ label.setLayout(layout)
+ if qt == "4.0":
+ layout.addWidget(createGroupBox(label), 0, 0, Qt.AlignCenter)
+ caption = QLabel("Opaque (Default)", label)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 0, Qt.AlignCenter | Qt.AlignTop)
+ elif qt == "4.1":
+ layout.addWidget(createGroupBox(label), 0, 0, Qt.AlignCenter)
+ caption = QLabel("Contents Propagated (Default)", label)
+ caption.setAutoFillBackground(True)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 0, Qt.AlignCenter | Qt.AlignTop)
+
+ if qt == "4.0":
+ contentsWidget = createGroupBox(label)
+ contentsWidget.setAttribute(Qt.WA_ContentsPropagated, True)
+ layout.addWidget(contentsWidget, 0, 1, Qt.AlignCenter)
+ caption = QLabel("With WA_ContentsPropagated set", label)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 1, Qt.AlignCenter | Qt.AlignTop)
+ elif qt == "4.1":
+ autoFillWidget = createGroupBox(label, fill = True)
+ layout.addWidget(autoFillWidget, 0, 1, Qt.AlignCenter)
+ caption = QLabel("With autoFillBackground set", label)
+ caption.setAutoFillBackground(True)
+ caption.setMargin(2)
+ layout.addWidget(caption, 1, 1, Qt.AlignCenter | Qt.AlignTop)
+
+# if qt == "4.0":
+# noBackgroundWidget = createGroupBox(
+# label, attributes = [Qt.WA_NoBackground], fake = True)
+# layout.addWidget(noBackgroundWidget, 2, 0, Qt.AlignCenter)
+# caption = QLabel("With WA_NoBackground set", label)
+# caption.setWordWrap(True)
+# caption.setMargin(2)
+# layout.addWidget(caption, 3, 0, Qt.AlignCenter | Qt.AlignTop)
+# elif qt == "4.1":
+# opaqueWidget = createGroupBox(
+# label, attributes = [Qt.WA_OpaquePaintEvent], fake = True)
+# layout.addWidget(opaqueWidget, 2, 0, Qt.AlignCenter)
+# caption = QLabel("With WA_OpaquePaintEvent set", label)
+# caption.setAutoFillBackground(True)
+# caption.setMargin(2)
+# layout.addWidget(caption, 3, 0, Qt.AlignCenter | Qt.AlignTop)
+#
+# if qt == "4.0":
+# contentsNoBackgroundWidget = createGroupBox(
+# label, attributes = [Qt.WA_ContentsPropagated, Qt.WA_NoBackground],
+# fake = True)
+# layout.addWidget(contentsNoBackgroundWidget, 2, 1, Qt.AlignCenter)
+# caption = QLabel("With WA_ContentsPropagated and WA_NoBackground set", label)
+# caption.setMargin(2)
+# layout.addWidget(caption, 3, 1, Qt.AlignCenter | Qt.AlignTop)
+# elif qt == "4.1":
+# opaqueAutoFillWidget = createGroupBox(
+# label, attributes = [Qt.WA_OpaquePaintEvent], fill = True, fake = True)
+# layout.addWidget(opaqueAutoFillWidget, 2, 1, Qt.AlignCenter)
+# caption = QLabel("With WA_OpaquePaintEvent and autoFillBackground set", label)
+# caption.setWordWrap(True)
+# caption.setAutoFillBackground(True)
+# caption.setMargin(2)
+# layout.addWidget(caption, 3, 1, Qt.AlignCenter | Qt.AlignTop)
+
+ if qt == "4.0":
+ label.setWindowTitle("Qt 4.0: Painting Standard Qt Widgets")
+ elif qt == "4.1":
+ label.setWindowTitle("Qt 4.1: Painting Standard Qt Widgets")
+
+ label.resize(480, 140)
+ label.show()
+ sys.exit(app.exec_())
diff --git a/doc/src/diagrams/coordinatesystem-line-antialias.sk b/doc/src/diagrams/coordinatesystem-line-antialias.sk
new file mode 100644
index 0000000..323065e
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-line-antialias.sk
@@ -0,0 +1,310 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+r(25,0,0,-25,120.125,734.875)
+lw(1)
+r(25,0,0,-25,120.125,584.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,270.125,734.875)
+lw(1)
+r(25,0,0,-25,270.125,584.875)
+lw(1)
+r(25,0,0,-25,120.125,659.875)
+lw(1)
+r(25,0,0,-25,270.125,659.875)
+lw(1)
+r(25,0,0,-25,120,760)
+lw(1)
+r(25,0,0,-25,120,610)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,270,760)
+lw(1)
+r(25,0,0,-25,270,610)
+lw(1)
+r(25,0,0,-25,120,685)
+lw(1)
+r(25,0,0,-25,270,685)
+lw(1)
+r(25,0,0,-25,120.125,710.125)
+lw(1)
+r(25,0,0,-25,120.125,560.125)
+lw(1)
+r(25,0,0,-25,270.125,710.125)
+lw(1)
+r(25,0,0,-25,270.125,560.125)
+lw(1)
+r(25,0,0,-25,120.125,635.125)
+lw(1)
+r(25,0,0,-25,270.125,635.125)
+lw(1)
+r(25,0,0,-25,195.125,734.875)
+lw(1)
+r(25,0,0,-25,195.125,584.875)
+lw(1)
+r(25,0,0,-25,320.125,734.875)
+lw(1)
+r(25,0,0,-25,320.125,584.875)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,195.125,659.875)
+lw(1)
+r(25,0,0,-25,320.125,659.875)
+lw(1)
+r(25,0,0,-25,195,760)
+lw(1)
+r(25,0,0,-25,195,610)
+lw(1)
+r(25,0,0,-25,320,760)
+lw(1)
+r(25,0,0,-25,320,610)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,195,685)
+lw(1)
+r(25,0,0,-25,320,685)
+lw(1)
+r(25,0,0,-25,195.125,710.125)
+lw(1)
+r(25,0,0,-25,195.125,560.125)
+lw(1)
+r(25,0,0,-25,320.125,710.125)
+lw(1)
+r(25,0,0,-25,320.125,560.125)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,195.125,635.125)
+lw(1)
+r(25,0,0,-25,320.125,635.125)
+lw(1)
+r(25,0,0,-25,145.125,734.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,145.125,584.875)
+lw(1)
+r(25,0,0,-25,145.125,659.875)
+lw(1)
+r(25,0,0,-25,145,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,145,610)
+lw(1)
+r(25,0,0,-25,145,685)
+lw(1)
+r(25,0,0,-25,145.125,710.125)
+lw(1)
+r(25,0,0,-25,145.125,560.125)
+lw(1)
+r(25,0,0,-25,145.125,635.125)
+lw(1)
+r(25,0,0,-25,220.125,734.875)
+lw(1)
+r(25,0,0,-25,220.125,584.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,220.125,659.875)
+lw(1)
+r(25,0,0,-25,220,760)
+lw(1)
+r(25,0,0,-25,220,610)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,220,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,220.125,710.125)
+lw(1)
+r(25,0,0,-25,220.125,560.125)
+lw(1)
+r(25,0,0,-25,220.125,635.125)
+lw(1)
+r(25,0,0,-25,170.125,734.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,170.125,584.875)
+lw(1)
+r(25,0,0,-25,295.125,734.875)
+lw(1)
+r(25,0,0,-25,295.125,584.875)
+lw(1)
+r(25,0,0,-25,170.125,659.875)
+lw(1)
+r(25,0,0,-25,295.125,659.875)
+lw(1)
+r(25,0,0,-25,170,760)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,170,610)
+lw(1)
+r(25,0,0,-25,295,760)
+lw(1)
+r(25,0,0,-25,295,610)
+lw(1)
+r(25,0,0,-25,170,685)
+lw(1)
+r(25,0,0,-25,295,685)
+lw(1)
+r(25,0,0,-25,170.125,710.125)
+lw(1)
+r(25,0,0,-25,170.125,560.125)
+lw(1)
+r(25,0,0,-25,295.125,710.125)
+lw(1)
+r(25,0,0,-25,295.125,560.125)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,170.125,635.125)
+lw(1)
+r(25,0,0,-25,295.125,635.125)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,245.125,734.875)
+lw(1)
+r(25,0,0,-25,245.125,584.875)
+lw(1)
+r(25,0,0,-25,245.125,659.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,245,760)
+lw(1)
+r(25,0,0,-25,245,610)
+lw(1)
+r(25,0,0,-25,245,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,245.125,710.125)
+lw(1)
+r(25,0,0,-25,245.125,560.125)
+lw(1)
+r(25,0,0,-25,245.125,635.125)
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(141.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(105.496,729.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(166,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(105.496,703.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(191,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(105.496,678.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(215,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(105.496,653.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(240.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(105.496,628.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(265,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(105.496,604.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(291,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(105.496,577.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(314,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(105.496,553.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(340.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(105.496,527.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(115.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(105.496,752.445))
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,270.5,735.5)
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,169.5,584.75)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/coordinatesystem-line-raster.sk b/doc/src/diagrams/coordinatesystem-line-raster.sk
new file mode 100644
index 0000000..fe73f5a
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-line-raster.sk
@@ -0,0 +1,301 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+r(25,0,0,-25,120.125,734.875)
+lw(1)
+r(25,0,0,-25,120.125,584.875)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,270.125,734.875)
+lw(1)
+r(25,0,0,-25,270.125,584.875)
+lw(1)
+r(25,0,0,-25,120.125,659.875)
+lw(1)
+r(25,0,0,-25,270.125,659.875)
+lw(1)
+r(25,0,0,-25,120,760)
+lw(1)
+r(25,0,0,-25,120,610)
+lw(1)
+r(25,0,0,-25,270,760)
+lw(1)
+r(25,0,0,-25,270,610)
+lw(1)
+r(25,0,0,-25,120,685)
+lw(1)
+r(25,0,0,-25,270,685)
+lw(1)
+r(25,0,0,-25,120.125,710.125)
+lw(1)
+r(25,0,0,-25,120.125,560.125)
+lw(1)
+r(25,0,0,-25,270.125,710.125)
+lw(1)
+r(25,0,0,-25,270.125,560.125)
+lw(1)
+r(25,0,0,-25,120.125,635.125)
+lw(1)
+r(25,0,0,-25,270.125,635.125)
+lw(1)
+r(25,0,0,-25,195.125,734.875)
+lw(1)
+r(25,0,0,-25,195.125,584.875)
+lw(1)
+r(25,0,0,-25,320.125,734.875)
+lw(1)
+r(25,0,0,-25,320.125,584.875)
+lw(1)
+r(25,0,0,-25,195.125,659.875)
+lw(1)
+r(25,0,0,-25,320.125,659.875)
+lw(1)
+r(25,0,0,-25,195,760)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,195,610)
+lw(1)
+r(25,0,0,-25,320,760)
+lw(1)
+r(25,0,0,-25,320,610)
+lw(1)
+r(25,0,0,-25,195,685)
+lw(1)
+r(25,0,0,-25,320,685)
+lw(1)
+r(25,0,0,-25,195.125,710.125)
+lw(1)
+r(25,0,0,-25,195.125,560.125)
+lw(1)
+r(25,0,0,-25,320.125,710.125)
+lw(1)
+r(25,0,0,-25,320.125,560.125)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,195.125,635.125)
+lw(1)
+r(25,0,0,-25,320.125,635.125)
+lw(1)
+r(25,0,0,-25,145.125,734.875)
+lw(1)
+r(25,0,0,-25,145.125,584.875)
+lw(1)
+r(25,0,0,-25,145.125,659.875)
+lw(1)
+r(25,0,0,-25,145,760)
+lw(1)
+r(25,0,0,-25,145,610)
+lw(1)
+r(25,0,0,-25,145,685)
+lw(1)
+r(25,0,0,-25,145.125,710.125)
+lw(1)
+r(25,0,0,-25,145.125,560.125)
+lw(1)
+r(25,0,0,-25,145.125,635.125)
+lw(1)
+r(25,0,0,-25,220.125,734.875)
+lw(1)
+r(25,0,0,-25,220.125,584.875)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,220.125,659.875)
+lw(1)
+r(25,0,0,-25,220,760)
+lw(1)
+r(25,0,0,-25,220,610)
+lw(1)
+r(25,0,0,-25,220,685)
+lw(1)
+r(25,0,0,-25,220.125,710.125)
+lw(1)
+r(25,0,0,-25,220.125,560.125)
+lw(1)
+r(25,0,0,-25,220.125,635.125)
+lw(1)
+r(25,0,0,-25,170.125,734.875)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,170.125,584.875)
+lw(1)
+r(25,0,0,-25,295.125,734.875)
+lw(1)
+r(25,0,0,-25,295.125,584.875)
+lw(1)
+r(25,0,0,-25,170.125,659.875)
+lw(1)
+r(25,0,0,-25,295.125,659.875)
+lw(1)
+r(25,0,0,-25,170,760)
+lw(1)
+r(25,0,0,-25,170,610)
+lw(1)
+r(25,0,0,-25,295,760)
+lw(1)
+r(25,0,0,-25,295,610)
+lw(1)
+r(25,0,0,-25,170,685)
+lw(1)
+r(25,0,0,-25,295,685)
+lw(1)
+r(25,0,0,-25,170.125,710.125)
+lw(1)
+r(25,0,0,-25,170.125,560.125)
+lw(1)
+r(25,0,0,-25,295.125,710.125)
+lw(1)
+r(25,0,0,-25,295.125,560.125)
+lw(1)
+r(25,0,0,-25,170.125,635.125)
+lw(1)
+r(25,0,0,-25,295.125,635.125)
+lw(1)
+r(25,0,0,-25,245.125,734.875)
+lw(1)
+r(25,0,0,-25,245.125,584.875)
+lw(1)
+r(25,0,0,-25,245.125,659.875)
+lw(1)
+r(25,0,0,-25,245,760)
+lw(1)
+r(25,0,0,-25,245,610)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,245,685)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,245.125,710.125)
+lw(1)
+r(25,0,0,-25,245.125,560.125)
+lw(1)
+r(25,0,0,-25,245.125,635.125)
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(141.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(105.496,729.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(166,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(105.496,703.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(191,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(105.496,678.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(215,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(105.496,653.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(240.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(105.496,628.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(265,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(105.496,604.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(291,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(105.496,577.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(314,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(105.496,553.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(340.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(105.496,527.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(115.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(105.496,752.445))
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,270,736)
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,170.5,585.75)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/coordinatesystem-line.sk b/doc/src/diagrams/coordinatesystem-line.sk
new file mode 100644
index 0000000..24f46c4
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-line.sk
@@ -0,0 +1,297 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+r(25,0,0,-25,120.125,734.875)
+lw(1)
+r(25,0,0,-25,120.125,584.875)
+lw(1)
+r(25,0,0,-25,270.125,734.875)
+lw(1)
+r(25,0,0,-25,270.125,584.875)
+lw(1)
+r(25,0,0,-25,120.125,659.875)
+lw(1)
+r(25,0,0,-25,270.125,659.875)
+fp((0.255,0.517,0.194))
+lw(1)
+r(114.376,169.485,19.5726,-13.2045,152.901,582.485)
+lw(1)
+r(25,0,0,-25,120,760)
+lw(1)
+r(25,0,0,-25,120,610)
+lw(1)
+r(25,0,0,-25,270,760)
+lw(1)
+r(25,0,0,-25,270,610)
+lw(1)
+r(25,0,0,-25,120,685)
+lw(1)
+r(25,0,0,-25,270,685)
+lw(1)
+r(25,0,0,-25,120.125,710.125)
+lw(1)
+r(25,0,0,-25,120.125,560.125)
+lw(1)
+r(25,0,0,-25,270.125,710.125)
+lw(1)
+r(25,0,0,-25,270.125,560.125)
+lw(1)
+r(25,0,0,-25,120.125,635.125)
+lw(1)
+r(25,0,0,-25,270.125,635.125)
+lw(1)
+r(25,0,0,-25,195.125,734.875)
+lw(1)
+r(25,0,0,-25,195.125,584.875)
+lw(1)
+r(25,0,0,-25,320.125,734.875)
+lw(1)
+r(25,0,0,-25,320.125,584.875)
+lw(1)
+r(25,0,0,-25,195.125,659.875)
+lw(1)
+r(25,0,0,-25,320.125,659.875)
+lw(1)
+r(25,0,0,-25,195,760)
+lw(1)
+r(25,0,0,-25,195,610)
+lw(1)
+r(25,0,0,-25,320,760)
+lw(1)
+r(25,0,0,-25,320,610)
+lw(1)
+r(25,0,0,-25,195,685)
+lw(1)
+r(25,0,0,-25,320,685)
+lw(1)
+r(25,0,0,-25,195.125,710.125)
+lw(1)
+r(25,0,0,-25,195.125,560.125)
+lw(1)
+r(25,0,0,-25,320.125,710.125)
+lw(1)
+r(25,0,0,-25,320.125,560.125)
+lw(1)
+r(25,0,0,-25,195.125,635.125)
+lw(1)
+r(25,0,0,-25,320.125,635.125)
+lw(1)
+r(25,0,0,-25,145.125,734.875)
+lw(1)
+r(25,0,0,-25,145.125,584.875)
+lw(1)
+r(25,0,0,-25,145.125,659.875)
+lw(1)
+r(25,0,0,-25,145,760)
+lw(1)
+r(25,0,0,-25,145,610)
+lw(1)
+r(25,0,0,-25,145,685)
+lw(1)
+r(25,0,0,-25,145.125,710.125)
+lw(1)
+r(25,0,0,-25,145.125,560.125)
+lw(1)
+r(25,0,0,-25,145.125,635.125)
+lw(1)
+r(25,0,0,-25,220.125,734.875)
+lw(1)
+r(25,0,0,-25,220.125,584.875)
+lw(1)
+r(25,0,0,-25,220.125,659.875)
+lw(1)
+r(25,0,0,-25,220,760)
+lw(1)
+r(25,0,0,-25,220,610)
+lw(1)
+r(25,0,0,-25,220,685)
+lw(1)
+r(25,0,0,-25,220.125,710.125)
+lw(1)
+r(25,0,0,-25,220.125,560.125)
+lw(1)
+r(25,0,0,-25,220.125,635.125)
+lw(1)
+r(25,0,0,-25,170.125,734.875)
+lw(1)
+r(25,0,0,-25,170.125,584.875)
+lw(1)
+r(25,0,0,-25,295.125,734.875)
+lw(1)
+r(25,0,0,-25,295.125,584.875)
+lw(1)
+r(25,0,0,-25,170.125,659.875)
+lw(1)
+r(25,0,0,-25,295.125,659.875)
+lw(1)
+r(25,0,0,-25,170,760)
+lw(1)
+r(25,0,0,-25,170,610)
+lw(1)
+r(25,0,0,-25,295,760)
+lw(1)
+r(25,0,0,-25,295,610)
+lw(1)
+r(25,0,0,-25,170,685)
+lw(1)
+r(25,0,0,-25,295,685)
+lw(1)
+r(25,0,0,-25,170.125,710.125)
+lw(1)
+r(25,0,0,-25,170.125,560.125)
+lw(1)
+r(25,0,0,-25,295.125,710.125)
+lw(1)
+r(25,0,0,-25,295.125,560.125)
+lw(1)
+r(25,0,0,-25,170.125,635.125)
+lw(1)
+r(25,0,0,-25,295.125,635.125)
+lw(1)
+r(25,0,0,-25,245.125,734.875)
+lw(1)
+r(25,0,0,-25,245.125,584.875)
+lw(1)
+r(25,0,0,-25,245.125,659.875)
+lw(1)
+r(25,0,0,-25,245,760)
+lw(1)
+r(25,0,0,-25,245,610)
+lw(1)
+r(25,0,0,-25,245,685)
+lw(1)
+r(25,0,0,-25,245.125,710.125)
+lw(1)
+r(25,0,0,-25,245.125,560.125)
+lw(1)
+r(25,0,0,-25,245.125,635.125)
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(141.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(105.496,729.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(166,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(105.496,703.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(191,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(105.496,678.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(215,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(105.496,653.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(240.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(105.496,628.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(265,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(105.496,604.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(291,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(105.496,577.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(314,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(105.496,553.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(340.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(105.496,527.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(115.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(105.496,752.445))
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,270.5,735.5)
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,169.5,584.75)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/coordinatesystem-rect-antialias.sk b/doc/src/diagrams/coordinatesystem-rect-antialias.sk
new file mode 100644
index 0000000..30d7a61
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-rect-antialias.sk
@@ -0,0 +1,334 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.73,0.866,0.68))
+lw(1)
+r(25,0,0,-25,120.125,734.875)
+lw(1)
+r(25,0,0,-25,120.125,584.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,270.125,734.875)
+lw(1)
+r(25,0,0,-25,270.125,584.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,120.125,659.875)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,270.125,659.875)
+lw(1)
+r(25,0,0,-25,120,760)
+fp((0.73,0.866,0.68))
+lw(1)
+r(25,0,0,-25,120,610)
+lw(1)
+r(25,0,0,-25,270,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,270,610)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,120,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,270,685)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,120.125,710.125)
+lw(1)
+r(25,0,0,-25,120.125,560.125)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,270.125,710.125)
+lw(1)
+r(25,0,0,-25,270.125,560.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,120.125,635.125)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,270.125,635.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,195.125,734.875)
+lw(1)
+r(25,0,0,-25,195.125,584.875)
+lw(1)
+r(25,0,0,-25,320.125,734.875)
+lw(1)
+r(25,0,0,-25,320.125,584.875)
+lw(1)
+r(25,0,0,-25,195.125,659.875)
+lw(1)
+r(25,0,0,-25,320.125,659.875)
+lw(1)
+r(25,0,0,-25,195,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,195,610)
+lw(1)
+r(25,0,0,-25,320,760)
+lw(1)
+r(25,0,0,-25,320,610)
+lw(1)
+r(25,0,0,-25,195,685)
+lw(1)
+r(25,0,0,-25,320,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,195.125,710.125)
+lw(1)
+r(25,0,0,-25,195.125,560.125)
+lw(1)
+r(25,0,0,-25,320.125,710.125)
+lw(1)
+r(25,0,0,-25,320.125,560.125)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,195.125,635.125)
+lw(1)
+r(25,0,0,-25,320.125,635.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,145.125,734.875)
+lw(1)
+r(25,0,0,-25,145.125,584.875)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,145.125,659.875)
+lw(1)
+r(25,0,0,-25,145,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,145,610)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,145,685)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,145.125,710.125)
+lw(1)
+r(25,0,0,-25,145.125,560.125)
+fp((0.255,0.517,0.194))
+lw(1)
+r(25,0,0,-25,145.125,635.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,220.125,734.875)
+lw(1)
+r(25,0,0,-25,220.125,584.875)
+lw(1)
+r(25,0,0,-25,220.125,659.875)
+lw(1)
+r(25,0,0,-25,220,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,220,610)
+lw(1)
+r(25,0,0,-25,220,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,220.125,710.125)
+lw(1)
+r(25,0,0,-25,220.125,560.125)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,220.125,635.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,170.125,734.875)
+lw(1)
+r(25,0,0,-25,170.125,584.875)
+fp((0.73,0.866,0.68))
+lw(1)
+r(25,0,0,-25,295.125,734.875)
+lw(1)
+r(25,0,0,-25,295.125,584.875)
+lw(1)
+r(25,0,0,-25,170.125,659.875)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,295.125,659.875)
+lw(1)
+r(25,0,0,-25,170,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,170,610)
+lw(1)
+r(25,0,0,-25,295,760)
+fp((0.73,0.866,0.68))
+lw(1)
+r(25,0,0,-25,295,610)
+lw(1)
+r(25,0,0,-25,170,685)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,295,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,170.125,710.125)
+lw(1)
+r(25,0,0,-25,170.125,560.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,295.125,710.125)
+lw(1)
+r(25,0,0,-25,295.125,560.125)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,170.125,635.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,295.125,635.125)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,245.125,734.875)
+lw(1)
+r(25,0,0,-25,245.125,584.875)
+lw(1)
+r(25,0,0,-25,245.125,659.875)
+lw(1)
+r(25,0,0,-25,245,760)
+fp((0.583,0.819,0.374))
+lw(1)
+r(25,0,0,-25,245,610)
+lw(1)
+r(25,0,0,-25,245,685)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,245.125,710.125)
+lw(1)
+r(25,0,0,-25,245.125,560.125)
+fp((0.336,0.691,0.26))
+lw(1)
+r(25,0,0,-25,245.125,635.125)
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(141.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(105.496,729.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(166,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(105.496,703.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(191,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(105.496,678.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(215,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(105.496,653.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(240.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(105.496,628.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(265,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(105.496,604.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(291,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(105.496,577.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(314,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(105.496,553.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(340.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(105.496,527.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(115.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(105.496,752.445))
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,295,610)
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,144.5,709.75)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/coordinatesystem-rect-raster.sk b/doc/src/diagrams/coordinatesystem-rect-raster.sk
new file mode 100644
index 0000000..7de01af
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-rect-raster.sk
@@ -0,0 +1,314 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+r(25,0,0,-25,120.125,734.875)
+lw(1)
+r(25,0,0,-25,120.125,584.875)
+lw(1)
+r(25,0,0,-25,270.125,734.875)
+lw(1)
+r(25,0,0,-25,270.125,584.875)
+lw(1)
+r(25,0,0,-25,120.125,659.875)
+lw(1)
+r(25,0,0,-25,270.125,659.875)
+lw(1)
+r(25,0,0,-25,120,760)
+lw(1)
+r(25,0,0,-25,120,610)
+lw(1)
+r(25,0,0,-25,270,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,270,610)
+lw(1)
+r(25,0,0,-25,120,685)
+lw(1)
+r(25,0,0,-25,270,685)
+lw(1)
+r(25,0,0,-25,120.125,710.125)
+lw(1)
+r(25,0,0,-25,120.125,560.125)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,270.125,710.125)
+lw(1)
+r(25,0,0,-25,270.125,560.125)
+lw(1)
+r(25,0,0,-25,120.125,635.125)
+lw(1)
+r(25,0,0,-25,270.125,635.125)
+lw(1)
+r(25,0,0,-25,195.125,734.875)
+lw(1)
+r(25,0,0,-25,195.125,584.875)
+lw(1)
+r(25,0,0,-25,320.125,734.875)
+lw(1)
+r(25,0,0,-25,320.125,584.875)
+lw(1)
+r(25,0,0,-25,195.125,659.875)
+lw(1)
+r(25,0,0,-25,320.125,659.875)
+lw(1)
+r(25,0,0,-25,195,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,195,610)
+lw(1)
+r(25,0,0,-25,320,760)
+lw(1)
+r(25,0,0,-25,320,610)
+lw(1)
+r(25,0,0,-25,195,685)
+lw(1)
+r(25,0,0,-25,320,685)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,195.125,710.125)
+lw(1)
+r(25,0,0,-25,195.125,560.125)
+lw(1)
+r(25,0,0,-25,320.125,710.125)
+lw(1)
+r(25,0,0,-25,320.125,560.125)
+lw(1)
+r(25,0,0,-25,195.125,635.125)
+lw(1)
+r(25,0,0,-25,320.125,635.125)
+lw(1)
+r(25,0,0,-25,145.125,734.875)
+lw(1)
+r(25,0,0,-25,145.125,584.875)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,145.125,659.875)
+lw(1)
+r(25,0,0,-25,145,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,145,610)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,145,685)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,145.125,710.125)
+lw(1)
+r(25,0,0,-25,145.125,560.125)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,145.125,635.125)
+lw(1)
+r(25,0,0,-25,220.125,734.875)
+lw(1)
+r(25,0,0,-25,220.125,584.875)
+lw(1)
+r(25,0,0,-25,220.125,659.875)
+lw(1)
+r(25,0,0,-25,220,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,220,610)
+lw(1)
+r(25,0,0,-25,220,685)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,220.125,710.125)
+lw(1)
+r(25,0,0,-25,220.125,560.125)
+lw(1)
+r(25,0,0,-25,220.125,635.125)
+lw(1)
+r(25,0,0,-25,170.125,734.875)
+lw(1)
+r(25,0,0,-25,170.125,584.875)
+lw(1)
+r(25,0,0,-25,295.125,734.875)
+lw(1)
+r(25,0,0,-25,295.125,584.875)
+lw(1)
+r(25,0,0,-25,170.125,659.875)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,295.125,659.875)
+lw(1)
+r(25,0,0,-25,170,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,170,610)
+lw(1)
+r(25,0,0,-25,295,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,295,610)
+lw(1)
+r(25,0,0,-25,170,685)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,295,685)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,170.125,710.125)
+lw(1)
+r(25,0,0,-25,170.125,560.125)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,295.125,710.125)
+lw(1)
+r(25,0,0,-25,295.125,560.125)
+lw(1)
+r(25,0,0,-25,170.125,635.125)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,295.125,635.125)
+lw(1)
+r(25,0,0,-25,245.125,734.875)
+lw(1)
+r(25,0,0,-25,245.125,584.875)
+lw(1)
+r(25,0,0,-25,245.125,659.875)
+lw(1)
+r(25,0,0,-25,245,760)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,245,610)
+lw(1)
+r(25,0,0,-25,245,685)
+fp((0.34,0.564,0.196))
+lw(1)
+r(25,0,0,-25,245.125,710.125)
+lw(1)
+r(25,0,0,-25,245.125,560.125)
+lw(1)
+r(25,0,0,-25,245.125,635.125)
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(141.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(105.496,729.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(166,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(105.496,703.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(191,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(105.496,678.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(215,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(105.496,653.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(240.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(105.496,628.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(265,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(105.496,604.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(291,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(105.496,577.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(314,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(105.496,553.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(340.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(105.496,527.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(115.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(105.496,752.445))
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,145,710)
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,294.75,610)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/coordinatesystem-rect.sk b/doc/src/diagrams/coordinatesystem-rect.sk
new file mode 100644
index 0000000..2b95f64
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-rect.sk
@@ -0,0 +1,305 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.371,0.57,0.195))
+lw(1)
+r(174.5,0,0,-125.5,133.138,722.445)
+phs((0.216,0.403,0.141),(0.371,0.569,0.195),1,0,2,0.5)
+fp()
+lw(1)
+r(150,0,0,-100,145.138,709.945)
+phs((0.216,0.403,0.141),(0.991,1,0.991),1,0,2,0.5)
+fp()
+lw(1)
+r(127,0,0,-79.5,155.638,699.945)
+lw(1)
+r(25,0,0,-25,120.125,734.875)
+lw(1)
+r(25,0,0,-25,120.125,584.875)
+lw(1)
+r(25,0,0,-25,270.125,734.875)
+lw(1)
+r(25,0,0,-25,270.125,584.875)
+lw(1)
+r(25,0,0,-25,120.125,659.875)
+lw(1)
+r(25,0,0,-25,270.125,659.875)
+lw(1)
+r(25,0,0,-25,120,760)
+lw(1)
+r(25,0,0,-25,120,610)
+lw(1)
+r(25,0,0,-25,270,760)
+lw(1)
+r(25,0,0,-25,270,610)
+lw(1)
+r(25,0,0,-25,120,685)
+lw(1)
+r(25,0,0,-25,270,685)
+lw(1)
+r(25,0,0,-25,120.125,710.125)
+lw(1)
+r(25,0,0,-25,120.125,560.125)
+lw(1)
+r(25,0,0,-25,270.125,710.125)
+lw(1)
+r(25,0,0,-25,270.125,560.125)
+lw(1)
+r(25,0,0,-25,120.125,635.125)
+lw(1)
+r(25,0,0,-25,270.125,635.125)
+lw(1)
+r(25,0,0,-25,195.125,734.875)
+lw(1)
+r(25,0,0,-25,195.125,584.875)
+lw(1)
+r(25,0,0,-25,320.125,734.875)
+lw(1)
+r(25,0,0,-25,320.125,584.875)
+lw(1)
+r(25,0,0,-25,195.125,659.875)
+lw(1)
+r(25,0,0,-25,320.125,659.875)
+lw(1)
+r(25,0,0,-25,195,760)
+lw(1)
+r(25,0,0,-25,195,610)
+lw(1)
+r(25,0,0,-25,320,760)
+lw(1)
+r(25,0,0,-25,320,610)
+lw(1)
+r(25,0,0,-25,195,685)
+lw(1)
+r(25,0,0,-25,320,685)
+lw(1)
+r(25,0,0,-25,195.125,710.125)
+lw(1)
+r(25,0,0,-25,195.125,560.125)
+lw(1)
+r(25,0,0,-25,320.125,710.125)
+lw(1)
+r(25,0,0,-25,320.125,560.125)
+lw(1)
+r(25,0,0,-25,195.125,635.125)
+lw(1)
+r(25,0,0,-25,320.125,635.125)
+lw(1)
+r(25,0,0,-25,145.125,734.875)
+lw(1)
+r(25,0,0,-25,145.125,584.875)
+lw(1)
+r(25,0,0,-25,145.125,659.875)
+lw(1)
+r(25,0,0,-25,145,760)
+lw(1)
+r(25,0,0,-25,145,610)
+lw(1)
+r(25,0,0,-25,145,685)
+lw(1)
+r(25,0,0,-25,145.125,710.125)
+lw(1)
+r(25,0,0,-25,145.125,560.125)
+lw(1)
+r(25,0,0,-25,145.125,635.125)
+lw(1)
+r(25,0,0,-25,220.125,734.875)
+lw(1)
+r(25,0,0,-25,220.125,584.875)
+lw(1)
+r(25,0,0,-25,220.125,659.875)
+lw(1)
+r(25,0,0,-25,220,760)
+lw(1)
+r(25,0,0,-25,220,610)
+lw(1)
+r(25,0,0,-25,220,685)
+lw(1)
+r(25,0,0,-25,220.125,710.125)
+lw(1)
+r(25,0,0,-25,220.125,560.125)
+lw(1)
+r(25,0,0,-25,220.125,635.125)
+lw(1)
+r(25,0,0,-25,170.125,734.875)
+lw(1)
+r(25,0,0,-25,170.125,584.875)
+lw(1)
+r(25,0,0,-25,295.125,734.875)
+lw(1)
+r(25,0,0,-25,295.125,584.875)
+lw(1)
+r(25,0,0,-25,170.125,659.875)
+lw(1)
+r(25,0,0,-25,295.125,659.875)
+lw(1)
+r(25,0,0,-25,170,760)
+lw(1)
+r(25,0,0,-25,170,610)
+lw(1)
+r(25,0,0,-25,295,760)
+lw(1)
+r(25,0,0,-25,295,610)
+lw(1)
+r(25,0,0,-25,170,685)
+lw(1)
+r(25,0,0,-25,295,685)
+lw(1)
+r(25,0,0,-25,170.125,710.125)
+lw(1)
+r(25,0,0,-25,170.125,560.125)
+lw(1)
+r(25,0,0,-25,295.125,710.125)
+lw(1)
+r(25,0,0,-25,295.125,560.125)
+lw(1)
+r(25,0,0,-25,170.125,635.125)
+lw(1)
+r(25,0,0,-25,295.125,635.125)
+lw(1)
+r(25,0,0,-25,245.125,734.875)
+lw(1)
+r(25,0,0,-25,245.125,584.875)
+lw(1)
+r(25,0,0,-25,245.125,659.875)
+lw(1)
+r(25,0,0,-25,245,760)
+lw(1)
+r(25,0,0,-25,245,610)
+lw(1)
+r(25,0,0,-25,245,685)
+lw(1)
+r(25,0,0,-25,245.125,710.125)
+lw(1)
+r(25,0,0,-25,245.125,560.125)
+lw(1)
+r(25,0,0,-25,245.125,635.125)
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(141.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('1 ',(105.496,729.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(166,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('2',(105.496,703.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(191,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('3',(105.496,678.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(215,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('4',(105.496,653.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(240.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('5',(105.496,628.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(265,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('6',(105.496,604.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(291,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('7',(105.496,577.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(314,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('8',(105.496,553.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(340.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('9',(105.496,527.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(115.5,766.794))
+fp((0,0,0))
+le()
+lw(1)
+Fn('NimbusSanL-Bold')
+Fs(14)
+txt('0',(105.496,752.445))
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,145,710)
+fp((0.631,0.207,0.072))
+lw(1)
+e(5,0,0,-5,294.75,610)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/coordinatesystem-transformations.sk b/doc/src/diagrams/coordinatesystem-transformations.sk
new file mode 100644
index 0000000..cdadf10
--- /dev/null
+++ b/doc/src/diagrams/coordinatesystem-transformations.sk
@@ -0,0 +1,121 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+ld((4, 4))
+r(54,0,0,-54,47.6378,695.445)
+lw(1)
+ld((4, 4))
+r(54,0,0,-54,287.138,692.945)
+lw(1)
+ld((4, 4))
+r(54,0,0,-54,507.638,691.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('World Coordinates',(11.6378,604.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('"Window" Coordinates',(236.638,604.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('Device Coordinates',(477.638,605.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('(logical)',(36.6378,588.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('transformation matrix',(85.6378,522.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('window-viewport conversion',(303.138,522.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('(physical)',(505.138,589.945))
+fp((0.346,0.523,0.281))
+lw(1)
+b()
+bs(151.638,704.445,0)
+bs(152.138,658.945,0)
+bs(185.638,658.945,0)
+bs(186.138,636.445,0)
+bs(218.638,680.945,0)
+bs(185.638,726.445,0)
+bs(185.638,705.445,0)
+bs(151.638,705.445,0)
+fp((0.346,0.523,0.281))
+lw(1)
+b()
+bs(381.638,704.445,0)
+bs(382.138,658.945,0)
+bs(415.638,658.945,0)
+bs(416.138,636.445,0)
+bs(448.638,680.945,0)
+bs(415.638,726.445,0)
+bs(415.638,705.445,0)
+bs(381.638,705.445,0)
+gl([(0,(0.705,0.623,0.285)),(0.39,(0.664,0.587,0.267)),(1,(0.987,0.995,1))])
+pgc(0.5,0.5,1,0)
+fp()
+lw(1)
+e(24,0,0,-24,313.638,665.945)
+gl([(0,(0.705,0.623,0.285)),(0.39,(0.664,0.587,0.267)),(1,(0.987,0.995,1))])
+pgc(0.5,0.5,1,0)
+fp()
+lw(1)
+e(24,0,0,-24,534.138,664.945)
+gl([(0,(0.705,0.623,0.285)),(0.39,(0.664,0.587,0.267)),(1,(0.987,0.995,1))])
+pgc(0.5,0.5,1,0)
+fp()
+lw(1)
+e(24,0,0,-24,47.6378,696.945)
+fp((0.346,0.523,0.281))
+lw(1)
+e(2.25,0,0,-2.25,47.8878,696.695)
+fp((0.346,0.523,0.281))
+lw(1)
+e(2.25,0,0,-2.25,314.388,666.695)
+fp((0.346,0.523,0.281))
+lw(1)
+e(2.25,0,0,-2.25,534.888,664.195)
+lp((0.624,0.168,0.168))
+lw(1)
+b()
+bs(183.638,680.945,0)
+bc(183.638,680.945,249.138,604.945,139.138,541.945,2)
+lp((0.651,0.201,0.087))
+lw(1)
+b()
+bs(417.638,678.445,0)
+bc(417.638,678.445,483.138,602.445,373.138,539.445,2)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('(0,0)',(36.6378,702.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('(50,50)',(272.638,671.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('(296, 296)',(478.638,670.445))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/customcompleter-example.png b/doc/src/diagrams/customcompleter-example.png
new file mode 100644
index 0000000..a525208
--- /dev/null
+++ b/doc/src/diagrams/customcompleter-example.png
Binary files differ
diff --git a/doc/src/diagrams/customcompleter-example.zip b/doc/src/diagrams/customcompleter-example.zip
new file mode 100644
index 0000000..fead6c4
--- /dev/null
+++ b/doc/src/diagrams/customcompleter-example.zip
Binary files differ
diff --git a/doc/src/diagrams/customwidgetplugin-example.png b/doc/src/diagrams/customwidgetplugin-example.png
new file mode 100644
index 0000000..f208569
--- /dev/null
+++ b/doc/src/diagrams/customwidgetplugin-example.png
Binary files differ
diff --git a/doc/src/diagrams/datetimewidgets.ui b/doc/src/diagrams/datetimewidgets.ui
new file mode 100644
index 0000000..27e4637
--- /dev/null
+++ b/doc/src/diagrams/datetimewidgets.ui
@@ -0,0 +1,116 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>DateTimeWidgetsForm</class>
+ <widget class="QWidget" name="DateTimeWidgetsForm" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>328</width>
+ <height>105</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Date Time Widgets</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="font" >
+ <font>
+ <family>Bitstream Vera Sans</family>
+ <pointsize>9</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>QDateTimeEdit</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="font" >
+ <font>
+ <family>Bitstream Vera Sans</family>
+ <pointsize>9</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>QDateEdit</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="font" >
+ <font>
+ <family>Bitstream Vera Sans</family>
+ <pointsize>9</pointsize>
+ <weight>75</weight>
+ <italic>false</italic>
+ <bold>true</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>QTimeEdit</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QDateTimeEdit" name="dateTimeEdit" >
+ <property name="displayFormat" >
+ <string>MMM d, yyyy hh:mm:ss</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QTimeEdit" name="timeEdit" >
+ <property name="time" >
+ <time>
+ <hour>1</hour>
+ <minute>45</minute>
+ <second>2</second>
+ </time>
+ </property>
+ <property name="displayFormat" >
+ <string>hh:mm:ss</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QDateEdit" name="dateEdit" >
+ <property name="time" >
+ <time>
+ <hour>13</hour>
+ <minute>45</minute>
+ <second>2</second>
+ </time>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/doc/src/diagrams/datetimewidgets.zip b/doc/src/diagrams/datetimewidgets.zip
new file mode 100644
index 0000000..84fd561
--- /dev/null
+++ b/doc/src/diagrams/datetimewidgets.zip
Binary files differ
diff --git a/doc/src/diagrams/dbus-chat-example.png b/doc/src/diagrams/dbus-chat-example.png
new file mode 100644
index 0000000..96a878e
--- /dev/null
+++ b/doc/src/diagrams/dbus-chat-example.png
Binary files differ
diff --git a/doc/src/diagrams/dependencies.lout b/doc/src/diagrams/dependencies.lout
new file mode 100644
index 0000000..d20f4f1
--- /dev/null
+++ b/doc/src/diagrams/dependencies.lout
@@ -0,0 +1,106 @@
+@SysInclude { picture }
+@SysInclude { tbl }
+@SysInclude { diag }
+# lout -EPS dependencies.lout > dependencies.eps
+macro @TTGreenColour { {cmyk 0.40 0.00 1.00 0.01} }
+macro @TTPurpleColour { {cmyk 0.39 0.39 0.00 0.00} }
+macro @DefaultColour { rgb { 0.961 0.961 0.863 } }
+macro @FreetypeColour { rgb { 0.902 0.902 0.980 } }
+macro @GLColour { rgb { 1.000 0.753 0.796 } }
+macro @PthreadColour { rgb { 0.741 0.718 0.420 } }
+macro @OptionalColour { rgb { 0.792 0.882 1.000 } }
+macro @SMColour { rgb { 0.761 0.980 0.980 } }
+macro @MiscColour { rgb { 0.941 0.973 1.000 } }
+macro @GlibColour { rgb { 0.7 0.7 0.7 } }
+@Illustration
+ @InitialFont { Helvetica Base 14p }
+{
+@Centre @Diag
+ outline { shadowbox }
+ shadow { 0.15f }
+ margin { 0.5f }
+ hsize { 5f }
+ paint { @MiscColour }
+ arrowwidth { 0.55f }
+ arrowlength { 0.55f }
+ pathwidth { medium }
+ zindent { 0.1f }
+ radius { 0.5f }
+ #
+ bmargin { 0.5f }
+ boutlinestyle { noline }
+ #
+ coutlinestyle { noline }
+ cmargin { 0.5f }
+{
+@Tbl
+# rule { yes } rulecolour { red }
+ indent { ctr }
+ iv { ctr }
+ marginvertical { 1.25f }
+ div { top }
+# fmarginbelow { 0c }
+
+ aformat { @Cell A | @Cell B | @Cell marginbelow { 0c } font { +2p } C | @Cell D | @Cell E }
+ bformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
+ cformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell marginleft { 1.5c } E | @Cell F }
+ dformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
+ eformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
+ fformat { @Cell A | @Cell B | @Cell C | @Cell D | @Cell E | @Cell F }
+ gformat { @Cell A | @Cell B | @Cell C | @Cell D | @StartHSpan @Cell E | @HSpan }
+{
+ @Rowa C { Qt"/"X11 library dependencies }
+ @Rowb C { QTGUI:: @Node paint { @TTGreenColour } QtGui }
+ @Rowc B { XCURSOR:: @Node paint { @OptionalColour } Xcursor }
+ C { XRANDR:: @Node paint { @OptionalColour } Xrandr }
+ D { XINERAMA:: @Node paint { @OptionalColour } Xinerama }
+ E { Xi:: @Node paint { @OptionalColour } Xi }
+ @Rowd C { XRENDER:: @Node paint { @OptionalColour } XRender }
+ F { Xt:: @Node paint { @DefaultColour } Xt* }
+ @Rowe A { QTCORE:: @Node paint { @TTPurpleColour } QtCore }
+ C { XFIXES:: @Node paint { @OptionalColour } Xfixes }
+ D { XEXT:: @Node paint { @DefaultColour } Xext }
+ F { SM:: @Node paint { @SMColour } SM }
+ @Rowf A { PTHREAD:: @Node paint { @PthreadColour } pthread }
+ B { GLIB:: @Node paint { @GlibColour } Glib }
+ D { X:: @Node paint { @DefaultColour } X11 }
+ F { ICE:: @Node paint { @SMColour } ICE }
+ @Rowg E {
+ @Tbl
+ font { -2p }
+ margin { 0.15f }
+ cmarginabove { 0c }
+ iv { top }
+ bformat { @Cell A | @Cell B | @Cell C }
+ cformat { @Cell A | @Cell B | @Cell C }
+ aformat { @StartHSpan @Cell A | @HSpan | @HSpan }
+ {
+ @Rowb A { C:: @BNode {} } B { D:: @BNode {} }
+ C { some configurations only }
+ @Rowb B { * } C { Xt intrinsics only }
+ }
+ }
+}
+//
+@VHVCurveArrow from { QTGUI } to { XINERAMA } pathstyle { dotted }
+@VHVCurveArrow from { QTGUI } to { Xi } pathstyle { dotted }
+@HVCurveArrow from { QTGUI } to { QTCORE }
+@Arrow from { QTCORE } to { PTHREAD }
+@VHVCurveArrow from { QTCORE } to { GLIB } pathstyle { dotted }
+@HVCurveArrow from { QTGUI } to { Xt }
+@Arrow from { QTGUI } to { XRANDR } pathstyle { dotted }
+@VHVCurveArrow from { QTGUI } to { XCURSOR } pathstyle { dotted }
+@Arrow from { XRANDR } to { XRENDER }
+@Arrow from { XINERAMA } to { XEXT }
+@VHCurveArrow from { XCURSOR } to { XRENDER }
+@HVCurveArrow from { XRENDER } to { XEXT }
+@HVHCurveArrow from { Xi } to { XEXT }
+@Arrow from { Xt } to { SM }
+@HVHCurveArrow from { Xt } to { X }
+@Arrow from { SM } to { ICE }
+@Arrow from { XEXT } to { X }
+@VHCurveArrow from { XCURSOR } to { XFIXES }
+@VHVCurveArrow from { XFIXES } to { X }
+@Link from { C@W } to { D@E } pathstyle { dotted }
+}
+}
diff --git a/doc/src/diagrams/designer-adding-actions.txt b/doc/src/diagrams/designer-adding-actions.txt
new file mode 100644
index 0000000..4124ecc
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-actions.txt
@@ -0,0 +1,15 @@
+# Cropping and fading the Qt Designer action images.
+
+cropimage.py designer-adding-menu-action1.png designer-adding-menu-action1-crop.png left 57
+cropimage.py designer-adding-menu-action1-crop.png designer-adding-menu-action1-crop.png top 41
+cropimage.py designer-adding-menu-action1-crop.png designer-adding-menu-action1-crop.png right -180
+cropimage.py designer-adding-menu-action1-crop.png designer-adding-menu-action1-crop.png bottom -124
+fadeedges.py designer-adding-menu-action1-crop.png ../images/designer-adding-menu-action.png right,bottom 16
+rm designer-adding-menu-action1-crop.png
+
+cropimage.py designer-adding-toolbar-action1.png designer-adding-toolbar-action1-crop.png left 57
+cropimage.py designer-adding-toolbar-action1-crop.png designer-adding-toolbar-action1-crop.png top 41
+cropimage.py designer-adding-toolbar-action1-crop.png designer-adding-toolbar-action1-crop.png right -144
+cropimage.py designer-adding-toolbar-action1-crop.png designer-adding-toolbar-action1-crop.png bottom -124
+fadeedges.py designer-adding-toolbar-action1-crop.png ../images/designer-adding-toolbar-action.png right,bottom 16
+rm designer-adding-toolbar-action1-crop.png
diff --git a/doc/src/diagrams/designer-adding-dockwidget.txt b/doc/src/diagrams/designer-adding-dockwidget.txt
new file mode 100644
index 0000000..97b4beb
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-dockwidget.txt
@@ -0,0 +1,8 @@
+# Cropping and fading the Qt Designer dock widget images.
+
+cropimage.py designer-adding-dockwidget1.png designer-adding-dockwidget1-crop.png left 11
+cropimage.py designer-adding-dockwidget1-crop.png designer-adding-dockwidget1-crop.png top 6
+cropimage.py designer-adding-dockwidget1-crop.png designer-adding-dockwidget1-crop.png right -201
+cropimage.py designer-adding-dockwidget1-crop.png designer-adding-dockwidget1-crop.png bottom -236
+fadeedges.py designer-adding-dockwidget1-crop.png ../images/designer-adding-dockwidget.png right,bottom 16
+rm designer-adding-dockwidget1-crop.png
diff --git a/doc/src/diagrams/designer-adding-dockwidget1.png b/doc/src/diagrams/designer-adding-dockwidget1.png
new file mode 100644
index 0000000..960da83
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-dockwidget1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-dockwidget1.zip b/doc/src/diagrams/designer-adding-dockwidget1.zip
new file mode 100644
index 0000000..0492df6
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-dockwidget1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-dynamic-property.png b/doc/src/diagrams/designer-adding-dynamic-property.png
new file mode 100644
index 0000000..8e81dd9
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-dynamic-property.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-menu-action1.png b/doc/src/diagrams/designer-adding-menu-action1.png
new file mode 100644
index 0000000..cde92d9
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-menu-action1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-menu-action1.zip b/doc/src/diagrams/designer-adding-menu-action1.zip
new file mode 100644
index 0000000..08395eb
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-menu-action1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-menu-action2.zip b/doc/src/diagrams/designer-adding-menu-action2.zip
new file mode 100644
index 0000000..ca1a5b3
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-menu-action2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-toolbar-action1.png b/doc/src/diagrams/designer-adding-toolbar-action1.png
new file mode 100644
index 0000000..6b82373
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-toolbar-action1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-toolbar-action1.zip b/doc/src/diagrams/designer-adding-toolbar-action1.zip
new file mode 100644
index 0000000..e673b3c
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-toolbar-action1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-adding-toolbar-action2.zip b/doc/src/diagrams/designer-adding-toolbar-action2.zip
new file mode 100644
index 0000000..96a9d69
--- /dev/null
+++ b/doc/src/diagrams/designer-adding-toolbar-action2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-dynamic-property.png b/doc/src/diagrams/designer-creating-dynamic-property.png
new file mode 100644
index 0000000..1c3d3ca
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-dynamic-property.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry1.png b/doc/src/diagrams/designer-creating-menu-entry1.png
new file mode 100644
index 0000000..33aa0d6
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry1.zip b/doc/src/diagrams/designer-creating-menu-entry1.zip
new file mode 100644
index 0000000..f9e64c8
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry2.png b/doc/src/diagrams/designer-creating-menu-entry2.png
new file mode 100644
index 0000000..8338d08
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry2.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry2.zip b/doc/src/diagrams/designer-creating-menu-entry2.zip
new file mode 100644
index 0000000..67d81e4
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry3.png b/doc/src/diagrams/designer-creating-menu-entry3.png
new file mode 100644
index 0000000..d242646
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry3.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry3.zip b/doc/src/diagrams/designer-creating-menu-entry3.zip
new file mode 100644
index 0000000..d530186
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry3.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry4.png b/doc/src/diagrams/designer-creating-menu-entry4.png
new file mode 100644
index 0000000..07a49ba
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry4.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu-entry4.zip b/doc/src/diagrams/designer-creating-menu-entry4.zip
new file mode 100644
index 0000000..d800c31
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu-entry4.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu.txt b/doc/src/diagrams/designer-creating-menu.txt
new file mode 100644
index 0000000..b5b2934
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu.txt
@@ -0,0 +1,49 @@
+# Cropping and fading the Qt Designer menu creation images.
+
+cropimage.py designer-creating-menu1.png designer-creating-menu1-crop.png bottom -100
+cropimage.py designer-creating-menu1-crop.png designer-creating-menu1-crop.png right -120
+fadeedges.py designer-creating-menu1-crop.png ../images/designer-creating-menu1.png right,bottom 16
+rm designer-creating-menu1-crop.png
+
+cropimage.py designer-creating-menu2.png designer-creating-menu2-crop.png bottom -100
+cropimage.py designer-creating-menu2-crop.png designer-creating-menu2-crop.png right -120
+fadeedges.py designer-creating-menu2-crop.png ../images/designer-creating-menu2.png right,bottom 16
+rm designer-creating-menu2-crop.png
+
+cropimage.py designer-creating-menu3.png designer-creating-menu3-crop.png bottom -100
+cropimage.py designer-creating-menu3-crop.png designer-creating-menu3-crop.png right -120
+fadeedges.py designer-creating-menu3-crop.png ../images/designer-creating-menu3.png right,bottom 16
+rm designer-creating-menu3-crop.png
+
+cropimage.py designer-creating-menu4.png designer-creating-menu4-crop.png bottom -100
+cropimage.py designer-creating-menu4-crop.png designer-creating-menu4-crop.png right -120
+fadeedges.py designer-creating-menu4-crop.png ../images/designer-creating-menu4.png right,bottom 16
+rm designer-creating-menu4-crop.png
+
+cropimage.py designer-creating-menu-entry1.png designer-creating-menu-entry1-crop.png left 54
+cropimage.py designer-creating-menu-entry1-crop.png designer-creating-menu-entry1-crop.png top 45
+cropimage.py designer-creating-menu-entry1-crop.png designer-creating-menu-entry1-crop.png right -160
+cropimage.py designer-creating-menu-entry1-crop.png designer-creating-menu-entry1-crop.png bottom -144
+fadeedges.py designer-creating-menu-entry1-crop.png ../images/designer-creating-menu-entry1.png right,bottom 16
+rm designer-creating-menu-entry1-crop.png
+
+cropimage.py designer-creating-menu-entry2.png designer-creating-menu-entry2-crop.png left 54
+cropimage.py designer-creating-menu-entry2-crop.png designer-creating-menu-entry2-crop.png top 45
+cropimage.py designer-creating-menu-entry2-crop.png designer-creating-menu-entry2-crop.png right -160
+cropimage.py designer-creating-menu-entry2-crop.png designer-creating-menu-entry2-crop.png bottom -144
+fadeedges.py designer-creating-menu-entry2-crop.png ../images/designer-creating-menu-entry2.png right,bottom 16
+rm designer-creating-menu-entry2-crop.png
+
+cropimage.py designer-creating-menu-entry3.png designer-creating-menu-entry3-crop.png left 54
+cropimage.py designer-creating-menu-entry3-crop.png designer-creating-menu-entry3-crop.png top 45
+cropimage.py designer-creating-menu-entry3-crop.png designer-creating-menu-entry3-crop.png right -160
+cropimage.py designer-creating-menu-entry3-crop.png designer-creating-menu-entry3-crop.png bottom -144
+fadeedges.py designer-creating-menu-entry3-crop.png ../images/designer-creating-menu-entry3.png right,bottom 16
+rm designer-creating-menu-entry3-crop.png
+
+cropimage.py designer-creating-menu-entry4.png designer-creating-menu-entry4-crop.png left 54
+cropimage.py designer-creating-menu-entry4-crop.png designer-creating-menu-entry4-crop.png top 45
+cropimage.py designer-creating-menu-entry4-crop.png designer-creating-menu-entry4-crop.png right -160
+cropimage.py designer-creating-menu-entry4-crop.png designer-creating-menu-entry4-crop.png bottom -144
+fadeedges.py designer-creating-menu-entry4-crop.png ../images/designer-creating-menu-entry4.png right,bottom 16
+rm designer-creating-menu-entry4-crop.png
diff --git a/doc/src/diagrams/designer-creating-menu1.png b/doc/src/diagrams/designer-creating-menu1.png
new file mode 100644
index 0000000..d92a88a
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu1.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu1.zip b/doc/src/diagrams/designer-creating-menu1.zip
new file mode 100644
index 0000000..780b1ac
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu1.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu2.png b/doc/src/diagrams/designer-creating-menu2.png
new file mode 100644
index 0000000..7be4891
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu2.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu2.zip b/doc/src/diagrams/designer-creating-menu2.zip
new file mode 100644
index 0000000..00664a6
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu2.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu3.png b/doc/src/diagrams/designer-creating-menu3.png
new file mode 100644
index 0000000..c2f1beb
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu3.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu3.zip b/doc/src/diagrams/designer-creating-menu3.zip
new file mode 100644
index 0000000..76ecbe0
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu3.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menu4.png b/doc/src/diagrams/designer-creating-menu4.png
new file mode 100644
index 0000000..3a3ab54
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menu4.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menubar.png b/doc/src/diagrams/designer-creating-menubar.png
new file mode 100644
index 0000000..e8078e0
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menubar.png
Binary files differ
diff --git a/doc/src/diagrams/designer-creating-menubar.zip b/doc/src/diagrams/designer-creating-menubar.zip
new file mode 100644
index 0000000..bddbf0e
--- /dev/null
+++ b/doc/src/diagrams/designer-creating-menubar.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-edit-resource.zip b/doc/src/diagrams/designer-edit-resource.zip
new file mode 100644
index 0000000..dc43d9e
--- /dev/null
+++ b/doc/src/diagrams/designer-edit-resource.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-find-icon.zip b/doc/src/diagrams/designer-find-icon.zip
new file mode 100644
index 0000000..e94abd9
--- /dev/null
+++ b/doc/src/diagrams/designer-find-icon.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-form-layoutfunction-crop.png b/doc/src/diagrams/designer-form-layoutfunction-crop.png
new file mode 100644
index 0000000..e8dd39f
--- /dev/null
+++ b/doc/src/diagrams/designer-form-layoutfunction-crop.png
Binary files differ
diff --git a/doc/src/diagrams/designer-form-layoutfunction.png b/doc/src/diagrams/designer-form-layoutfunction.png
new file mode 100644
index 0000000..9101e89
--- /dev/null
+++ b/doc/src/diagrams/designer-form-layoutfunction.png
Binary files differ
diff --git a/doc/src/diagrams/designer-form-layoutfunction.zip b/doc/src/diagrams/designer-form-layoutfunction.zip
new file mode 100644
index 0000000..fcce637
--- /dev/null
+++ b/doc/src/diagrams/designer-form-layoutfunction.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-main-window.zip b/doc/src/diagrams/designer-main-window.zip
new file mode 100644
index 0000000..69b7ee6
--- /dev/null
+++ b/doc/src/diagrams/designer-main-window.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-mainwindow-actions.ui b/doc/src/diagrams/designer-mainwindow-actions.ui
new file mode 100644
index 0000000..593a2de
--- /dev/null
+++ b/doc/src/diagrams/designer-mainwindow-actions.ui
@@ -0,0 +1,88 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>497</width>
+ <height>347</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralWidget" >
+ <layout class="QVBoxLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menuBar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>497</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menu_Badger" >
+ <property name="title" >
+ <string>&amp;Badger</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_Hippo" >
+ <property name="tearOffEnabled" >
+ <bool>true</bool>
+ </property>
+ <property name="title" >
+ <string>&amp;Hippo</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_File" >
+ <property name="title" >
+ <string>&amp;File...</string>
+ </property>
+ </widget>
+ <addaction name="menu_File" />
+ </widget>
+ <widget class="QToolBar" name="mainToolBar" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <attribute name="toolBarArea" >
+ <number>4</number>
+ </attribute>
+ <addaction name="action_Open" />
+ </widget>
+ <widget class="QStatusBar" name="statusBar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>325</y>
+ <width>497</width>
+ <height>22</height>
+ </rect>
+ </property>
+ </widget>
+ <action name="action_Open" >
+ <property name="icon" >
+ <iconset>../../../examples/mainwindows/application/images/open.png</iconset>
+ </property>
+ <property name="text" >
+ <string>&amp;Open...</string>
+ </property>
+ </action>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/doc/src/diagrams/designer-palette-brush-editor.zip b/doc/src/diagrams/designer-palette-brush-editor.zip
new file mode 100644
index 0000000..698f271
--- /dev/null
+++ b/doc/src/diagrams/designer-palette-brush-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-palette-editor.zip b/doc/src/diagrams/designer-palette-editor.zip
new file mode 100644
index 0000000..96646ab
--- /dev/null
+++ b/doc/src/diagrams/designer-palette-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-palette-gradient-editor.zip b/doc/src/diagrams/designer-palette-gradient-editor.zip
new file mode 100644
index 0000000..4696516
--- /dev/null
+++ b/doc/src/diagrams/designer-palette-gradient-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-palette-pattern-editor.zip b/doc/src/diagrams/designer-palette-pattern-editor.zip
new file mode 100644
index 0000000..7382bad
--- /dev/null
+++ b/doc/src/diagrams/designer-palette-pattern-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-resource-editor.zip b/doc/src/diagrams/designer-resource-editor.zip
new file mode 100644
index 0000000..2c11da4
--- /dev/null
+++ b/doc/src/diagrams/designer-resource-editor.zip
Binary files differ
diff --git a/doc/src/diagrams/designer-widget-box.zip b/doc/src/diagrams/designer-widget-box.zip
new file mode 100644
index 0000000..7ba8f77
--- /dev/null
+++ b/doc/src/diagrams/designer-widget-box.zip
Binary files differ
diff --git a/doc/src/diagrams/diagrams.txt b/doc/src/diagrams/diagrams.txt
new file mode 100644
index 0000000..a985b70
--- /dev/null
+++ b/doc/src/diagrams/diagrams.txt
@@ -0,0 +1,16 @@
+Use makeimage.py (//depot/devtools/main/doctools/bin/makeimage.py) to generate
+images from these diagrams.
+
+Diagram Scale factor
+
+treemodel-structure.sk 0.28
+modelview-listmodel.sk 0.28
+modelview-models.sk 0.28
+modelview-overview.sk 0.28
+modelview-tablemodel.sk 0.28
+modelview-treemodel.sk 0.28
+plaintext-layout.png 0.8
+standard-views.sk 0.22
+boat.png 0.2
+car.png 0.2
+house.png 0.2
diff --git a/doc/src/diagrams/dockwidget-cross.sk b/doc/src/diagrams/dockwidget-cross.sk
new file mode 100644
index 0000000..6be469c
--- /dev/null
+++ b/doc/src/diagrams/dockwidget-cross.sk
@@ -0,0 +1,110 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.75,0.919,0.548))
+lw(2)
+r(337.214,0,0,-225.169,-36.3448,740.113)
+fp((0.848,0.848,0.848))
+lw(2)
+r(337.214,0,0,-35.553,-36.3448,740.113)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(-13.7198,773.512,0)
+bs(278.245,481.547,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(278.245,773.512,0)
+bs(-13.7198,481.547,0)
+fp((0.75,0.919,0.548))
+lw(2)
+r(337.214,0,0,-225.169,392.446,740.113)
+fp((0.848,0.848,0.848))
+lw(2)
+r(337.214,0,0,-35.553,392.446,740.113)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(415.07,773.512,0)
+bs(707.035,481.547,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(707.035,773.512,0)
+bs(415.07,481.547,0)
+fp((0.75,0.919,0.548))
+lw(2)
+r(337.214,0,0,-225.169,-36.3448,406.94)
+fp((0.848,0.848,0.848))
+lw(2)
+r(337.214,0,0,-35.553,-36.3448,406.94)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(-13.7198,440.338,0)
+bs(278.245,148.373,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(278.245,440.338,0)
+bs(-13.7198,148.373,0)
+fp((0.75,0.919,0.548))
+lw(2)
+r(337.214,0,0,-225.169,392.446,406.94)
+fp((0.848,0.848,0.848))
+lw(2)
+r(337.214,0,0,-35.553,392.446,406.94)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(415.07,440.338,0)
+bs(707.035,148.373,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(707.035,440.338,0)
+bs(415.07,148.373,0)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(42.8417,641.804,0)
+bs(56.8474,613.793,0)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(636.468,641.804,0)
+bs(650.474,613.793,0)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(125.26,363.306,0)
+bs(139.266,335.295,0)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(554.05,254.493,0)
+bs(568.056,226.481,0)
+lp((1,0,0))
+lw(3)
+r(163.759,0,0,-217.627,561.591,736.612)
+lp((1,0,0))
+lw(3)
+r(163.759,0,0,-217.627,-32.0348,736.612)
+lp((1,0,0))
+lw(3)
+r(328.595,0,0,-108.814,-32.0348,403.707)
+lp((1,0,0))
+lw(3)
+r(328.595,0,0,-108.814,396.755,294.894)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/dockwidget-neighbors.sk b/doc/src/diagrams/dockwidget-neighbors.sk
new file mode 100644
index 0000000..293394f
--- /dev/null
+++ b/doc/src/diagrams/dockwidget-neighbors.sk
@@ -0,0 +1,136 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.576,0.833,1))
+lw(2)
+r(178.842,0,0,-225.169,262.138,6.39015)
+fp((0.869,0.579,0.579))
+lw(2)
+r(178.842,0,0,-225.169,-212.068,325.597)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,-212.068,325.597)
+fp((0.576,0.833,1))
+lw(2)
+r(178.842,0,0,-225.169,-34.034,325.597)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,-34.034,325.597)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-121.652,218.992,0)
+bs(-107.647,190.981,0)
+fp((0.869,0.579,0.579))
+lw(2)
+r(178.842,0,0,-225.169,262.138,325.597)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,262.138,325.597)
+fp((0.576,0.833,1))
+lw(2)
+r(178.842,0,0,-225.169,440.172,325.597)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,440.172,325.597)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(484.554,266.992,0)
+bs(498.56,238.981,0)
+fp((0.869,0.579,0.579))
+lw(2)
+r(178.842,0,0,-225.169,-212.068,6.39015)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,-212.068,6.39015)
+fp((0.576,0.833,1))
+lw(2)
+r(178.842,0,0,-225.169,-34.034,6.39015)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,-34.034,6.39015)
+fp((0.869,0.579,0.579))
+lw(2)
+r(178.842,0,0,-225.169,440.138,6.39015)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,440.138,6.39014)
+fp((0.848,0.848,0.848))
+lw(2)
+r(178.842,0,0,-35.553,262.138,6.39015)
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(568.554,-100.215,0)
+bs(582.56,-128.226,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(58.0644,80.9449,0)
+bs(57.6378,341.945,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(532.064,80.9449,0)
+bs(531.638,341.945,0)
+G()
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(57.0644,-236.055,0)
+bs(56.6378,24.945,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(531.064,-236.055,0)
+bs(530.638,24.9451,0)
+G_()
+lw(4)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(6.63782,-148.044,0)
+bs(20.6435,-176.055,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(56.4642,213.012,0)
+bs(-46.9624,213.013,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(56.4642,-106.194,0)
+bs(-46.9624,-106.194,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(530.671,-106.194,0)
+bs(427.244,-106.194,0)
+lp((0.185,0,1))
+lw(1)
+ld((1, 1))
+b()
+bs(530.671,213.012,0)
+bs(427.244,213.013,0)
+lp((1,0,0))
+lw(3)
+r(170.759,0,0,-217.627,-208.027,321.826)
+lp((1,0,0))
+lw(3)
+r(170.759,0,0,-105.627,444.179,321.826)
+lp((1,0,0))
+lw(3)
+r(170.759,0,0,-105.627,-30.3622,-109.428)
+lp((1,0,0))
+lw(3)
+r(170.759,0,0,-217.627,444.179,2.61914)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/fontsampler-example.zip b/doc/src/diagrams/fontsampler-example.zip
new file mode 100644
index 0000000..a68ef21
--- /dev/null
+++ b/doc/src/diagrams/fontsampler-example.zip
Binary files differ
diff --git a/doc/src/diagrams/framebufferobject-example.png b/doc/src/diagrams/framebufferobject-example.png
new file mode 100644
index 0000000..a97840f
--- /dev/null
+++ b/doc/src/diagrams/framebufferobject-example.png
Binary files differ
diff --git a/doc/src/diagrams/framebufferobject2-example.png b/doc/src/diagrams/framebufferobject2-example.png
new file mode 100644
index 0000000..80dc2f1
--- /dev/null
+++ b/doc/src/diagrams/framebufferobject2-example.png
Binary files differ
diff --git a/doc/src/diagrams/ftp-example.zip b/doc/src/diagrams/ftp-example.zip
new file mode 100644
index 0000000..5075128
--- /dev/null
+++ b/doc/src/diagrams/ftp-example.zip
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-calendarwidget.png b/doc/src/diagrams/gallery-images/cde-calendarwidget.png
new file mode 100644
index 0000000..90cfb51
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-checkbox.png b/doc/src/diagrams/gallery-images/cde-checkbox.png
new file mode 100644
index 0000000..1e20f39
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-combobox.png b/doc/src/diagrams/gallery-images/cde-combobox.png
new file mode 100644
index 0000000..7458643
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-dateedit.png b/doc/src/diagrams/gallery-images/cde-dateedit.png
new file mode 100644
index 0000000..91a4e97
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-datetimeedit.png b/doc/src/diagrams/gallery-images/cde-datetimeedit.png
new file mode 100644
index 0000000..cc2242e
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-dial.png b/doc/src/diagrams/gallery-images/cde-dial.png
new file mode 100644
index 0000000..cdf852d
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-doublespinbox.png b/doc/src/diagrams/gallery-images/cde-doublespinbox.png
new file mode 100644
index 0000000..7474928
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-fontcombobox.png b/doc/src/diagrams/gallery-images/cde-fontcombobox.png
new file mode 100644
index 0000000..dd1b00d
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-frame.png b/doc/src/diagrams/gallery-images/cde-frame.png
new file mode 100644
index 0000000..69d63b8
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-groupbox.png b/doc/src/diagrams/gallery-images/cde-groupbox.png
new file mode 100644
index 0000000..710e2fc
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/cde-horizontalscrollbar.png
new file mode 100644
index 0000000..f52ba98
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-label.png b/doc/src/diagrams/gallery-images/cde-label.png
new file mode 100644
index 0000000..a508261
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-lcdnumber.png b/doc/src/diagrams/gallery-images/cde-lcdnumber.png
new file mode 100644
index 0000000..ecc5001
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-lineedit.png b/doc/src/diagrams/gallery-images/cde-lineedit.png
new file mode 100644
index 0000000..d9e5876
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-listview.png b/doc/src/diagrams/gallery-images/cde-listview.png
new file mode 100644
index 0000000..d698413
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-progressbar.png b/doc/src/diagrams/gallery-images/cde-progressbar.png
new file mode 100644
index 0000000..16e0bb2
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-pushbutton.png b/doc/src/diagrams/gallery-images/cde-pushbutton.png
new file mode 100644
index 0000000..b66a851
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-radiobutton.png b/doc/src/diagrams/gallery-images/cde-radiobutton.png
new file mode 100644
index 0000000..31da50d
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-slider.png b/doc/src/diagrams/gallery-images/cde-slider.png
new file mode 100644
index 0000000..6b6c544
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-spinbox.png b/doc/src/diagrams/gallery-images/cde-spinbox.png
new file mode 100644
index 0000000..4533469
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-tableview.png b/doc/src/diagrams/gallery-images/cde-tableview.png
new file mode 100644
index 0000000..fec7b44
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-tabwidget.png b/doc/src/diagrams/gallery-images/cde-tabwidget.png
new file mode 100644
index 0000000..758283e
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-textedit.png b/doc/src/diagrams/gallery-images/cde-textedit.png
new file mode 100644
index 0000000..426dbcc
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-timeedit.png b/doc/src/diagrams/gallery-images/cde-timeedit.png
new file mode 100644
index 0000000..be2bd38
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-toolbox.png b/doc/src/diagrams/gallery-images/cde-toolbox.png
new file mode 100644
index 0000000..4394f58
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-toolbutton.png b/doc/src/diagrams/gallery-images/cde-toolbutton.png
new file mode 100644
index 0000000..6bd0495
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cde-treeview.png b/doc/src/diagrams/gallery-images/cde-treeview.png
new file mode 100644
index 0000000..2fc78c6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cde-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-calendarwidget.png b/doc/src/diagrams/gallery-images/cleanlooks-calendarwidget.png
new file mode 100644
index 0000000..7ec25ae
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-checkbox.png b/doc/src/diagrams/gallery-images/cleanlooks-checkbox.png
new file mode 100644
index 0000000..c30aa84
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-combobox.png b/doc/src/diagrams/gallery-images/cleanlooks-combobox.png
new file mode 100644
index 0000000..5484fab
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-dateedit.png b/doc/src/diagrams/gallery-images/cleanlooks-dateedit.png
new file mode 100644
index 0000000..3d781b5
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-datetimeedit.png b/doc/src/diagrams/gallery-images/cleanlooks-datetimeedit.png
new file mode 100644
index 0000000..f91ad48
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-dial.png b/doc/src/diagrams/gallery-images/cleanlooks-dial.png
new file mode 100644
index 0000000..7e546ef
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-doublespinbox.png b/doc/src/diagrams/gallery-images/cleanlooks-doublespinbox.png
new file mode 100644
index 0000000..fe86c19
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-fontcombobox.png b/doc/src/diagrams/gallery-images/cleanlooks-fontcombobox.png
new file mode 100644
index 0000000..7170bb6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-frame.png b/doc/src/diagrams/gallery-images/cleanlooks-frame.png
new file mode 100644
index 0000000..9496512
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-groupbox.png b/doc/src/diagrams/gallery-images/cleanlooks-groupbox.png
new file mode 100644
index 0000000..106f86d
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/cleanlooks-horizontalscrollbar.png
new file mode 100644
index 0000000..78cab56
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-label.png b/doc/src/diagrams/gallery-images/cleanlooks-label.png
new file mode 100644
index 0000000..a0b8064
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-lcdnumber.png b/doc/src/diagrams/gallery-images/cleanlooks-lcdnumber.png
new file mode 100644
index 0000000..d0892e5
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-lineedit.png b/doc/src/diagrams/gallery-images/cleanlooks-lineedit.png
new file mode 100644
index 0000000..d79e94f
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-listview.png b/doc/src/diagrams/gallery-images/cleanlooks-listview.png
new file mode 100644
index 0000000..df0466b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-progressbar.png b/doc/src/diagrams/gallery-images/cleanlooks-progressbar.png
new file mode 100644
index 0000000..fc3c97a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-pushbutton.png b/doc/src/diagrams/gallery-images/cleanlooks-pushbutton.png
new file mode 100644
index 0000000..07f388b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-radiobutton.png b/doc/src/diagrams/gallery-images/cleanlooks-radiobutton.png
new file mode 100644
index 0000000..eb00206
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-slider.png b/doc/src/diagrams/gallery-images/cleanlooks-slider.png
new file mode 100644
index 0000000..907ff3c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-spinbox.png b/doc/src/diagrams/gallery-images/cleanlooks-spinbox.png
new file mode 100644
index 0000000..ca7c3db
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-tableview.png b/doc/src/diagrams/gallery-images/cleanlooks-tableview.png
new file mode 100644
index 0000000..64c630a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-tabwidget.png b/doc/src/diagrams/gallery-images/cleanlooks-tabwidget.png
new file mode 100644
index 0000000..4d5bf37
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-textedit.png b/doc/src/diagrams/gallery-images/cleanlooks-textedit.png
new file mode 100644
index 0000000..0a90fa9
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-timeedit.png b/doc/src/diagrams/gallery-images/cleanlooks-timeedit.png
new file mode 100644
index 0000000..09fede7
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-toolbox.png b/doc/src/diagrams/gallery-images/cleanlooks-toolbox.png
new file mode 100644
index 0000000..7bb3762
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-toolbutton.png b/doc/src/diagrams/gallery-images/cleanlooks-toolbutton.png
new file mode 100644
index 0000000..0fdc02a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/cleanlooks-treeview.png b/doc/src/diagrams/gallery-images/cleanlooks-treeview.png
new file mode 100644
index 0000000..bd9a079
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/cleanlooks-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/designer-creating-menubar.png b/doc/src/diagrams/gallery-images/designer-creating-menubar.png
new file mode 100644
index 0000000..87606f7
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/designer-creating-menubar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-calendarwidget.png b/doc/src/diagrams/gallery-images/gtk-calendarwidget.png
new file mode 100644
index 0000000..008eadf
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-checkbox.png b/doc/src/diagrams/gallery-images/gtk-checkbox.png
new file mode 100644
index 0000000..eb683b6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-columnview.png b/doc/src/diagrams/gallery-images/gtk-columnview.png
new file mode 100644
index 0000000..6469c8c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-columnview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-combobox.png b/doc/src/diagrams/gallery-images/gtk-combobox.png
new file mode 100644
index 0000000..bfdf68b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-dateedit.png b/doc/src/diagrams/gallery-images/gtk-dateedit.png
new file mode 100644
index 0000000..cbf595c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-datetimeedit.png b/doc/src/diagrams/gallery-images/gtk-datetimeedit.png
new file mode 100644
index 0000000..746b22d
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-dial.png b/doc/src/diagrams/gallery-images/gtk-dial.png
new file mode 100644
index 0000000..1df0de5
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-doublespinbox.png b/doc/src/diagrams/gallery-images/gtk-doublespinbox.png
new file mode 100644
index 0000000..f784d59
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-fontcombobox.png b/doc/src/diagrams/gallery-images/gtk-fontcombobox.png
new file mode 100644
index 0000000..878257b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-frame.png b/doc/src/diagrams/gallery-images/gtk-frame.png
new file mode 100644
index 0000000..b1c9b86
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-groupbox.png b/doc/src/diagrams/gallery-images/gtk-groupbox.png
new file mode 100644
index 0000000..a8a7b13
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/gtk-horizontalscrollbar.png
new file mode 100644
index 0000000..53a65e9
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-label.png b/doc/src/diagrams/gallery-images/gtk-label.png
new file mode 100644
index 0000000..d34dacd
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-lcdnumber.png b/doc/src/diagrams/gallery-images/gtk-lcdnumber.png
new file mode 100644
index 0000000..cb0cfe0
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-lineedit.png b/doc/src/diagrams/gallery-images/gtk-lineedit.png
new file mode 100644
index 0000000..a11a3b5
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-listview.png b/doc/src/diagrams/gallery-images/gtk-listview.png
new file mode 100644
index 0000000..a7258a4
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-progressbar.png b/doc/src/diagrams/gallery-images/gtk-progressbar.png
new file mode 100644
index 0000000..6de60c4
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-pushbutton.png b/doc/src/diagrams/gallery-images/gtk-pushbutton.png
new file mode 100644
index 0000000..85340ce
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-radiobutton.png b/doc/src/diagrams/gallery-images/gtk-radiobutton.png
new file mode 100644
index 0000000..20ee523
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-slider.png b/doc/src/diagrams/gallery-images/gtk-slider.png
new file mode 100644
index 0000000..140f00a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-spinbox.png b/doc/src/diagrams/gallery-images/gtk-spinbox.png
new file mode 100644
index 0000000..f1062cb
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-tableview.png b/doc/src/diagrams/gallery-images/gtk-tableview.png
new file mode 100644
index 0000000..6705317
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-tabwidget.png b/doc/src/diagrams/gallery-images/gtk-tabwidget.png
new file mode 100644
index 0000000..7a73e59
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-textedit.png b/doc/src/diagrams/gallery-images/gtk-textedit.png
new file mode 100644
index 0000000..e9f77e6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-timeedit.png b/doc/src/diagrams/gallery-images/gtk-timeedit.png
new file mode 100644
index 0000000..cf87c3a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-toolbox.png b/doc/src/diagrams/gallery-images/gtk-toolbox.png
new file mode 100644
index 0000000..b404114
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-toolbutton.png b/doc/src/diagrams/gallery-images/gtk-toolbutton.png
new file mode 100644
index 0000000..779cc82
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/gtk-treeview.png b/doc/src/diagrams/gallery-images/gtk-treeview.png
new file mode 100644
index 0000000..0abbbfa
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/gtk-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/linguist-menubar.png b/doc/src/diagrams/gallery-images/linguist-menubar.png
new file mode 100644
index 0000000..a73f135
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/linguist-menubar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/macintosh-tabwidget.png b/doc/src/diagrams/gallery-images/macintosh-tabwidget.png
new file mode 100644
index 0000000..b4a36af
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/macintosh-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-calendarwidget.png b/doc/src/diagrams/gallery-images/motif-calendarwidget.png
new file mode 100644
index 0000000..42d1644
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-checkbox.png b/doc/src/diagrams/gallery-images/motif-checkbox.png
new file mode 100644
index 0000000..f8e9b4f
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-combobox.png b/doc/src/diagrams/gallery-images/motif-combobox.png
new file mode 100644
index 0000000..2a288d9
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-dateedit.png b/doc/src/diagrams/gallery-images/motif-dateedit.png
new file mode 100644
index 0000000..48aecba
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-datetimeedit.png b/doc/src/diagrams/gallery-images/motif-datetimeedit.png
new file mode 100644
index 0000000..628df46
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-dial.png b/doc/src/diagrams/gallery-images/motif-dial.png
new file mode 100644
index 0000000..e920e7c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-doublespinbox.png b/doc/src/diagrams/gallery-images/motif-doublespinbox.png
new file mode 100644
index 0000000..6941c81
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-fontcombobox.png b/doc/src/diagrams/gallery-images/motif-fontcombobox.png
new file mode 100644
index 0000000..8c28854
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-frame.png b/doc/src/diagrams/gallery-images/motif-frame.png
new file mode 100644
index 0000000..4868352
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-groupbox.png b/doc/src/diagrams/gallery-images/motif-groupbox.png
new file mode 100644
index 0000000..aeadd1c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/motif-horizontalscrollbar.png
new file mode 100644
index 0000000..2a91be6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-label.png b/doc/src/diagrams/gallery-images/motif-label.png
new file mode 100644
index 0000000..96aedb8
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-lcdnumber.png b/doc/src/diagrams/gallery-images/motif-lcdnumber.png
new file mode 100644
index 0000000..3b72701
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-lineedit.png b/doc/src/diagrams/gallery-images/motif-lineedit.png
new file mode 100644
index 0000000..653735e
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-listview.png b/doc/src/diagrams/gallery-images/motif-listview.png
new file mode 100644
index 0000000..05b6620
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-menubar.png b/doc/src/diagrams/gallery-images/motif-menubar.png
new file mode 100644
index 0000000..76a7c43
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-menubar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-progressbar.png b/doc/src/diagrams/gallery-images/motif-progressbar.png
new file mode 100644
index 0000000..5acb425
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-pushbutton.png b/doc/src/diagrams/gallery-images/motif-pushbutton.png
new file mode 100644
index 0000000..4c6f6f3
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-radiobutton.png b/doc/src/diagrams/gallery-images/motif-radiobutton.png
new file mode 100644
index 0000000..7dd1d74
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-slider.png b/doc/src/diagrams/gallery-images/motif-slider.png
new file mode 100644
index 0000000..3dbbe64
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-spinbox.png b/doc/src/diagrams/gallery-images/motif-spinbox.png
new file mode 100644
index 0000000..b5087a6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-tableview.png b/doc/src/diagrams/gallery-images/motif-tableview.png
new file mode 100644
index 0000000..fcafe67
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-tabwidget.png b/doc/src/diagrams/gallery-images/motif-tabwidget.png
new file mode 100644
index 0000000..2c18459
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-textedit.png b/doc/src/diagrams/gallery-images/motif-textedit.png
new file mode 100644
index 0000000..b232c14
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-timeedit.png b/doc/src/diagrams/gallery-images/motif-timeedit.png
new file mode 100644
index 0000000..8a99406
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-toolbox.png b/doc/src/diagrams/gallery-images/motif-toolbox.png
new file mode 100644
index 0000000..6b1f290
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-toolbutton.png b/doc/src/diagrams/gallery-images/motif-toolbutton.png
new file mode 100644
index 0000000..7ea7fe3
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/motif-treeview.png b/doc/src/diagrams/gallery-images/motif-treeview.png
new file mode 100644
index 0000000..093735b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/motif-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-calendarwidget.png b/doc/src/diagrams/gallery-images/plastique-calendarwidget.png
new file mode 100644
index 0000000..404ab2b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-checkbox.png b/doc/src/diagrams/gallery-images/plastique-checkbox.png
new file mode 100644
index 0000000..54868cb
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-colordialog.png b/doc/src/diagrams/gallery-images/plastique-colordialog.png
new file mode 100644
index 0000000..6cc18ab
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-colordialog.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-combobox.png b/doc/src/diagrams/gallery-images/plastique-combobox.png
new file mode 100644
index 0000000..e3bf8a3
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-dateedit.png b/doc/src/diagrams/gallery-images/plastique-dateedit.png
new file mode 100644
index 0000000..f71163f
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-datetimeedit.png b/doc/src/diagrams/gallery-images/plastique-datetimeedit.png
new file mode 100644
index 0000000..dc84d19
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-dial.png b/doc/src/diagrams/gallery-images/plastique-dial.png
new file mode 100644
index 0000000..d1adec1
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-doublespinbox.png b/doc/src/diagrams/gallery-images/plastique-doublespinbox.png
new file mode 100644
index 0000000..2c8af54
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-fontcombobox.png b/doc/src/diagrams/gallery-images/plastique-fontcombobox.png
new file mode 100644
index 0000000..c2ed76c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-fontdialog.png b/doc/src/diagrams/gallery-images/plastique-fontdialog.png
new file mode 100644
index 0000000..209e59b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-fontdialog.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-frame.png b/doc/src/diagrams/gallery-images/plastique-frame.png
new file mode 100644
index 0000000..d20d69b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-groupbox.png b/doc/src/diagrams/gallery-images/plastique-groupbox.png
new file mode 100644
index 0000000..624f279
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/plastique-horizontalscrollbar.png
new file mode 100644
index 0000000..df50e03
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-label.png b/doc/src/diagrams/gallery-images/plastique-label.png
new file mode 100644
index 0000000..1423b05
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-lcdnumber.png b/doc/src/diagrams/gallery-images/plastique-lcdnumber.png
new file mode 100644
index 0000000..8b13ea9
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-lineedit.png b/doc/src/diagrams/gallery-images/plastique-lineedit.png
new file mode 100644
index 0000000..d2ed505
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-listview.png b/doc/src/diagrams/gallery-images/plastique-listview.png
new file mode 100644
index 0000000..76dfd0c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-menubar.png b/doc/src/diagrams/gallery-images/plastique-menubar.png
new file mode 100644
index 0000000..62fdc91
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-menubar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-messagebox.png b/doc/src/diagrams/gallery-images/plastique-messagebox.png
new file mode 100644
index 0000000..c927ad9
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-messagebox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-progressbar.png b/doc/src/diagrams/gallery-images/plastique-progressbar.png
new file mode 100644
index 0000000..d02187e
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-progressdialog.png b/doc/src/diagrams/gallery-images/plastique-progressdialog.png
new file mode 100644
index 0000000..d6f426a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-progressdialog.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-pushbutton.png b/doc/src/diagrams/gallery-images/plastique-pushbutton.png
new file mode 100644
index 0000000..a476b58
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-radiobutton.png b/doc/src/diagrams/gallery-images/plastique-radiobutton.png
new file mode 100644
index 0000000..373e04c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-sizegrip.png b/doc/src/diagrams/gallery-images/plastique-sizegrip.png
new file mode 100644
index 0000000..a83fd44
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-sizegrip.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-slider.png b/doc/src/diagrams/gallery-images/plastique-slider.png
new file mode 100644
index 0000000..a5698bb
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-spinbox.png b/doc/src/diagrams/gallery-images/plastique-spinbox.png
new file mode 100644
index 0000000..2a4008c
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-statusbar.png b/doc/src/diagrams/gallery-images/plastique-statusbar.png
new file mode 100644
index 0000000..c3923a5
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-statusbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-tabbar-truncated.png b/doc/src/diagrams/gallery-images/plastique-tabbar-truncated.png
new file mode 100644
index 0000000..868a36a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-tabbar-truncated.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-tabbar.png b/doc/src/diagrams/gallery-images/plastique-tabbar.png
new file mode 100644
index 0000000..721cb30
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-tabbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-tableview.png b/doc/src/diagrams/gallery-images/plastique-tableview.png
new file mode 100644
index 0000000..7dd40fd
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-tabwidget.png b/doc/src/diagrams/gallery-images/plastique-tabwidget.png
new file mode 100644
index 0000000..200f348
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-textedit.png b/doc/src/diagrams/gallery-images/plastique-textedit.png
new file mode 100644
index 0000000..5599cdb
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-timeedit.png b/doc/src/diagrams/gallery-images/plastique-timeedit.png
new file mode 100644
index 0000000..c638dbc
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-toolbox.png b/doc/src/diagrams/gallery-images/plastique-toolbox.png
new file mode 100644
index 0000000..9212594
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-toolbutton.png b/doc/src/diagrams/gallery-images/plastique-toolbutton.png
new file mode 100644
index 0000000..eac8763
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/plastique-treeview.png b/doc/src/diagrams/gallery-images/plastique-treeview.png
new file mode 100644
index 0000000..34de0e9
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/plastique-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-calendarwidget.png b/doc/src/diagrams/gallery-images/windows-calendarwidget.png
new file mode 100644
index 0000000..5734103
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-checkbox.png b/doc/src/diagrams/gallery-images/windows-checkbox.png
new file mode 100644
index 0000000..cc40f16
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-combobox.png b/doc/src/diagrams/gallery-images/windows-combobox.png
new file mode 100644
index 0000000..218d90e
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-dateedit.png b/doc/src/diagrams/gallery-images/windows-dateedit.png
new file mode 100644
index 0000000..8e98d42
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-datetimeedit.png b/doc/src/diagrams/gallery-images/windows-datetimeedit.png
new file mode 100644
index 0000000..6cd5b2a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-dial.png b/doc/src/diagrams/gallery-images/windows-dial.png
new file mode 100644
index 0000000..36dd3e2
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-doublespinbox.png b/doc/src/diagrams/gallery-images/windows-doublespinbox.png
new file mode 100644
index 0000000..0e12fc4
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-fontcombobox.png b/doc/src/diagrams/gallery-images/windows-fontcombobox.png
new file mode 100644
index 0000000..80bbb5a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-frame.png b/doc/src/diagrams/gallery-images/windows-frame.png
new file mode 100644
index 0000000..5e72c36
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-groupbox.png b/doc/src/diagrams/gallery-images/windows-groupbox.png
new file mode 100644
index 0000000..8a9d8f3
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/windows-horizontalscrollbar.png
new file mode 100644
index 0000000..da35a4a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-label.png b/doc/src/diagrams/gallery-images/windows-label.png
new file mode 100644
index 0000000..9d2da07
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-lcdnumber.png b/doc/src/diagrams/gallery-images/windows-lcdnumber.png
new file mode 100644
index 0000000..7503cc8
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-lineedit.png b/doc/src/diagrams/gallery-images/windows-lineedit.png
new file mode 100644
index 0000000..ffbdb5a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-listview.png b/doc/src/diagrams/gallery-images/windows-listview.png
new file mode 100644
index 0000000..9e04271
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-progressbar.png b/doc/src/diagrams/gallery-images/windows-progressbar.png
new file mode 100644
index 0000000..86ca13e
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-pushbutton.png b/doc/src/diagrams/gallery-images/windows-pushbutton.png
new file mode 100644
index 0000000..d095655
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-radiobutton.png b/doc/src/diagrams/gallery-images/windows-radiobutton.png
new file mode 100644
index 0000000..65a2967
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-slider.png b/doc/src/diagrams/gallery-images/windows-slider.png
new file mode 100644
index 0000000..38115a2
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-spinbox.png b/doc/src/diagrams/gallery-images/windows-spinbox.png
new file mode 100644
index 0000000..69d4af4
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-tableview.png b/doc/src/diagrams/gallery-images/windows-tableview.png
new file mode 100644
index 0000000..c42af7f
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-tabwidget.png b/doc/src/diagrams/gallery-images/windows-tabwidget.png
new file mode 100644
index 0000000..22651b8
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-textedit.png b/doc/src/diagrams/gallery-images/windows-textedit.png
new file mode 100644
index 0000000..ea930d5
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-timeedit.png b/doc/src/diagrams/gallery-images/windows-timeedit.png
new file mode 100644
index 0000000..ed22884
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-toolbox.png b/doc/src/diagrams/gallery-images/windows-toolbox.png
new file mode 100644
index 0000000..50a5d5a
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-toolbutton.png b/doc/src/diagrams/gallery-images/windows-toolbutton.png
new file mode 100644
index 0000000..b762be3
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windows-treeview.png b/doc/src/diagrams/gallery-images/windows-treeview.png
new file mode 100644
index 0000000..68f98ae
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windows-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-calendarwidget.png b/doc/src/diagrams/gallery-images/windowsvista-calendarwidget.png
new file mode 100644
index 0000000..050f0ac
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-calendarwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-checkbox.png b/doc/src/diagrams/gallery-images/windowsvista-checkbox.png
new file mode 100644
index 0000000..c533809
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-checkbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-combobox.png b/doc/src/diagrams/gallery-images/windowsvista-combobox.png
new file mode 100644
index 0000000..8ab83cb
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-combobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-dateedit.png b/doc/src/diagrams/gallery-images/windowsvista-dateedit.png
new file mode 100644
index 0000000..85e6ed4
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-dateedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-datetimeedit.png b/doc/src/diagrams/gallery-images/windowsvista-datetimeedit.png
new file mode 100644
index 0000000..390c956
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-datetimeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-dial.png b/doc/src/diagrams/gallery-images/windowsvista-dial.png
new file mode 100644
index 0000000..86f3a86
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-dial.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-doublespinbox.png b/doc/src/diagrams/gallery-images/windowsvista-doublespinbox.png
new file mode 100644
index 0000000..bf3d2cc
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-doublespinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-fontcombobox.png b/doc/src/diagrams/gallery-images/windowsvista-fontcombobox.png
new file mode 100644
index 0000000..7810fdb
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-fontcombobox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-frame.png b/doc/src/diagrams/gallery-images/windowsvista-frame.png
new file mode 100644
index 0000000..d3e2885
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-frame.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-groupbox.png b/doc/src/diagrams/gallery-images/windowsvista-groupbox.png
new file mode 100644
index 0000000..917eea1
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-groupbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-horizontalscrollbar.png b/doc/src/diagrams/gallery-images/windowsvista-horizontalscrollbar.png
new file mode 100644
index 0000000..103a2e6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-label.png b/doc/src/diagrams/gallery-images/windowsvista-label.png
new file mode 100644
index 0000000..3f6f2c0
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-label.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-lcdnumber.png b/doc/src/diagrams/gallery-images/windowsvista-lcdnumber.png
new file mode 100644
index 0000000..7e875dd
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-lcdnumber.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-lineedit.png b/doc/src/diagrams/gallery-images/windowsvista-lineedit.png
new file mode 100644
index 0000000..5f13d9b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-lineedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-listview.png b/doc/src/diagrams/gallery-images/windowsvista-listview.png
new file mode 100644
index 0000000..a2d0c66
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-listview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-progressbar.png b/doc/src/diagrams/gallery-images/windowsvista-progressbar.png
new file mode 100644
index 0000000..6d4da7b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-progressbar.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-pushbutton.png b/doc/src/diagrams/gallery-images/windowsvista-pushbutton.png
new file mode 100644
index 0000000..128f232
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-pushbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-radiobutton.png b/doc/src/diagrams/gallery-images/windowsvista-radiobutton.png
new file mode 100644
index 0000000..f739ae0
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-radiobutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-slider.png b/doc/src/diagrams/gallery-images/windowsvista-slider.png
new file mode 100644
index 0000000..a3a5d93
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-slider.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-spinbox.png b/doc/src/diagrams/gallery-images/windowsvista-spinbox.png
new file mode 100644
index 0000000..79115d6
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-spinbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-tableview.png b/doc/src/diagrams/gallery-images/windowsvista-tableview.png
new file mode 100644
index 0000000..b94b07f
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-tableview.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-tabwidget.png b/doc/src/diagrams/gallery-images/windowsvista-tabwidget.png
new file mode 100644
index 0000000..28b0a39
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-tabwidget.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-textedit.png b/doc/src/diagrams/gallery-images/windowsvista-textedit.png
new file mode 100644
index 0000000..c952731
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-textedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-timeedit.png b/doc/src/diagrams/gallery-images/windowsvista-timeedit.png
new file mode 100644
index 0000000..9a4b053
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-timeedit.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-toolbox.png b/doc/src/diagrams/gallery-images/windowsvista-toolbox.png
new file mode 100644
index 0000000..b3477e8
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-toolbox.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-toolbutton.png b/doc/src/diagrams/gallery-images/windowsvista-toolbutton.png
new file mode 100644
index 0000000..0ab376b
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-toolbutton.png
Binary files differ
diff --git a/doc/src/diagrams/gallery-images/windowsvista-treeview.png b/doc/src/diagrams/gallery-images/windowsvista-treeview.png
new file mode 100644
index 0000000..7626820
--- /dev/null
+++ b/doc/src/diagrams/gallery-images/windowsvista-treeview.png
Binary files differ
diff --git a/doc/src/diagrams/graphicsview-map.png b/doc/src/diagrams/graphicsview-map.png
new file mode 100644
index 0000000..5ad12c6
--- /dev/null
+++ b/doc/src/diagrams/graphicsview-map.png
Binary files differ
diff --git a/doc/src/diagrams/graphicsview-map.zip b/doc/src/diagrams/graphicsview-map.zip
new file mode 100644
index 0000000..a80ade5
--- /dev/null
+++ b/doc/src/diagrams/graphicsview-map.zip
Binary files differ
diff --git a/doc/src/diagrams/graphicsview-shapes.png b/doc/src/diagrams/graphicsview-shapes.png
new file mode 100644
index 0000000..01fcca1
--- /dev/null
+++ b/doc/src/diagrams/graphicsview-shapes.png
Binary files differ
diff --git a/doc/src/diagrams/graphicsview-text.png b/doc/src/diagrams/graphicsview-text.png
new file mode 100644
index 0000000..47a5505
--- /dev/null
+++ b/doc/src/diagrams/graphicsview-text.png
Binary files differ
diff --git a/doc/src/diagrams/hellogl-example.png b/doc/src/diagrams/hellogl-example.png
new file mode 100644
index 0000000..82b6f2c
--- /dev/null
+++ b/doc/src/diagrams/hellogl-example.png
Binary files differ
diff --git a/doc/src/diagrams/house.png b/doc/src/diagrams/house.png
new file mode 100644
index 0000000..9b7b587
--- /dev/null
+++ b/doc/src/diagrams/house.png
Binary files differ
diff --git a/doc/src/diagrams/house.sk b/doc/src/diagrams/house.sk
new file mode 100644
index 0000000..997153d
--- /dev/null
+++ b/doc/src/diagrams/house.sk
@@ -0,0 +1,33 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(90,0,0,-65,35,810)
+gl([(0,(0.866,0.684,0.208)),(1,(0.913,0.888,0.165))])
+pgl(0,-1,0)
+fp()
+lw(1)
+r(60,0,0,35,50,750)
+gl([(0,(0.866,0.358,0.337)),(1,(0.913,0.651,0.313))])
+pgl(0,-1,0)
+fp()
+lw(1)
+b()
+bs(120,785,0)
+bs(100,805,0)
+bs(60,805,0)
+bs(40,785,0)
+bs(120,785,0)
+bC()
+fp((1,1,1))
+lw(1)
+r(15,0,0,-15,60,780)
+gl([(0,(0.866,0.358,0.337)),(1,(0.913,0.651,0.313))])
+pgl(0,-1,0)
+fp()
+lw(1)
+r(15,0,0,25,85,750)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/httpstack.sk b/doc/src/diagrams/httpstack.sk
new file mode 100644
index 0000000..9a93682
--- /dev/null
+++ b/doc/src/diagrams/httpstack.sk
@@ -0,0 +1,112 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.808,0.4,0.4))
+lw(1)
+r(150,0,0,-20,97.5,732.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Client Application',(126.15,718.5))
+fp((0.9,0.9,0.9))
+lw(1)
+r(150,0,0,-20,97.5,712.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('HTTP/FTP',(143.832,698.5))
+fp((0.8,0.8,0.8))
+lw(1)
+r(150,0,0,-20,97.5,692.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('TCP',(160.5,678.5))
+fp((0.7,0.7,0.7))
+lw(1)
+r(150,0,0,-20,97.5,672.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('IP',(166.83,658.5))
+fp((0.625,0.625,0.625))
+lw(1)
+r(150,0,0,-20,97.5,652.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Link Layer',(144.822,638.5))
+fp((0.55,0.55,0.55))
+lw(1)
+r(150,0,0,-20,97.5,632.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Physical Layer',(133.488,618.5))
+fp((0.245,0.484,0.808))
+lw(1)
+r(150,0,0,-20,337.5,732.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Server Application',(363.816,718.5))
+fp((0.9,0.9,0.9))
+lw(1)
+r(150,0,0,-20,337.5,712.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('HTTP/FTP',(383.832,698.5))
+fp((0.8,0.8,0.8))
+lw(1)
+r(150,0,0,-20,337.5,692.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('TCP',(400.5,678.5))
+fp((0.7,0.7,0.7))
+lw(1)
+r(150,0,0,-20,337.5,672.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('IP',(406.83,658.5))
+fp((0.625,0.625,0.625))
+lw(1)
+r(150,0,0,-20,337.5,652.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Link Layer',(384.822,638.5))
+fp((0.55,0.55,0.55))
+lw(1)
+r(150,0,0,-20,337.5,632.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Physical Layer',(373.488,618.5))
+lp((0.217,0.6,0))
+lw(1.5)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(252.5,622.5,0)
+bs(332.5,622.5,0)
+le()
+lw(1)
+r(410,0,0,-140,87.5,742.5)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/itemviews/editabletreemodel-indexes.sk b/doc/src/diagrams/itemviews/editabletreemodel-indexes.sk
new file mode 100644
index 0000000..ad57384
--- /dev/null
+++ b/doc/src/diagrams/itemviews/editabletreemodel-indexes.sk
@@ -0,0 +1,92 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(212.5,0,0,-180,165,730)
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('TreeItem::parent()',(180,637.82))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(188.33,678.14))
+lw(1)
+r(30,0,0,-30,180,700)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(187.78,590.64))
+lw(1)
+r(30,0,0,-30,180,612.5)
+G_()
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('TreeModel::internalPointer()',(207.5,560))
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('TreeModel::createIndex()',(207.5,715.32))
+lw(1)
+ld((2, 2))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(180.125,665,0)
+bc(175.352,655.495,173.294,646.758,173.836,638.714,1)
+bc(174.37,630.789,177.818,624.278,182.5,616.996,1)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(215,582.5,0)
+bc(240,573.01,270,572.5,295,582.5,1)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(294.998,700.41,0)
+bc(269.947,709.762,239.944,710.108,215,699.97,1)
+lw(1)
+r(70,0,0,-30,300,612.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('child',(324.72,600.32))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('model index',(308.045,587.82))
+lw(1)
+r(70,0,0,-30,300,700)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('parent',(320.825,687.82))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('model index',(308.045,675.32))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/itemviews/editabletreemodel-items.sk b/doc/src/diagrams/itemviews/editabletreemodel-items.sk
new file mode 100644
index 0000000..8c7bfac
--- /dev/null
+++ b/doc/src/diagrams/itemviews/editabletreemodel-items.sk
@@ -0,0 +1,119 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(227.5,0,0,-225,140,740)
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('parent()',(327.49,578.25))
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('parent()',(272.49,692.5))
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('parent()',(180,617.82))
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('child(0)',(228.976,678.25))
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('child(0)',(287.22,555.75))
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('child(1)',(235,625))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,205,735.43)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('root item',(145.128,716.814))
+lw(1)
+ld((2, 2))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(327.5,555.43,0)
+bc(326.189,566.2,323.978,574.469,319.693,579.482,1)
+bc(315.471,584.421,309.225,586.174,301.476,587.5,1)
+lw(1)
+ld((2, 2))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(271.476,675.43,0)
+bc(270.016,686.345,267.555,694.724,262.783,699.805,1)
+bc(258.083,704.81,251.128,706.586,242.5,707.93,1)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(216.476,700.43,0)
+bc(218.411,687.052,221.761,676.771,228.35,670.517,1)
+bc(234.84,664.355,244.494,662.134,256.476,660.43,1)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(276.476,580,0)
+bc(278.169,566.622,281.1,556.341,286.865,550.087,1)
+bc(292.545,543.925,300.992,541.704,311.476,540,1)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(213.976,700.43,0)
+bc(216.032,668.656,219.591,644.241,226.592,629.386,1)
+bc(233.488,614.753,243.745,609.476,256.476,605.43,1)
+lw(1)
+ld((2, 2))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(207.5,700.43,0)
+bc(210,645.43,215,605.43,257.5,595.43,1)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('A',(273.33,648.57))
+lw(1)
+r(30,0,0,-30,265,670.43)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(273.33,593.14))
+lw(1)
+r(30,0,0,-30,265,615)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(327.78,528.14))
+lw(1)
+r(30,0,0,-30,320,550)
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/itemviews/editabletreemodel-model.sk b/doc/src/diagrams/itemviews/editabletreemodel-model.sk
new file mode 100644
index 0000000..cbd3c89
--- /dev/null
+++ b/doc/src/diagrams/itemviews/editabletreemodel-model.sk
@@ -0,0 +1,392 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(270.316,591.384))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 3',(270.316,561.384))
+le()
+lw(1)
+ld((3, 3))
+r(280,0,0,-247.5,135,715)
+gl([(0,(1,1,1)),(0.47,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+r(5.51073e-15,-30,30,5.51073e-15,235,610)
+gl([(0,(1,1,1)),(0.19,(1,1,1)),(0.815,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgr(-0.00900901,1,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(-30,0,0,-30,265,580)
+gl([(0,(1,1,1)),(0.47,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(-30,0,0,-30,205,580)
+fp((0.899,0.899,0.899))
+lp((0.503,0.503,0.503))
+lw(1)
+r(30,0,0,-30,175,610)
+fp((0.866,0.866,0.866))
+lw(1)
+r(30,0,0,-30,175,640)
+gl([(0,(1,1,1)),(0.47,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(-30,0,0,-30,235,580)
+G()
+lw(1)
+b()
+bs(235,610,0)
+bs(255,610,0)
+lw(1)
+ld((2, 2))
+b()
+bs(255,610,0)
+bs(265,610,0)
+G_()
+fp((0.899,0.899,0.899))
+lp((0.503,0.503,0.503))
+lw(1)
+r(30,0,0,-30,205,610)
+gl([(0,(1,1,1)),(0.47,(0.866,0.866,0.866)),(1,(0.866,0.866,0.866))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+r(5.51073e-15,-30,30,5.51073e-15,235,640)
+fp((0.866,0.866,0.866))
+lw(1)
+r(30,0,0,-30,175,670)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,140,710)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('root item',(180,691.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(270.316,651.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(270.316,621.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(370.316,546.384))
+lw(1)
+b()
+bs(155,680,0)
+bs(155,655,0)
+lw(1)
+b()
+bs(155,655,0)
+bs(175,655,0)
+fp((0.866,0.866,0.866))
+lw(1)
+r(30,0,0,-30,205,640)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('a',(184.44,650))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('b',(184.44,618.14))
+gl([(0,(1,1,1)),(0.47,(0.866,0.866,0.866)),(1,(0.866,0.866,0.866))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(5.51073e-15,-30,30,5.51073e-15,235,670)
+fp((0.866,0.866,0.866))
+lw(1)
+r(30,0,0,-30,205,670)
+G()
+lw(1)
+b()
+bs(235,670,0)
+bs(255,670,0)
+lw(1)
+ld((2, 2))
+b()
+bs(255,670,0)
+bs(265,670,0)
+G_()
+G()
+lw(1)
+b()
+bs(235,640,0)
+bs(255,640,0)
+lw(1)
+ld((2, 2))
+b()
+bs(255,640,0)
+bs(265,640,0)
+G_()
+lw(1)
+b()
+bs(190,615,0)
+bs(190,587.5,0)
+bs(275,587.5,0)
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(235,580,0)
+bs(235,560,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(235,560,0)
+bs(235,550,0)
+G_()
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(205,580,0)
+bs(205,560,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(205,560,0)
+bs(205,550,0)
+G_()
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(175,580,0)
+bs(175,560,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(175,560,0)
+bs(175,550,0)
+G_()
+G()
+lw(1)
+b()
+bs(235,610,0)
+bs(255,610,0)
+lw(1)
+ld((2, 2))
+b()
+bs(255,610,0)
+bs(265,610,0)
+G_()
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(235,580,0)
+bs(255,580,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(255,580,0)
+bs(265,580,0)
+G_()
+G()
+gl([(0,(1,1,1)),(0.47,(0.866,0.866,0.866)),(1,(0.866,0.866,0.866))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(5.51073e-15,-30,30,5.51073e-15,335,595)
+G()
+lw(1)
+b()
+bs(335,595,0)
+bs(355,595,0)
+lw(1)
+ld((2, 2))
+b()
+bs(355,595,0)
+bs(365,595,0)
+G_()
+G()
+lw(1)
+b()
+bs(335,565,0)
+bs(355,565,0)
+lw(1)
+ld((2, 2))
+b()
+bs(355,565,0)
+bs(365,565,0)
+G_()
+G_()
+gl([(0,(1,1,1)),(0.19,(1,1,1)),(0.815,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgr(-0.00900901,1,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(-30,0,0,-30,365,565)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(280,572.5,0)
+bs(290,572.5,0)
+gl([(0,(1,1,1)),(0.47,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(-30,0,0,-30,305,565)
+gl([(0,(1,1,1)),(0.47,(0.899,0.899,0.899)),(1,(0.899,0.899,0.899))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+ld((3, 3))
+r(-30,0,0,-30,335,565)
+G()
+lw(1)
+b()
+bs(300,577.5,0)
+bs(320,577.5,0)
+lw(1)
+ld((2, 2))
+b()
+bs(320,577.5,0)
+bs(330,577.5,0)
+G_()
+fp((0.866,0.866,0.866))
+lw(1)
+r(30,0,0,-30,305,595)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(370.316,576.384))
+fp((0.866,0.866,0.866))
+lw(1)
+r(30,0,0,-30,275,595)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('c',(315,574.89))
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(335,565,0)
+bs(335,545,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(335,545,0)
+bs(335,535,0)
+G_()
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(305,565,0)
+bs(305,545,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(305,545,0)
+bs(305,535,0)
+G_()
+G()
+lp((0.503,0.503,0.503))
+lw(1)
+b()
+bs(275,565,0)
+bs(275,545,0)
+lp((0.503,0.503,0.503))
+lw(1)
+ld((2, 2))
+b()
+bs(275,545,0)
+bs(275,535,0)
+G_()
+lw(1)
+b()
+bs(335,565,0)
+bs(355,565,0)
+lw(1)
+ld((2, 2))
+b()
+bs(355,565,0)
+bs(365,565,0)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 1',(0,-1,1,0,317.484,530))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 0',(0,-1,1,0,287.484,530))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 2',(0,-1,1,0,347.484,530))
+G_()
+G()
+fp((0,0,0))
+lw(1)
+ld((3, 3))
+Fn('Helvetica')
+txt('column = 1',(0,-1,1,0,216.384,545))
+fp((0,0,0))
+lw(1)
+ld((3, 3))
+Fn('Helvetica')
+txt('column = 0',(0,-1,1,0,186.384,545))
+fp((0,0,0))
+lw(1)
+ld((3, 3))
+Fn('Helvetica')
+txt('column = 2',(0,-1,1,0,246.384,545))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/itemviews/editabletreemodel-values.sk b/doc/src/diagrams/itemviews/editabletreemodel-values.sk
new file mode 100644
index 0000000..50f8543
--- /dev/null
+++ b/doc/src/diagrams/itemviews/editabletreemodel-values.sk
@@ -0,0 +1,263 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+ld((1, 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(111.719,739.57,0)
+bs(134.219,739.57,0)
+bs(137.5,732.07,0)
+lw(1)
+ld((1, 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(111.719,639.57,0)
+bs(134.219,639.57,0)
+bs(137.5,632.07,0)
+fp((0,0,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('data(...)',(78.04,747.82))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('itemData',(153.012,718.454))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('itemData',(153.012,618.454))
+lw(1)
+r(15,0,0,-15,70,730)
+lw(1)
+r(15,0,0,-15,70,630)
+lw(1)
+r(15,0,0,-15,85,730)
+lw(1)
+r(15,0,0,-15,85,630)
+lw(1)
+r(15,0,0,-15,100,730)
+lw(1)
+r(15,0,0,-15,100,630)
+lw(1)
+r(15,0,0,-15,115,730)
+lw(1)
+r(15,0,0,-15,115,630)
+lw(1)
+ld((3, 3))
+r(15,0,0,-15,130,730)
+lw(1)
+ld((3, 3))
+r(15,0,0,-15,130,630)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(50,735,0)
+bs(52.5,739.57,0)
+bs(75,739.57,0)
+bs(77.5,732.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(50,635,0)
+bs(52.5,639.57,0)
+bs(75,639.57,0)
+bs(77.5,632.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(68.315,739.57,0)
+bs(90.815,739.57,0)
+bs(92.5,732.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(68.315,639.57,0)
+bs(90.815,639.57,0)
+bs(92.5,632.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(83.038,739.57,0)
+bs(105.538,739.57,0)
+bs(107.5,732.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(83.038,639.57,0)
+bs(105.538,639.57,0)
+bs(107.5,632.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(97.417,739.57,0)
+bs(119.917,739.57,0)
+bs(122.5,732.07,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(97.417,639.57,0)
+bs(119.917,639.57,0)
+bs(122.5,632.07,0)
+fp((0.706,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('0',(74.164,718.595))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('0',(74.164,618.595))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(89.164,718.595))
+fp((0.706,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(89.164,618.595))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(104.164,718.595))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(104.164,618.595))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(119.164,718.595))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(119.164,618.595))
+lw(1)
+r(180,0,0,-160,25,760)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(37.78,613.14))
+lw(1)
+r(30,0,0,-30,30,635)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('A',(38.33,713.14))
+lw(1)
+r(30,0,0,-30,30,735)
+G_()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('c',(89.5,604.314))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('a',(74.164,703.884))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(38.33,663.14))
+lw(1)
+r(30,0,0,-30,30,685)
+G_()
+lw(1)
+ld((1, 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(111.719,690,0)
+bs(134.219,690,0)
+bs(137.5,682.5,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('itemData',(153.012,668.884))
+lw(1)
+r(15,0,0,-15,70,680.43)
+lw(1)
+r(15,0,0,-15,85,680.43)
+lw(1)
+r(15,0,0,-15,100,680.43)
+lw(1)
+r(15,0,0,-15,115,680.43)
+lw(1)
+ld((3, 3))
+r(15,0,0,-15,130,680.43)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(50,685.43,0)
+bs(52.5,690,0)
+bs(75,690,0)
+bs(77.5,682.5,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(68.315,690,0)
+bs(90.815,690,0)
+bs(92.5,682.5,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(83.038,690,0)
+bs(105.538,690,0)
+bs(107.5,682.5,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(97.417,690,0)
+bs(119.917,690,0)
+bs(122.5,682.5,0)
+fp((0.706,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('0',(74.164,669.025))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(89.164,669.025))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(104.164,669.025))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(119.164,669.025))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('b',(74.164,654.025))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/licensewizard-flow.sk b/doc/src/diagrams/licensewizard-flow.sk
new file mode 100644
index 0000000..79fae26
--- /dev/null
+++ b/doc/src/diagrams/licensewizard-flow.sk
@@ -0,0 +1,54 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(1083898156,'/tmp/x/licensewizard-evaluate.gif')
+im((851.299,69.838),1083898156)
+lp((1,0,0))
+lw(7)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(496.05,895.241,0)
+bs(597.322,1024.52,0)
+lp((1,0,0))
+lw(7)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(1010.49,1262.08,0)
+bs(1200.11,1262.08,0)
+lp((1,0,0))
+lw(7)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(1675.76,1024.52,0)
+bs(1777.03,895.241,0)
+lp((1,0,0))
+lw(7)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(890.669,1026.68,0)
+bs(1537.09,725.018,0)
+bm(1081732172,'/tmp/x/licensewizard-conclusion.gif')
+im((1580.67,443.683),1081732172)
+bm(1083701292,'/tmp/x/licensewizard-details.gif')
+im((1239.15,1048.08),1083701292)
+bm(1083701484,'/tmp/x/licensewizard-intro.gif')
+im((121.925,443.683),1083701484)
+bm(1083722348,'/tmp/x/licensewizard-register.gif')
+im((463.448,1048.08),1083722348)
+G()
+lp((1,0,0))
+lw(7)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(522.833,413.964,0)
+bs(818.03,278.216,0)
+lp((1,0,0))
+lw(7)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(1392.57,278.216,0)
+bs(1687.76,413.964,0)
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,10000,10000),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/linguist-icons/appicon.png b/doc/src/diagrams/linguist-icons/appicon.png
new file mode 100644
index 0000000..dab379f
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/appicon.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/linguist.qrc b/doc/src/diagrams/linguist-icons/linguist.qrc
new file mode 100644
index 0000000..1972905
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/linguist.qrc
@@ -0,0 +1,51 @@
+<RCC>
+<qresource>
+ <file>images/appicon.png</file>
+ <file>images/splash.png</file>
+ <file>images/s_check_danger.png</file>
+ <file>images/s_check_empty.png</file>
+ <file>images/s_check_warning.png</file>
+ <file>images/s_check_obsolete.png</file>
+ <file>images/s_check_off.png</file>
+ <file>images/s_check_on.png</file>
+ <file>images/pagecurl.png</file>
+ <file>images/mac/accelerator.png</file>
+ <file>images/mac/book.png</file>
+ <file>images/mac/doneandnext.png</file>
+ <file>images/mac/editcopy.png</file>
+ <file>images/mac/editcut.png</file>
+ <file>images/mac/editpaste.png</file>
+ <file>images/mac/fileopen.png</file>
+ <file>images/mac/filesave.png</file>
+ <file>images/mac/next.png</file>
+ <file>images/mac/nextunfinished.png</file>
+ <file>images/mac/phrase.png</file>
+ <file>images/mac/prev.png</file>
+ <file>images/mac/prevunfinished.png</file>
+ <file>images/mac/print.png</file>
+ <file>images/mac/punctuation.png</file>
+ <file>images/mac/redo.png</file>
+ <file>images/mac/searchfind.png</file>
+ <file>images/mac/undo.png</file>
+ <file>images/mac/whatsthis.png</file>
+ <file>images/win/accelerator.png</file>
+ <file>images/win/book.png</file>
+ <file>images/win/doneandnext.png</file>
+ <file>images/win/editcopy.png</file>
+ <file>images/win/editcut.png</file>
+ <file>images/win/editpaste.png</file>
+ <file>images/win/fileopen.png</file>
+ <file>images/win/filesave.png</file>
+ <file>images/win/next.png</file>
+ <file>images/win/nextunfinished.png</file>
+ <file>images/win/phrase.png</file>
+ <file>images/win/prev.png</file>
+ <file>images/win/prevunfinished.png</file>
+ <file>images/win/print.png</file>
+ <file>images/win/punctuation.png</file>
+ <file>images/win/redo.png</file>
+ <file>images/win/searchfind.png</file>
+ <file>images/win/undo.png</file>
+ <file>images/win/whatsthis.png</file>
+</qresource>
+</RCC>
diff --git a/doc/src/diagrams/linguist-icons/pagecurl.png b/doc/src/diagrams/linguist-icons/pagecurl.png
new file mode 100644
index 0000000..2d3f2ff
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/pagecurl.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/s_check_danger.png b/doc/src/diagrams/linguist-icons/s_check_danger.png
new file mode 100644
index 0000000..e101577
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/s_check_danger.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/s_check_empty.png b/doc/src/diagrams/linguist-icons/s_check_empty.png
new file mode 100644
index 0000000..759a41b
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/s_check_empty.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/s_check_obsolete.png b/doc/src/diagrams/linguist-icons/s_check_obsolete.png
new file mode 100644
index 0000000..b852b63
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/s_check_obsolete.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/s_check_off.png b/doc/src/diagrams/linguist-icons/s_check_off.png
new file mode 100644
index 0000000..640b689
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/s_check_off.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/s_check_on.png b/doc/src/diagrams/linguist-icons/s_check_on.png
new file mode 100644
index 0000000..afcaf63
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/s_check_on.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/s_check_warning.png b/doc/src/diagrams/linguist-icons/s_check_warning.png
new file mode 100644
index 0000000..f689c33
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/s_check_warning.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/splash.png b/doc/src/diagrams/linguist-icons/splash.png
new file mode 100644
index 0000000..e6c8f85
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/splash.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/accelerator.png b/doc/src/diagrams/linguist-icons/win/accelerator.png
new file mode 100644
index 0000000..4f72648
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/accelerator.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/book.png b/doc/src/diagrams/linguist-icons/win/book.png
new file mode 100644
index 0000000..1b35455
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/book.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/doneandnext.png b/doc/src/diagrams/linguist-icons/win/doneandnext.png
new file mode 100644
index 0000000..18f2fb6
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/doneandnext.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/editcopy.png b/doc/src/diagrams/linguist-icons/win/editcopy.png
new file mode 100644
index 0000000..d542c3b
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/editcopy.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/editcut.png b/doc/src/diagrams/linguist-icons/win/editcut.png
new file mode 100644
index 0000000..38e55f7
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/editcut.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/editpaste.png b/doc/src/diagrams/linguist-icons/win/editpaste.png
new file mode 100644
index 0000000..717dd86
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/editpaste.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/filenew.png b/doc/src/diagrams/linguist-icons/win/filenew.png
new file mode 100644
index 0000000..dd795cf
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/filenew.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/fileopen.png b/doc/src/diagrams/linguist-icons/win/fileopen.png
new file mode 100644
index 0000000..1b3e69f
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/fileopen.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/fileprint.png b/doc/src/diagrams/linguist-icons/win/fileprint.png
new file mode 100644
index 0000000..808c97e
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/fileprint.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/filesave.png b/doc/src/diagrams/linguist-icons/win/filesave.png
new file mode 100644
index 0000000..46eac82
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/filesave.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/next.png b/doc/src/diagrams/linguist-icons/win/next.png
new file mode 100644
index 0000000..7700d6f
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/next.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/nextunfinished.png b/doc/src/diagrams/linguist-icons/win/nextunfinished.png
new file mode 100644
index 0000000..05c92bd
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/nextunfinished.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/phrase.png b/doc/src/diagrams/linguist-icons/win/phrase.png
new file mode 100644
index 0000000..30c3ee6
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/phrase.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/prev.png b/doc/src/diagrams/linguist-icons/win/prev.png
new file mode 100644
index 0000000..99dc873
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/prev.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/prevunfinished.png b/doc/src/diagrams/linguist-icons/win/prevunfinished.png
new file mode 100644
index 0000000..15c13ea
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/prevunfinished.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/print.png b/doc/src/diagrams/linguist-icons/win/print.png
new file mode 100644
index 0000000..2afb769
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/print.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/punctuation.png b/doc/src/diagrams/linguist-icons/win/punctuation.png
new file mode 100644
index 0000000..3492f95
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/punctuation.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/redo.png b/doc/src/diagrams/linguist-icons/win/redo.png
new file mode 100644
index 0000000..9d679fe
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/redo.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/searchfind.png b/doc/src/diagrams/linguist-icons/win/searchfind.png
new file mode 100644
index 0000000..6ea35e9
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/searchfind.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/undo.png b/doc/src/diagrams/linguist-icons/win/undo.png
new file mode 100644
index 0000000..eee23d2
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/undo.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-icons/win/whatsthis.png b/doc/src/diagrams/linguist-icons/win/whatsthis.png
new file mode 100644
index 0000000..0b5d46a
--- /dev/null
+++ b/doc/src/diagrams/linguist-icons/win/whatsthis.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-linguist.png b/doc/src/diagrams/linguist-linguist.png
new file mode 100644
index 0000000..fd63bb4
--- /dev/null
+++ b/doc/src/diagrams/linguist-linguist.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-menubar.ui b/doc/src/diagrams/linguist-menubar.ui
new file mode 100644
index 0000000..b132282
--- /dev/null
+++ b/doc/src/diagrams/linguist-menubar.ui
@@ -0,0 +1,123 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralwidget" />
+ <widget class="QMenuBar" name="menubar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>29</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menu_File" >
+ <property name="title" >
+ <string>&amp;File</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_Edit" >
+ <property name="title" >
+ <string>&amp;Edit</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_Translation" >
+ <property name="title" >
+ <string>&amp;Translation</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_Validation" >
+ <property name="title" >
+ <string>&amp;Validation</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_Phrases" >
+ <property name="title" >
+ <string>&amp;Phrases</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_View" >
+ <property name="title" >
+ <string>&amp;View</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_Help" >
+ <property name="title" >
+ <string>&amp;Help</string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu" >
+ <property name="title" >
+ <string> </string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_2" >
+ <property name="title" >
+ <string> </string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_3" >
+ <property name="title" >
+ <string> </string>
+ </property>
+ </widget>
+ <widget class="QMenu" name="menu_4" >
+ <property name="title" >
+ <string> </string>
+ </property>
+ </widget>
+ <addaction name="menu_File" />
+ <addaction name="menu_Edit" />
+ <addaction name="menu_Translation" />
+ <addaction name="menu_Validation" />
+ <addaction name="menu_Phrases" />
+ <addaction name="menu_View" />
+ <addaction name="menu_Help" />
+ <addaction name="menu" />
+ <addaction name="menu_2" />
+ <addaction name="menu_3" />
+ <addaction name="menu_4" />
+ </widget>
+ <widget class="QStatusBar" name="statusbar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>9</y>
+ <width>800</width>
+ <height>0</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>false</bool>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/doc/src/diagrams/linguist-previewtool.png b/doc/src/diagrams/linguist-previewtool.png
new file mode 100644
index 0000000..02cb311
--- /dev/null
+++ b/doc/src/diagrams/linguist-previewtool.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-toolbar.png b/doc/src/diagrams/linguist-toolbar.png
new file mode 100644
index 0000000..784f486
--- /dev/null
+++ b/doc/src/diagrams/linguist-toolbar.png
Binary files differ
diff --git a/doc/src/diagrams/linguist-toolbar.ui b/doc/src/diagrams/linguist-toolbar.ui
new file mode 100644
index 0000000..3018c12
--- /dev/null
+++ b/doc/src/diagrams/linguist-toolbar.ui
@@ -0,0 +1,252 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>744</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralwidget" />
+ <widget class="QStatusBar" name="statusbar" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>16</y>
+ <width>744</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="sizeGripEnabled" >
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QToolBar" name="toolBar" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <attribute name="toolBarArea" >
+ <number>4</number>
+ </attribute>
+ <addaction name="actionOpen" />
+ <addaction name="actionSave" />
+ <addaction name="actionPrint" />
+ <addaction name="separator" />
+ <addaction name="actionOpen_Phrase_Book" />
+ </widget>
+ <widget class="QToolBar" name="toolBar_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <attribute name="toolBarArea" >
+ <number>4</number>
+ </attribute>
+ <addaction name="actionUndo" />
+ <addaction name="actionRedo" />
+ <addaction name="separator" />
+ <addaction name="actionCut" />
+ <addaction name="actionCopy" />
+ <addaction name="actionPaste" />
+ <addaction name="separator" />
+ <addaction name="actionFind" />
+ </widget>
+ <widget class="QToolBar" name="toolBar_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <attribute name="toolBarArea" >
+ <number>4</number>
+ </attribute>
+ <addaction name="actionPrev" />
+ <addaction name="actionNext" />
+ <addaction name="actionPrev_Unfinished" />
+ <addaction name="actionNext_Unfinished" />
+ <addaction name="actionDone_and_Next" />
+ </widget>
+ <widget class="QToolBar" name="toolBar_4" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <attribute name="toolBarArea" >
+ <number>4</number>
+ </attribute>
+ <addaction name="actionAccelerators" />
+ <addaction name="actionEnding_Punctuation" />
+ <addaction name="actionPhrase_Matches" />
+ </widget>
+ <widget class="QToolBar" name="toolBar_5" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <attribute name="toolBarArea" >
+ <number>4</number>
+ </attribute>
+ <addaction name="actionWhat_s_This" />
+ </widget>
+ <action name="actionOpen" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/fileopen.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Open</string>
+ </property>
+ </action>
+ <action name="actionSave" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/filesave.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Save</string>
+ </property>
+ </action>
+ <action name="actionPrint" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/print.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Print</string>
+ </property>
+ </action>
+ <action name="actionOpen_Phrase_Book" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/book.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Open Phrase Book</string>
+ </property>
+ </action>
+ <action name="actionUndo" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/undo.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Undo</string>
+ </property>
+ </action>
+ <action name="actionRedo" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/redo.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Redo</string>
+ </property>
+ </action>
+ <action name="actionCut" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/editcut.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Cut</string>
+ </property>
+ </action>
+ <action name="actionCopy" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/editcopy.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Copy</string>
+ </property>
+ </action>
+ <action name="actionPaste" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/editpaste.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Paste</string>
+ </property>
+ </action>
+ <action name="actionFind" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/searchfind.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Find</string>
+ </property>
+ </action>
+ <action name="actionPrev" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/prev.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Prev</string>
+ </property>
+ </action>
+ <action name="actionNext" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/next.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Next</string>
+ </property>
+ </action>
+ <action name="actionPrev_Unfinished" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/prevunfinished.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Prev Unfinished</string>
+ </property>
+ </action>
+ <action name="actionNext_Unfinished" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/nextunfinished.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Next Unfinished</string>
+ </property>
+ </action>
+ <action name="actionDone_and_Next" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/doneandnext.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Done and Next</string>
+ </property>
+ </action>
+ <action name="actionAccelerators" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/accelerator.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Accelerators</string>
+ </property>
+ </action>
+ <action name="actionEnding_Punctuation" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/punctuation.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Ending Punctuation</string>
+ </property>
+ </action>
+ <action name="actionPhrase_Matches" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/phrase.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Phrase Matches</string>
+ </property>
+ </action>
+ <action name="actionWhat_s_This" >
+ <property name="icon" >
+ <iconset resource="../../../tools/linguist/linguist/linguist.qrc" >:/images/win/whatsthis.png</iconset>
+ </property>
+ <property name="text" >
+ <string>What's This?</string>
+ </property>
+ </action>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources>
+ <include location="../../../tools/linguist/linguist/linguist.qrc" />
+ </resources>
+ <connections/>
+</ui>
diff --git a/doc/src/diagrams/linguist-toolbar.zip b/doc/src/diagrams/linguist-toolbar.zip
new file mode 100644
index 0000000..d239250
--- /dev/null
+++ b/doc/src/diagrams/linguist-toolbar.zip
Binary files differ
diff --git a/doc/src/diagrams/macintosh-menu.png b/doc/src/diagrams/macintosh-menu.png
new file mode 100644
index 0000000..1013115
--- /dev/null
+++ b/doc/src/diagrams/macintosh-menu.png
Binary files differ
diff --git a/doc/src/diagrams/macintosh-unified-toolbar.png b/doc/src/diagrams/macintosh-unified-toolbar.png
new file mode 100644
index 0000000..9cba683
--- /dev/null
+++ b/doc/src/diagrams/macintosh-unified-toolbar.png
Binary files differ
diff --git a/doc/src/diagrams/mainwindow-contextmenu.png b/doc/src/diagrams/mainwindow-contextmenu.png
new file mode 100644
index 0000000..78ebe89
--- /dev/null
+++ b/doc/src/diagrams/mainwindow-contextmenu.png
Binary files differ
diff --git a/doc/src/diagrams/mainwindow-custom-dock.png b/doc/src/diagrams/mainwindow-custom-dock.png
new file mode 100644
index 0000000..865ba9c
--- /dev/null
+++ b/doc/src/diagrams/mainwindow-custom-dock.png
Binary files differ
diff --git a/doc/src/diagrams/mainwindow-docks.sk b/doc/src/diagrams/mainwindow-docks.sk
new file mode 100644
index 0000000..15352b2
--- /dev/null
+++ b/doc/src/diagrams/mainwindow-docks.sk
@@ -0,0 +1,78 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.879,0.879,0.879))
+lw(1)
+r(465,0,0,-305,65.1378,580)
+fp((1,1,1))
+lw(1)
+r(405,0,0,-245,95.1378,550)
+gl([(0,(0.875,0.624,0.627)),(1,(1,1,1))])
+pgr(0.5,0.5,0)
+fp()
+lw(1)
+r(295,0,0,-145,150,500)
+lw(1)
+ld((4, 4))
+b()
+bs(445,500,0)
+bs(445,550,0)
+lw(1)
+ld((4, 4))
+b()
+bs(150,550,0)
+bs(150,500,0)
+lw(1)
+ld((4, 4))
+b()
+bs(95,500,0)
+bs(150,500,0)
+lw(1)
+ld((4, 4))
+b()
+bs(445,500,0)
+bs(500,500,0)
+lw(1)
+ld((4, 4))
+b()
+bs(95,355,0)
+bs(150,355,0)
+lw(1)
+ld((4, 4))
+b()
+bs(445,355,0)
+bs(500,355,0)
+lw(1)
+ld((4, 4))
+b()
+bs(445,355,0)
+bs(445,305,0)
+lw(1)
+ld((4, 4))
+b()
+bs(150,355,0)
+bs(150,305,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('Toolbars',(270.408,560))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('Dock windows',(252.908,521.423))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('Central widget',(252.763,421.416))
+le()
+lw(1)
+r(475,0,0,-315,60,585)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/mainwindow-vertical-dock.png b/doc/src/diagrams/mainwindow-vertical-dock.png
new file mode 100644
index 0000000..e5289ac
--- /dev/null
+++ b/doc/src/diagrams/mainwindow-vertical-dock.png
Binary files differ
diff --git a/doc/src/diagrams/mainwindow-vertical-tabs.png b/doc/src/diagrams/mainwindow-vertical-tabs.png
new file mode 100644
index 0000000..4479a13
--- /dev/null
+++ b/doc/src/diagrams/mainwindow-vertical-tabs.png
Binary files differ
diff --git a/doc/src/diagrams/modelview-begin-append-columns.sk b/doc/src/diagrams/modelview-begin-append-columns.sk
new file mode 100644
index 0000000..32a4606
--- /dev/null
+++ b/doc/src/diagrams/modelview-begin-append-columns.sk
@@ -0,0 +1,176 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,100,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,100,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,160,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,160,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,190,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,190,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,130,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,130,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,70,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,70,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,250,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,250,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,280,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,280,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,310,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,310,580)
+le()
+lw(1)
+r(290,0,0,-165,60,705)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(79.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(79.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(109.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(109.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(139.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(139.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(169.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(169.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('7',(289.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('7',(289.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('8',(319.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('8',(319.44,558.14))
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(250,640,0)
+bs(250,660,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-begin-append-rows.sk b/doc/src/diagrams/modelview-begin-append-rows.sk
new file mode 100644
index 0000000..7e9dfac
--- /dev/null
+++ b/doc/src/diagrams/modelview-begin-append-rows.sk
@@ -0,0 +1,122 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,605)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,635)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,665)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,665)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,605)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,635)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,695)
+le()
+lw(1)
+r(165,0,0,-200,210,705)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,575)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,335,575)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,545)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,335,545)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(229.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(344.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(229.44,643.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(344.44,643.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(229.44,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(344.44,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(229.44,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(344.44,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(286.94,553.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(344.44,553.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(286.94,523.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(344.44,523.14))
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(275,575,0)
+bs(255,575,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-begin-insert-columns.sk b/doc/src/diagrams/modelview-begin-insert-columns.sk
new file mode 100644
index 0000000..cc19460
--- /dev/null
+++ b/doc/src/diagrams/modelview-begin-insert-columns.sk
@@ -0,0 +1,193 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,310,580)
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,310,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,100,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,100,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,160,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,160,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,190,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,280,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,250,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,280,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,130,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,130,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,70,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,70,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,250,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,250,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,190,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,190,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,220,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,220,580)
+le()
+lw(1)
+r(290,0,0,-165,60,705)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(79.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(79.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(109.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(109.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(139.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(139.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(169.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(169.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,673.14))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(289.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('7',(289.44,673.14))
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(190,640,0)
+bs(190,660,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-begin-insert-rows.sk b/doc/src/diagrams/modelview-begin-insert-rows.sk
new file mode 100644
index 0000000..3c8ad7d
--- /dev/null
+++ b/doc/src/diagrams/modelview-begin-insert-rows.sk
@@ -0,0 +1,157 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,220,515)
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,335,515)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,665)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,665)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,605)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,575)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,575)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,335,575)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,545)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,635)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,545)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,695)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,605)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,335,605)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,635)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,335,635)
+le()
+lw(1)
+r(165,0,0,-230,210,705)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(229.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(344.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(229.44,643.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(344.44,643.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(229.44,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(286.94,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(344.44,613.14))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(344.44,523.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(229.44,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(286.94,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(344.44,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(229.44,553.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(286.94,553.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(344.44,553.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,523.14))
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(275,635,0)
+bs(255,635,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-begin-remove-columns.sk b/doc/src/diagrams/modelview-begin-remove-columns.sk
new file mode 100644
index 0000000..ac5529a
--- /dev/null
+++ b/doc/src/diagrams/modelview-begin-remove-columns.sk
@@ -0,0 +1,193 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,310,580)
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,310,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,100,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,100,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,160,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,160,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,280,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,130,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,130,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,70,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,70,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,190,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,250,580)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,280,580)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,190,695)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,220,695)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,250,695)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,250,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,190,637.5)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,220,637.5)
+le()
+lw(1)
+r(290,0,0,-165,60,705)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(79.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(79.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(109.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(109.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(139.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(139.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(169.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(169.44,558.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(199.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('6',(259.44,615.64))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('7',(289.44,673.14))
+lw(1.5)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(190,642.5,0)
+bs(190,662.5,0)
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('7',(199.44,558.14))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('8',(229.44,558.14))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('9',(259.44,558.14))
+fp((0.503,0.503,0.503))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('10',(283.88,558.14))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-begin-remove-rows.sk b/doc/src/diagrams/modelview-begin-remove-rows.sk
new file mode 100644
index 0000000..cf77802
--- /dev/null
+++ b/doc/src/diagrams/modelview-begin-remove-rows.sk
@@ -0,0 +1,130 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,220,515)
+fp((1,1,1))
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,335,575)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,665)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,665)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,575)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,635)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,545)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,605)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,220,695)
+fp((1,1,1))
+lw(1)
+r(30,0,0,-30,335,695)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,220,605)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,220,635)
+le()
+lw(1)
+r(165,0,0,-230,210,705)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,605)
+fp((0.753,0.753,1))
+lw(1)
+r(30,0,0,-30,277.5,635)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(229.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('0',(344.44,673.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(229.44,643.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('1',(344.44,643.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(229.44,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('2',(286.94,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(229.44,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('3',(286.94,583.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(229.44,553.14))
+fp((0.502,0.502,0.502))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('4',(344.44,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(229.44,523.14))
+fp((0.502,0.502,0.502))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('5',(344.44,583.14))
+lw(1.5)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(272.5,635,0)
+bs(252.5,635,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-listmodel.sk b/doc/src/diagrams/modelview-listmodel.sk
new file mode 100644
index 0000000..89c19cc
--- /dev/null
+++ b/doc/src/diagrams/modelview-listmodel.sk
@@ -0,0 +1,87 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+ld((3, 3))
+r(120,0,0,-195,30,745)
+G()
+G()
+lw(1)
+ld((3, 3))
+b()
+bs(50,580,0)
+bs(50,555,0)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,35,715)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('Root item',(75,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(105,656.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('A',(78.33,653.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(78.646,613.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(78.096,573.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(105.316,616.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(105.316,576.384))
+lw(1)
+b()
+bs(50,685,0)
+bs(50,580,0)
+lw(1)
+r(30,0,0,-30,70.316,635)
+lw(1)
+r(30,0,0,-30,70.316,595)
+lw(1)
+b()
+bs(50.316,620,0)
+bs(70.316,620,0)
+lw(1)
+b()
+bs(50.316,580,0)
+bs(70.316,580,0)
+lw(1)
+r(30,0,0,-30,70,675)
+lw(1)
+b()
+bs(50,660,0)
+bs(70,660,0)
+G_()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('List Model',(60.33,731.384))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-models.png b/doc/src/diagrams/modelview-models.png
new file mode 100644
index 0000000..9e6b30c
--- /dev/null
+++ b/doc/src/diagrams/modelview-models.png
Binary files differ
diff --git a/doc/src/diagrams/modelview-models.sk b/doc/src/diagrams/modelview-models.sk
new file mode 100644
index 0000000..19e69b0
--- /dev/null
+++ b/doc/src/diagrams/modelview-models.sk
@@ -0,0 +1,287 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+ld((3, 3))
+b()
+bs(425,490,0)
+bs(425,465,0)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,410,715)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('Root item',(450,696.384))
+lw(1)
+b()
+bs(425,685,0)
+bs(425,490,0)
+lw(1)
+r(30,0,0,-30,480,635)
+lw(1)
+b()
+bs(460,620,0)
+bs(480,620,0)
+lw(1)
+r(30,0,0,-30,480,595)
+lw(1)
+r(30,0,0,-30,445,505)
+lw(1)
+r(30,0,0,-30,445,545)
+lw(1)
+b()
+bs(460,580,0)
+bs(480,580,0)
+lw(1)
+b()
+bs(425,490,0)
+bs(445,490,0)
+lw(1)
+b()
+bs(425,530,0)
+bs(445,530,0)
+lw(1)
+b()
+bs(460,645,0)
+bs(460,580,0)
+lw(1)
+r(30,0,0,-30,445,675)
+lw(1)
+b()
+bs(425,660,0)
+bs(445,660,0)
+lw(1)
+ld((3, 3))
+b()
+bs(460,580,0)
+bs(460,555,0)
+lw(1)
+ld((3, 3))
+b()
+bs(50,580,0)
+bs(50,555,0)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,35,715)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('Root item',(75,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(105,656.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(105.316,616.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(105.316,576.384))
+lw(1)
+b()
+bs(50,685,0)
+bs(50,580,0)
+lw(1)
+r(30,0,0,-30,70.316,635)
+lw(1)
+r(30,0,0,-30,70.316,595)
+lw(1)
+b()
+bs(50.316,620,0)
+bs(70.316,620,0)
+lw(1)
+b()
+bs(50.316,580,0)
+bs(70.316,580,0)
+lw(1)
+r(30,0,0,-30,70,675)
+lw(1)
+b()
+bs(50,660,0)
+bs(70,660,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('Table Model',(245.168,731.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('List Model',(60.33,731.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('Tree Model',(450.668,731.384))
+le()
+lw(1)
+r(530,0,0,-285,30,745)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,180,715)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('Root item',(219.668,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(339.668,656.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(339.668,596.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 3',(339.668,566.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(340,626.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 1',(0,-1,1,0,256.934,550))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 0',(0,-1,1,0,226.934,550))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 2',(0,-1,1,0,286.934,550))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 3',(0,-1,1,0,316.934,550))
+lw(1)
+b()
+bs(195,685,0)
+bs(195,660,0)
+lw(1)
+r(30,0,0,-30,215,645)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,305,645)
+lw(1)
+r(30,0,0,-30,275,645)
+lw(1)
+r(30,0,0,-30,245,645)
+lw(1)
+r(30,0,0,-30,215,615)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,245,585)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,305,585)
+lw(1)
+r(30,0,0,-30,245,615)
+lw(1)
+r(30,0,0,-30,215,675)
+lw(1)
+r(30,0,0,-30,275,675)
+lw(1)
+r(30,0,0,-30,275,615)
+lw(1)
+r(30,0,0,-30,245,675)
+lw(1)
+b()
+bs(194.668,660,0)
+bs(214.668,660,0)
+lw(1)
+ld((3, 3))
+b()
+bs(215,585,0)
+bs(215,555,0)
+bs(245,555,0)
+lw(1)
+ld((3, 3))
+b()
+bs(305,675,0)
+bs(335,675,0)
+bs(335,645,0)
+lw(1)
+ld((3, 3))
+b()
+bs(275,555,0)
+bs(305,555,0)
+lw(1)
+ld((3, 3))
+b()
+bs(335,615,0)
+bs(335,585,0)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(540,656.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(575,616.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(575,576.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(540,526.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(540,486.384))
+G_()
+lw(1)
+r(30,0,0,-30,475,675)
+lw(1)
+r(30,0,0,-30,510,635)
+lw(1)
+r(30,0,0,-30,510,595)
+lw(1)
+r(30,0,0,-30,475,545)
+lw(1)
+r(30,0,0,-30,475,505)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,505,675)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,540,635)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,540,595)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,505,545)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,505,505)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-overview.sk b/doc/src/diagrams/modelview-overview.sk
new file mode 100644
index 0000000..1ba0473
--- /dev/null
+++ b/doc/src/diagrams/modelview-overview.sk
@@ -0,0 +1,82 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(205,0,0,-220,50,755)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Data',(93.286,726.384))
+fp((0.627,0.745,1))
+lw(1)
+r(75,0,0,-45,68.63,685)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(106.13,640,0)
+bs(106.13,587.5,0)
+fp((0.627,1,0.498))
+lw(1)
+e(10,0,0,-10,186.13,587.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Model',(89.792,658.884))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Delegate',(200.606,583.884))
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(106.13,707.5,0)
+bs(106.13,687.5,0)
+lw(1)
+ld((4, 4))
+r(45,0,0,-40,83.63,750)
+G()
+fp((1,0.627,0.498))
+lw(1)
+r(75,0,0,-45,68.63,585)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('View',(93.128,558.884))
+G_()
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(-50,0,0,-50,143.63,612.5,1.62075,2.35619,0)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(-50,0,0,-50,143.63,612.5,2.87243,4.66243,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+Fs(10)
+txt('Editing',(191.13,637.5))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+Fs(10)
+txt('Rendering',(165,555.32))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+Fs(10)
+txt('Rendering',(55,609.57))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-tablemodel.sk b/doc/src/diagrams/modelview-tablemodel.sk
new file mode 100644
index 0000000..4e8a492
--- /dev/null
+++ b/doc/src/diagrams/modelview-tablemodel.sk
@@ -0,0 +1,142 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+ld((3, 3))
+r(210,0,0,-260,175,745)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('Table Model',(245.168,731.384))
+G()
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,180,715)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('Root item',(219.668,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(339.668,656.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(339.668,596.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 3',(339.668,566.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('A',(222.998,653.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(253.33,623.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(252.78,593.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(340,626.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 1',(0,-1,1,0,256.934,550))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 0',(0,-1,1,0,226.934,550))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 2',(0,-1,1,0,286.934,550))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('column = 3',(0,-1,1,0,316.934,550))
+lw(1)
+b()
+bs(195,685,0)
+bs(195,660,0)
+lw(1)
+r(30,0,0,-30,215,645)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,305,645)
+lw(1)
+r(30,0,0,-30,275,645)
+lw(1)
+r(30,0,0,-30,245,645)
+lw(1)
+r(30,0,0,-30,215,615)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,245,585)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,305,585)
+lw(1)
+r(30,0,0,-30,245,615)
+lw(1)
+r(30,0,0,-30,215,675)
+lw(1)
+r(30,0,0,-30,275,675)
+lw(1)
+r(30,0,0,-30,275,615)
+lw(1)
+r(30,0,0,-30,245,675)
+lw(1)
+b()
+bs(194.668,660,0)
+bs(214.668,660,0)
+lw(1)
+ld((3, 3))
+b()
+bs(215,585,0)
+bs(215,555,0)
+bs(245,555,0)
+lw(1)
+ld((3, 3))
+b()
+bs(305,675,0)
+bs(335,675,0)
+bs(335,645,0)
+lw(1)
+ld((3, 3))
+b()
+bs(275,555,0)
+bs(305,555,0)
+lw(1)
+ld((3, 3))
+b()
+bs(335,615,0)
+bs(335,585,0)
+G_()
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/modelview-treemodel.sk b/doc/src/diagrams/modelview-treemodel.sk
new file mode 100644
index 0000000..717d9da
--- /dev/null
+++ b/doc/src/diagrams/modelview-treemodel.sk
@@ -0,0 +1,139 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+ld((3, 3))
+r(215,0,0,-285,135,745)
+lw(1)
+ld((3, 3))
+b()
+bs(155,490,0)
+bs(155,465,0)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,140,715)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Oblique')
+txt('Root item',(180,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(270.316,656.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(305,616.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('A',(183.33,653.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(218.33,573.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(212.78,483.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(305,576.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(270,526.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(270,486.384))
+lw(1)
+b()
+bs(155,685,0)
+bs(155,490,0)
+lw(1)
+r(30,0,0,-30,210,635)
+lw(1)
+r(30,0,0,-30,240,635)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,270,635)
+lw(1)
+r(30,0,0,-30,240,595)
+lw(1)
+b()
+bs(190,620,0)
+bs(210,620,0)
+lw(1)
+r(30,0,0,-30,210,595)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,270,595)
+lw(1)
+r(30,0,0,-30,175,505)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,235,505)
+lw(1)
+r(30,0,0,-30,175,545)
+lw(1)
+r(30,0,0,-30,205,545)
+lw(1)
+r(30,0,0,-30,205,505)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,235,545)
+lw(1)
+b()
+bs(190,580,0)
+bs(210,580,0)
+lw(1)
+b()
+bs(155,490,0)
+bs(175,490,0)
+lw(1)
+b()
+bs(155,530,0)
+bs(175,530,0)
+lw(1)
+b()
+bs(190,645,0)
+bs(190,580,0)
+lw(1)
+r(30,0,0,-30,175,675)
+lw(1)
+ld((3, 3))
+r(30,0,0,-30,235.316,675)
+lw(1)
+r(30,0,0,-30,205,675)
+lw(1)
+b()
+bs(155,660,0)
+bs(175,660,0)
+lw(1)
+ld((3, 3))
+b()
+bs(190,580,0)
+bs(190,555,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('Tree Model',(180.668,731.384))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/paintsystem-core.sk b/doc/src/diagrams/paintsystem-core.sk
new file mode 100644
index 0000000..2501124
--- /dev/null
+++ b/doc/src/diagrams/paintsystem-core.sk
@@ -0,0 +1,76 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,146.138,825.695)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,277.138,825.695)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+ld((2, 2))
+r(104,0,0,-38,13.1378,825.695)
+fp((0,0,0))
+lw(1)
+ld((2, 2))
+Fn('Helvetica')
+txt('QPaintEngine',(162.138,803.629))
+fp((0,0,0))
+lw(1)
+ld((2, 2))
+Fn('Helvetica')
+txt('QPaintDevice',(292.638,803.629))
+fp((0,0,0))
+lw(1)
+ld((2, 2))
+Fn('Helvetica')
+txt('QPainter',(40.6378,803.629))
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.5,0.5,0)
+fp()
+lw(1)
+b()
+bs(117.138,806.695,0)
+bs(145.638,806.695,0)
+lw(1)
+b()
+bs(249.888,806.695,0)
+bs(275.888,806.695,0)
+gl([(0,(0.323,0.47,0.175)),(1,(0.763,0.859,0.694))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+ld((2, 2))
+b()
+bs(137.028,811.945,0)
+bs(146.388,806.761,0)
+bs(137.028,801.445,0)
+bs(136.888,811.878,0)
+gl([(0,(0.323,0.47,0.175)),(1,(0.763,0.859,0.694))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+b()
+bs(267.777,811.945,0)
+bs(277.138,806.761,0)
+bs(267.777,801.445,0)
+bs(267.638,811.878,0)
+le()
+lw(1)
+ld((2, 2))
+r(387.5,0,0,-64.5,4.1378,838.945)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/paintsystem-devices.sk b/doc/src/diagrams/paintsystem-devices.sk
new file mode 100644
index 0000000..f66d5fa
--- /dev/null
+++ b/doc/src/diagrams/paintsystem-devices.sk
@@ -0,0 +1,220 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lp((0.503,0.503,0.503))
+lw(1)
+r(109,0,0,-43,277,828)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,279.5,825.5)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QPaintDevice',(294.822,803.434))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('inherits',(312,755.309))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('inherits',(35.05,656.129))
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.500001,0.5,0)
+fp()
+lw(1)
+b()
+bs(54.4205,666.57,0)
+bs(54.3555,685.07,0)
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.500001,0.5,0)
+fp()
+lw(1)
+b()
+bs(332,747,0)
+bs(331.935,753,0)
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.500001,0.5,0)
+fp()
+lw(1)
+b()
+bs(54.4205,647.07,0)
+bs(54.3555,653.07,0)
+gl([(0,(0.323,0.47,0.175)),(1,(0.763,0.859,0.694))])
+pgr(0.499002,0.499373,0)
+fp()
+b()
+bs(59.638,676.472,0)
+bs(54.433,685.82,0)
+bs(49.138,676.448,0)
+bs(59.571,676.332,0)
+lw(1)
+b()
+bs(55,730,0)
+bs(55,747,0)
+bs(126,747,0)
+lw(1)
+b()
+bs(125,730,0)
+bs(125,747,0)
+bs(197,747,0)
+lw(1)
+b()
+bs(197,730,0)
+bs(197,747,0)
+bs(250,747,0)
+lw(1)
+b()
+bs(285,730,0)
+bs(285,747,0)
+bs(232,747,0)
+lw(1)
+b()
+bs(518,730,0)
+bs(518,747,0)
+bs(409,747,0)
+lw(1)
+b()
+bs(591.862,730,0)
+bs(591.862,747,0)
+bs(517.362,747,0)
+lp((0.517,0.517,0.517))
+lw(1)
+r(63.5,0,0,-43,94.6378,729.695)
+lp((0.517,0.517,0.517))
+lw(1)
+r(68,0,0,-43,162.638,729.695)
+lp((0.517,0.517,0.517))
+lw(1)
+r(96.5,0,0,-43,235.638,729.695)
+lp((0.517,0.517,0.517))
+lw(1)
+r(141.5,0,0,-43,338.5,730)
+lp((0.517,0.517,0.517))
+lw(1)
+r(70.5,0,0,-43,19.138,645.695)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(58,0,0,-38,97.3878,727.195)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(63,0,0,-38,165.138,727.195)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(91.5,0,0,-38,238.138,727.195)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(136,0,0,-38,341.25,727.5)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(65,0,0,-38,21.638,643.195)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QImage',(105.046,705.129))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QPixmap',(171.966,705.129))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QGLPixelBuffer',(242.206,705.129))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QGLFramebufferObject',(345.068,705.434))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QGLWidget',(23.044,621.129))
+lp((0.517,0.517,0.517))
+lw(1)
+r(69.5,0,0,-43,19.638,729.695)
+lp((0.517,0.517,0.517))
+lw(1)
+r(67.5,0,0,-43,486,730)
+lp((0.517,0.517,0.517))
+lw(1)
+r(70.5,0,0,-43,558.5,729.695)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(64,0,0,-38,22.388,727.195)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(62,0,0,-38,488.75,727.5)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(65.5,0,0,-38,561,727.195)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QWidget',(31.048,705.129))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QPicture',(496.41,705.434))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QPrinter',(571.412,705.129))
+le()
+lw(1)
+r(479,0,0,243.5,7.1378,592.445)
+G()
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.500001,0.5,0)
+fp()
+lw(1)
+b()
+bs(331.782,765.75,0)
+bs(331.717,784.25,0)
+gl([(0,(0.323,0.47,0.175)),(1,(0.763,0.859,0.694))])
+pgr(0.499002,0.499373,0)
+fp()
+b()
+bs(337,775.652,0)
+bs(331.795,785,0)
+bs(326.5,775.628,0)
+bs(336.933,775.512,0)
+G_()
+lw(1)
+b()
+bs(285,730,0)
+bs(285,747,0)
+bs(338,747,0)
+lw(1)
+b()
+bs(408,730,0)
+bs(408,747,0)
+bs(338,747,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,1,1),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/paintsystem-gradients.sk b/doc/src/diagrams/paintsystem-gradients.sk
new file mode 100644
index 0000000..6513c12
--- /dev/null
+++ b/doc/src/diagrams/paintsystem-gradients.sk
@@ -0,0 +1,94 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lp((0.503,0.503,0.503))
+lw(1)
+r(109,0,0,-43,163.638,805.695)
+gl([(0,(0.779,0.726,0.314)),(1,(1,0.954,0.705))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,166.138,803.195)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QGradient',(190.46,781.129))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('inherits',(199.3,733.629))
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.500001,0.5,0)
+fp()
+lw(1)
+b()
+bs(218.17,744.07,0)
+bs(218.105,762.57,0)
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.500001,0.5,0)
+fp()
+lw(1)
+b()
+bs(218.67,709.57,0)
+bs(218.605,730.57,0)
+gl([(0,(0.323,0.47,0.175)),(1,(0.763,0.859,0.694))])
+pgr(0.499002,0.499373,0)
+fp()
+b()
+bs(223.388,753.972,0)
+bs(218.183,763.32,0)
+bs(212.888,753.948,0)
+bs(223.321,753.832,0)
+lp((0.517,0.517,0.517))
+lw(1)
+r(109,0,0,-43,47.6378,709.195)
+lp((0.517,0.517,0.517))
+lw(1)
+r(109,0,0,-43,164.638,709.195)
+lp((0.517,0.517,0.517))
+lw(1)
+r(109,0,0,-43,280.638,709.195)
+gl([(0,(0.779,0.726,0.314)),(1,(1,0.954,0.705))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,50.1378,706.695)
+gl([(0,(0.779,0.726,0.314)),(1,(1,0.954,0.705))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,167.138,706.695)
+gl([(0,(0.779,0.726,0.314)),(1,(1,0.954,0.705))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,283.138,706.695)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QLinearGradient',(57.7858,684.629))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QRadialGradient',(174.456,684.629))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QConicalGradient',(287.456,684.629))
+lw(1)
+b()
+bs(104.138,709.445,0)
+bs(104.138,726.445,0)
+bs(222.638,726.445,0)
+lw(1)
+b()
+bs(335.638,709.445,0)
+bs(335.638,726.445,0)
+bs(217.138,726.445,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/paintsystem-stylepainter.sk b/doc/src/diagrams/paintsystem-stylepainter.sk
new file mode 100644
index 0000000..8e27015
--- /dev/null
+++ b/doc/src/diagrams/paintsystem-stylepainter.sk
@@ -0,0 +1,58 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lp((0.503,0.503,0.503))
+lw(1)
+r(109,0,0,-43,210.138,827.945)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,212.638,825.445)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QPainter',(240.962,803.379))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('inherits',(145.3,803.379))
+lp((0.517,0.517,0.517))
+lw(1)
+r(109,0,0,-43,17.1378,827.945)
+gl([(0,(0.598,0.866,0.321)),(1,(0.799,0.899,0.724))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+r(104,0,0,-38,19.6378,825.445)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QStylePainter',(34.6238,803.379))
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.5,0.499997,0)
+fp()
+lw(1)
+b()
+bs(189.262,806.242,0)
+bs(207.758,806.648,0)
+gl([(0,(0.374,0.544,0.203)),(1,(0.889,1,0.805))])
+pgr(0.5,0.500003,0)
+fp()
+lw(1)
+b()
+bs(126.268,806.219,0)
+bs(141.763,806.671,0)
+gl([(0,(0.323,0.47,0.175)),(1,(0.763,0.859,0.694))])
+pgr(0.498297,0.509099,0)
+fp()
+b()
+bs(199.259,801.196,0)
+bs(208.509,806.573,0)
+bs(199.041,811.694,0)
+bs(199.118,801.26,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/palette-diagram/dialog-crop-fade.png b/doc/src/diagrams/palette-diagram/dialog-crop-fade.png
new file mode 100644
index 0000000..faf7e11
--- /dev/null
+++ b/doc/src/diagrams/palette-diagram/dialog-crop-fade.png
Binary files differ
diff --git a/doc/src/diagrams/palette-diagram/dialog-crop.png b/doc/src/diagrams/palette-diagram/dialog-crop.png
new file mode 100644
index 0000000..df54743
--- /dev/null
+++ b/doc/src/diagrams/palette-diagram/dialog-crop.png
Binary files differ
diff --git a/doc/src/diagrams/palette-diagram/dialog.png b/doc/src/diagrams/palette-diagram/dialog.png
new file mode 100644
index 0000000..5fe142d
--- /dev/null
+++ b/doc/src/diagrams/palette-diagram/dialog.png
Binary files differ
diff --git a/doc/src/diagrams/palette-diagram/palette.sk b/doc/src/diagrams/palette-diagram/palette.sk
new file mode 100644
index 0000000..53ab0b5
--- /dev/null
+++ b/doc/src/diagrams/palette-diagram/palette.sk
@@ -0,0 +1,95 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(-1228628980,'dialog-crop-fade.png')
+im((115,661),-1228628980)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Window',(130,642.484))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('WindowText',(195,642.484))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('HighlightedText',(20,705))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Highlight',(50,686.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('ButtonText',(620,736.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Button',(620,721.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3D effects with Light,',(620,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Midlight, Dark, and',(620,681.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Shadow',(620,666.384))
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(190,680,0)
+bs(195,655,0)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(175,670,0)
+bs(170,655,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(110,710,0)
+bs(220,725,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(100,695,0)
+bs(222.693,717.307,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(615,740,0)
+bs(560,725,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(615,725,0)
+bs(580,720,0)
+lw(1)
+b()
+bs(615,705,0)
+bs(615,665,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(615,690,0)
+bs(585,690,0)
+le()
+lw(1)
+r(720,0,0,-180,15,835)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/parent-child-widgets.png b/doc/src/diagrams/parent-child-widgets.png
new file mode 100644
index 0000000..6d9eb36
--- /dev/null
+++ b/doc/src/diagrams/parent-child-widgets.png
Binary files differ
diff --git a/doc/src/diagrams/parent-child-widgets.sk b/doc/src/diagrams/parent-child-widgets.sk
new file mode 100644
index 0000000..b6046fc
--- /dev/null
+++ b/doc/src/diagrams/parent-child-widgets.sk
@@ -0,0 +1,130 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(-1227761876,'parent-child-widgets.png')
+im((140,526),-1227761876)
+G()
+fp((0,0.012,0.878))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QLabel',(46.312,698.884))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('child widgets',(46.312,683.884))
+G_()
+lp((0.879,0,0))
+lw(1)
+b()
+bs(155,732.5,0)
+bs(135,732.5,0)
+bs(135,762.5,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(155,702.5,0)
+bs(90,702.5,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(165,605,0)
+bs(105,605,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(155,785,0)
+bs(115,785,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(420,700,0)
+bs(385,700,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(420,735,0)
+bs(370,735,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(420,770,0)
+bs(370,770,0)
+lp((0.879,0,0))
+lw(1)
+b()
+bs(135,702.5,0)
+bs(135,762.5,0)
+bs(155,762.5,0)
+lp((0.879,0,0))
+lw(1)
+r(60,0,0,-15,155,770)
+lp((0.879,0,0))
+lw(1)
+r(60,0,0,-15,155,740)
+lp((0.879,0,0))
+lw(1)
+r(60,0,0,-15,155,710)
+G()
+fp((0,0.012,0.878))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QTextEdit',(46.312,601.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('child widget',(46.312,586.384))
+G_()
+G()
+fp((0,0.012,0.878))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QGroupBox',(46.312,781.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('parent widget',(46.312,766.384))
+G_()
+G()
+fp((0,0.012,0.878))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QLineEdit',(425,694.984))
+fp((0,0.012,0.878))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QTimeEdit',(425,729.984))
+fp((0,0.012,0.878))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QDateEdit',(425,764.984))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('child widget',(425,679.984))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('child widget',(425,714.984))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('child widget',(425,749.984))
+G_()
+le()
+lw(1)
+r(455,0,0,-300,40,817.5)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/pathstroke-demo.png b/doc/src/diagrams/pathstroke-demo.png
new file mode 100644
index 0000000..260488d
--- /dev/null
+++ b/doc/src/diagrams/pathstroke-demo.png
Binary files differ
diff --git a/doc/src/diagrams/patternist-importFlow.odg b/doc/src/diagrams/patternist-importFlow.odg
new file mode 100644
index 0000000..ee71214
--- /dev/null
+++ b/doc/src/diagrams/patternist-importFlow.odg
Binary files differ
diff --git a/doc/src/diagrams/patternist-wordProcessor.odg b/doc/src/diagrams/patternist-wordProcessor.odg
new file mode 100644
index 0000000..b8c603b
--- /dev/null
+++ b/doc/src/diagrams/patternist-wordProcessor.odg
Binary files differ
diff --git a/doc/src/diagrams/pbuffers-example.png b/doc/src/diagrams/pbuffers-example.png
new file mode 100644
index 0000000..cb3b041
--- /dev/null
+++ b/doc/src/diagrams/pbuffers-example.png
Binary files differ
diff --git a/doc/src/diagrams/pbuffers2-example.png b/doc/src/diagrams/pbuffers2-example.png
new file mode 100644
index 0000000..b2b408a
--- /dev/null
+++ b/doc/src/diagrams/pbuffers2-example.png
Binary files differ
diff --git a/doc/src/diagrams/plaintext-layout.png b/doc/src/diagrams/plaintext-layout.png
new file mode 100644
index 0000000..1e9e851
--- /dev/null
+++ b/doc/src/diagrams/plaintext-layout.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-dialogbuttonbox.png b/doc/src/diagrams/plastique-dialogbuttonbox.png
new file mode 100644
index 0000000..1e37cd3
--- /dev/null
+++ b/doc/src/diagrams/plastique-dialogbuttonbox.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-filedialog.png b/doc/src/diagrams/plastique-filedialog.png
new file mode 100644
index 0000000..f043ca7
--- /dev/null
+++ b/doc/src/diagrams/plastique-filedialog.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-fontcombobox-open.png b/doc/src/diagrams/plastique-fontcombobox-open.png
new file mode 100644
index 0000000..97fa569
--- /dev/null
+++ b/doc/src/diagrams/plastique-fontcombobox-open.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-fontcombobox-open.zip b/doc/src/diagrams/plastique-fontcombobox-open.zip
new file mode 100644
index 0000000..ed401cc
--- /dev/null
+++ b/doc/src/diagrams/plastique-fontcombobox-open.zip
Binary files differ
diff --git a/doc/src/diagrams/plastique-menu.png b/doc/src/diagrams/plastique-menu.png
new file mode 100644
index 0000000..5358cee
--- /dev/null
+++ b/doc/src/diagrams/plastique-menu.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-printdialog-properties.png b/doc/src/diagrams/plastique-printdialog-properties.png
new file mode 100644
index 0000000..cbeac40
--- /dev/null
+++ b/doc/src/diagrams/plastique-printdialog-properties.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-printdialog.png b/doc/src/diagrams/plastique-printdialog.png
new file mode 100644
index 0000000..f153820
--- /dev/null
+++ b/doc/src/diagrams/plastique-printdialog.png
Binary files differ
diff --git a/doc/src/diagrams/plastique-sizegrip.png b/doc/src/diagrams/plastique-sizegrip.png
new file mode 100644
index 0000000..ebc4357
--- /dev/null
+++ b/doc/src/diagrams/plastique-sizegrip.png
Binary files differ
diff --git a/doc/src/diagrams/printer-rects.sk b/doc/src/diagrams/printer-rects.sk
new file mode 100644
index 0000000..e520285
--- /dev/null
+++ b/doc/src/diagrams/printer-rects.sk
@@ -0,0 +1,114 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.879,0.879,0.879))
+lp((1,0,0))
+lw(1)
+ld((4, 4))
+r(150,0,0,-190,65,815)
+fp((0.879,0.879,0.879))
+lw(1)
+r(150,0,0,-190,250,815)
+fp((1,1,1))
+lw(1)
+r(110,0,0,-140,85,790)
+fp((1,1,1))
+le()
+lw(1)
+r(110,0,0,-140,270,790)
+fp((1,1,1))
+lp((1,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(380,695,0)
+bs(380,650,0)
+bs(345,650,0)
+bn()
+bs(305,650,0)
+bs(270,650,0)
+bs(270,790,0)
+bs(380,790,0)
+bs(380,745,0)
+le()
+lw(1)
+ld((4, 4))
+r(375,0,0,-235,45,835)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('paperRect()',(146.652,632.484))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Page coordinate system',(75.638,607.484))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Painter coordinate system',(255.64,607.484))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('pageRect()',(110.324,716.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('pageRect()',(295.324,716.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(0,-1,1,0,376.384,740))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(307,646.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(0, 0)',(66.992,801.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(0, 0)',(271.992,776.384))
+lw(1)
+b()
+bs(75,815,0)
+bs(65,815,0)
+bs(65,805,0)
+lw(1)
+b()
+bs(280,790,0)
+bs(270,790,0)
+bs(270,780,0)
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(305,650,0)
+bs(275,650,0)
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(380,695,0)
+bs(380,655,0)
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(380,745,0)
+bs(380,785,0)
+lw(1.5)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(345,650,0)
+bs(375,650,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/programs/mdiarea.py b/doc/src/diagrams/programs/mdiarea.py
new file mode 100644
index 0000000..c78659f
--- /dev/null
+++ b/doc/src/diagrams/programs/mdiarea.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+import sys
+from PyQt4.QtCore import SIGNAL
+from PyQt4.QtGui import QApplication, QColor, QIcon, QLabel, QMdiArea, QPixmap, \
+ QPushButton, QTableWidget, QTableWidgetItem, QTextEdit
+
+
+class Changer:
+
+ def __init__(self, mdiArea):
+
+ self.mdiArea = mdiArea
+ self.state = 0
+
+ def change(self):
+
+ if self.state == 0:
+ self.mdiArea.cascadeSubWindows()
+ self.mdiArea.setWindowTitle("Cascade")
+ elif self.state == 1:
+ self.mdiArea.tileSubWindows()
+ self.mdiArea.setWindowTitle("Tile")
+ self.state = (self.state + 1) % 2
+
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+ pixmap = QPixmap(16, 16)
+ pixmap.fill(QColor(0, 0, 0, 0))
+ icon = QIcon(pixmap)
+ app.setWindowIcon(icon)
+
+ mdiArea = QMdiArea()
+
+ textEdit = QTextEdit()
+ textEdit.setPlainText("Qt Quarterly is a paper-based newsletter "
+ "exclusively available to Qt customers. Every "
+ "quarter we mail out an issue that we hope will "
+ "bring added insight and pleasure to your Qt "
+ "programming, with high-quality technical articles "
+ "written by Qt experts.")
+ textWindow = mdiArea.addSubWindow(textEdit)
+ textWindow.setWindowTitle("A Text Editor")
+
+ label = QLabel()
+ label.setPixmap(QPixmap("../../images/qt-logo.png"))
+ labelWindow = mdiArea.addSubWindow(label)
+ labelWindow.setWindowTitle("A Label")
+
+ items = (("Henry", 23), ("Bill", 56), ("Susan", 19), ("Jane", 47))
+ table = QTableWidget(len(items), 2)
+
+ for i in range(len(items)):
+ name, age = items[i]
+ item = QTableWidgetItem(name)
+ table.setItem(i, 0, item)
+ item = QTableWidgetItem(str(age))
+ table.setItem(i, 1, item)
+
+ tableWindow = mdiArea.addSubWindow(table)
+ tableWindow.setWindowTitle("A Table Widget")
+
+ mdiArea.show()
+
+ changer = Changer(mdiArea)
+ button = QPushButton("Cascade")
+ button.connect(button, SIGNAL("clicked()"), changer.change)
+ button.show()
+ sys.exit(app.exec_())
diff --git a/doc/src/diagrams/programs/qpen-dashpattern.py b/doc/src/diagrams/programs/qpen-dashpattern.py
new file mode 100644
index 0000000..095d51f
--- /dev/null
+++ b/doc/src/diagrams/programs/qpen-dashpattern.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+import sys
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+from PyQt4.QtSvg import QSvgGenerator
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+
+ #device = QSvgGenerator()
+ #device.setFileName("qpen-dashpattern.svg")
+ #device.setSize(QSize(216, 144))
+ #device.setResolution(72)
+
+ device = QImage(192, 144, QImage.Format_ARGB32)
+ device.fill(qRgba(0, 0, 0, 0))
+
+ #resolution = device.resolution() # dpi
+ #dpp = resolution / 72.0
+
+ p = QPainter()
+ p.begin(device)
+
+ width = 8
+
+ pen = QPen()
+ pen.setWidth(width)
+ pen.setDashPattern([4, 2])
+ pen.setCapStyle(Qt.FlatCap)
+
+ faded_pen = QPen()
+ faded_pen.setWidth(width)
+ faded_pen.setDashPattern([4, 2])
+ faded_pen.setColor(QColor(160, 160, 160))
+ faded_pen.setCapStyle(Qt.FlatCap)
+
+ font = QFont("Monospace")
+ font.setPointSize(12)
+ p.setFont(font)
+ p.setBrush(QColor(160, 0, 0))
+
+ for x in range(-6, 9):
+
+ if x % 4 == 0:
+ length = 6
+ else:
+ length = 2
+
+ p.drawLine(64 + x * width, 4, 64 + x * width, 4 + length)
+ p.drawLine(64 + x * width, 136, 64 + x * width, 136 - length)
+
+ offsets = (0, 2, 3.5, 4, 5, 6)
+ for i in range(len(offsets)):
+
+ offset = offsets[i]
+ pen.setDashOffset(offset)
+
+ p.setPen(faded_pen)
+ p.drawLine(64 - offset * width, 20 + (i * 20), 64, 20 + (i * 20))
+
+ p.setPen(pen)
+ p.drawLine(64, 20 + (i * 20), 128, 20 + (i * 20))
+
+ p.drawText(150, 25 + (i * 20), str(offset))
+
+ p.end()
+ device.save("qpen-dashpattern.png")
+ sys.exit()
diff --git a/doc/src/diagrams/qactiongroup-align.png b/doc/src/diagrams/qactiongroup-align.png
new file mode 100644
index 0000000..f35b48b
--- /dev/null
+++ b/doc/src/diagrams/qactiongroup-align.png
Binary files differ
diff --git a/doc/src/diagrams/qcolor-cmyk.sk b/doc/src/diagrams/qcolor-cmyk.sk
new file mode 100644
index 0000000..593861e
--- /dev/null
+++ b/doc/src/diagrams/qcolor-cmyk.sk
@@ -0,0 +1,77 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+e(95,0,0,-95.125,174.638,717.57)
+lw(1)
+b()
+bs(257.335,764.341,0)
+bs(91.9083,670.173,0)
+lw(1)
+b()
+bs(256.594,669.129,0)
+bs(91.8985,764.386,0)
+lw(1)
+b()
+bs(174.388,811.945,0)
+bs(174.388,621.445,0)
+fp((0,1,0))
+lw(1)
+r(15.7306,27.291,27.291,-15.7306,71.4706,757.982)
+fp((1,0.976,0))
+lw(1)
+r(31.5,0,0,-31.5,158.638,827.695)
+fp((1,0,0))
+lw(1)
+r(15.5923,-27.3702,-27.3702,-15.5923,262.67,785.579)
+fp((0.993,0,1))
+lw(1)
+r(15.7306,27.291,-27.291,15.7306,262.074,648.117)
+fp((0,0,1))
+lw(1)
+r(31.5,0,0,31.5,158.638,607.695)
+fp((0,1,0.98))
+lw(1)
+r(15.5923,-27.3702,27.3702,15.5923,71.5131,676.681)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 0, 1, 0)',(195.97,820.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 1, 0, 0)',(271.47,685.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 1, 1, 0)',(273.47,740.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(1, 1, 0, 0)',(197.47,609.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(1, 0, 0, 0)',(9.9698,687.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(1, 0, 1, 0)',(10.4698,737.445))
+le()
+lw(1)
+r(347.295,0,0,-250.844,0.969879,841.052)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qcolor-hsv.sk b/doc/src/diagrams/qcolor-hsv.sk
new file mode 100644
index 0000000..bc455e5
--- /dev/null
+++ b/doc/src/diagrams/qcolor-hsv.sk
@@ -0,0 +1,77 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+e(95,0,0,-95.125,188.71,717.57)
+lw(1)
+b()
+bs(271.407,764.341,0)
+bs(105.98,670.173,0)
+lw(1)
+b()
+bs(270.666,669.129,0)
+bs(105.97,764.386,0)
+lw(1)
+b()
+bs(188.46,811.945,0)
+bs(188.46,621.445,0)
+fp((0,1,0))
+lw(1)
+r(15.7306,27.291,27.291,-15.7306,85.5423,757.982)
+fp((1,0.976,0))
+lw(1)
+r(31.5,0,0,-31.5,172.71,827.695)
+fp((1,0,0))
+lw(1)
+r(15.5923,-27.3702,-27.3702,-15.5923,276.742,785.579)
+fp((0.993,0,1))
+lw(1)
+r(15.7306,27.291,-27.291,15.7306,276.146,648.117)
+fp((0,0,1))
+lw(1)
+r(31.5,0,0,31.5,172.71,607.695)
+fp((0,1,0.98))
+lw(1)
+r(15.5923,-27.3702,27.3702,15.5923,85.5848,676.681)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(60/360, 1, 1)',(210.042,820.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(300/360, 1, 1)',(285.542,685.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 1, 1)',(287.542,740.825))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(240/360, 1, 1)',(211.542,609.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(180/360, 1, 1)',(3.76462,685.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(120/360, 1, 1)',(3.17503,740.825))
+le()
+lw(1)
+r(347.295,0,0,-250.844,14.9326,840.981)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qcolor-hue.sk b/doc/src/diagrams/qcolor-hue.sk
new file mode 100644
index 0000000..9bb503d
--- /dev/null
+++ b/doc/src/diagrams/qcolor-hue.sk
@@ -0,0 +1,71 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+e(82.602,-46.9244,-46.9862,-82.7107,209.03,683.511)
+lw(1)
+b()
+bs(304.537,682.094,0)
+bs(114.185,681.927,0)
+lw(1)
+b()
+bs(256.363,600.91,0)
+bs(160.213,765.086,0)
+lw(1)
+b()
+bs(255.428,765.693,0)
+bs(161.333,600.054,0)
+fp((0,1,0))
+lw(1)
+r(27.1578,15.9594,15.9594,-27.1578,139.288,769.608)
+fp((1,0.976,0))
+lw(1)
+r(27.3891,-15.5592,-15.5592,-27.3891,249.513,787.167)
+fp((1,0,0))
+lw(1)
+r(0.0381551,-31.4999,-31.4999,-0.0381551,319.166,699.162)
+fp((0.993,0,1))
+lw(1)
+r(27.1578,15.9594,-15.9594,27.1578,250.75,579.934)
+fp((0,0,1))
+lw(1)
+r(27.3891,-15.5592,15.5592,27.3891,140.846,595.878)
+fp((0,1,0.98))
+lw(1)
+r(0.0381551,-31.4999,31.4999,0.0381551,99.1666,698.896)
+le()
+lw(1)
+r(347.295,0,0,-250.844,34.848,809.427)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('180',(75.6378,678.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('240',(125.638,582.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('300',(274.638,582.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('120',(132.138,780.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('0',(326.138,678.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('60',(267.638,780.945))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qcolor-rgb.sk b/doc/src/diagrams/qcolor-rgb.sk
new file mode 100644
index 0000000..58f5cad
--- /dev/null
+++ b/doc/src/diagrams/qcolor-rgb.sk
@@ -0,0 +1,77 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+e(95,0,0,-95.125,174.638,717.57)
+lw(1)
+b()
+bs(257.335,764.341,0)
+bs(91.9083,670.173,0)
+lw(1)
+b()
+bs(256.594,669.129,0)
+bs(91.8985,764.386,0)
+lw(1)
+b()
+bs(174.388,811.945,0)
+bs(174.388,621.445,0)
+fp((0,1,0))
+lw(1)
+r(15.7306,27.291,27.291,-15.7306,71.4706,757.982)
+fp((1,0.976,0))
+lw(1)
+r(31.5,0,0,-31.5,158.638,827.695)
+fp((1,0,0))
+lw(1)
+r(15.5923,-27.3702,-27.3702,-15.5923,262.67,785.579)
+fp((0.993,0,1))
+lw(1)
+r(15.7306,27.291,-27.291,15.7306,262.074,648.117)
+fp((0,0,1))
+lw(1)
+r(31.5,0,0,31.5,158.638,607.695)
+fp((0,1,0.98))
+lw(1)
+r(15.5923,-27.3702,27.3702,15.5923,71.5131,676.681)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(1, 1, 0)',(195.97,820.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(1, 0, 1)',(271.47,685.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(1, 0, 0)',(273.47,741.824))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 0, 1)',(197.47,609.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 1, 1)',(26.5236,685.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('(0, 1, 0)',(23.5056,741.824))
+le()
+lw(1)
+r(347.295,0,0,-250.844,0.969879,840.811)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qcolor-saturation.sk b/doc/src/diagrams/qcolor-saturation.sk
new file mode 100644
index 0000000..7842769
--- /dev/null
+++ b/doc/src/diagrams/qcolor-saturation.sk
@@ -0,0 +1,26 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+gl([(0,(1,1,1)),(1,(0,0,1))])
+pgl(-1,-0.00066387,0)
+fp()
+le()
+lw(1)
+r(0.0128449,-19.3485,-146.873,-0.0975046,211.927,793.765)
+lw(1)
+e(0,0,0,0,92.8878,797.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(9)
+txt('0',(62.6378,762.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(9)
+txt('255',(196.638,762.445))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qcolor-value.sk b/doc/src/diagrams/qcolor-value.sk
new file mode 100644
index 0000000..203befd
--- /dev/null
+++ b/doc/src/diagrams/qcolor-value.sk
@@ -0,0 +1,26 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+gl([(0,(1,1,1)),(1,(0,0,0))])
+pgl(1,-0.00066387,0)
+fp()
+le()
+lw(1)
+r(-0.0128449,-19.3485,146.873,-0.0975046,65.0669,793.765)
+lw(1)
+e(0,0,0,0,92.8878,797.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(9)
+txt('0',(62.6378,762.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(9)
+txt('255',(196.638,762.445))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qfiledialog-expanded.png b/doc/src/diagrams/qfiledialog-expanded.png
new file mode 100644
index 0000000..6473e21
--- /dev/null
+++ b/doc/src/diagrams/qfiledialog-expanded.png
Binary files differ
diff --git a/doc/src/diagrams/qfiledialog-small.png b/doc/src/diagrams/qfiledialog-small.png
new file mode 100644
index 0000000..92ed546
--- /dev/null
+++ b/doc/src/diagrams/qfiledialog-small.png
Binary files differ
diff --git a/doc/src/diagrams/qframe-shapes-table.ui b/doc/src/diagrams/qframe-shapes-table.ui
new file mode 100644
index 0000000..371327f
--- /dev/null
+++ b/doc/src/diagrams/qframe-shapes-table.ui
@@ -0,0 +1,12964 @@
+<ui version="4.0" >
+ <author></author>
+ <comment></comment>
+ <exportmacro></exportmacro>
+ <class>Form</class>
+ <widget class="QWidget" name="Form" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>656</width>
+ <height>664</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <widget class="QFrame" name="frame_2" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_3" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_4" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_6" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_8" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_7" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_5" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_9" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_11" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_12" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_10" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_16" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_14" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_13" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_15" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_18" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_32" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_28" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_17" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_27" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_29" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_21" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_26" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_23" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_20" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_24" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_30" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_19" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_25" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_31" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_22" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>100</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_33" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_37" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_40" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_44" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_41" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_45" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_38" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_34" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_47" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_39" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_36" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_48" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_42" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_35" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_64" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_91" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_62" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_95" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_75" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_81" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_66" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_84" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_79" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_76" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_71" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_83" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_94" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_58" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_82" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_96" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_61" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_88" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_89" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_92" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_49" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_87" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_77" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_70" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_85" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_78" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_54" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_51" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_73" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_63" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_74" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_69" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_90" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_67" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_93" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_52" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_55" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_86" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_72" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_50" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_65" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_80" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_56" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_59" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_131" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_145" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_146" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_147" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_148" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_149" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_150" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_151" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_152" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_153" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_154" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_155" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_156" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_157" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_158" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_160" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_161" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_162" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_163" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_164" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_165" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_166" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_167" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_168" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_169" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_170" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_171" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_172" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_173" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_174" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_175" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_176" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_178" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_179" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_180" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_181" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_183" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_184" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_186" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_187" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_188" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_189" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_190" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>600</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_191" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_192" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_125" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_142" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_104" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_138" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_100" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_130" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_121" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_105" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_103" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_119" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_132" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_127" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_137" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_140" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_143" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_118" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_113" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_120" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_117" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_102" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_116" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_134" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_112" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_122" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_135" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_99" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_144" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_115" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_111" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>300</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_123" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_114" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_97" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_106" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_129" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_124" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_98" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_108" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_101" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_136" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_109" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_139" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_110" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_133" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_141" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_185" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_177" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_68" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>200</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_46" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_208" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_235" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_206" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_239" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_219" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_225" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_210" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_228" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_223" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_220" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_227" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_238" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_202" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_201" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_212" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_226" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_240" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_205" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_232" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_233" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_236" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_193" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_231" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_221" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_214" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_229" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_222" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_198" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_195" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_217" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>400</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_207" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_218" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_213" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_234" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_211" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_237" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_196" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_199" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_203" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_216" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_194" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_209" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_224" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_230" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_215" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_266" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_255" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_264" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_265" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_276" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_246" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_243" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_248" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_245" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_283" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_280" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_241" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_275" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_272" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_261" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_279" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_253" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_277" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_286" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_281" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_259" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_273" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>2</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_267" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_263" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_282" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_278" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_244" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_249" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_268" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_287" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_271" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_252" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_269" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_250" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>3</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_274" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_288" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_284" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_254" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_258" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_247" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_262" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_251" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_257" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_285" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>500</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Raised</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_242" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_107" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_159" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>630</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_270" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>530</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_182" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>570</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_197" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_256" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_126" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>330</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_204" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>370</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_53" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>230</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_43" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>130</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_60" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_23" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>73</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Box, Plain</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_24" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>103</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Box, Raised</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_25" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>133</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Box, Sunken</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_57" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>170</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_128" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>270</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::WinPanel</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_31" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>273</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>WinPanel, Plain</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_30" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>303</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>WinPanel, Raised</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_29" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>333</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>WinPanel, Sunken</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_32" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>372</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>HLine, Plain</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_33" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>402</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>HLine, Raised</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_34" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>432</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>HLine, Sunken</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_37" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>472</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>VLine, Plain</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_36" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>502</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>VLine, Raised</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_35" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>532</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>VLine, Sunken</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_260" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>470</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::VLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame_200" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>430</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::HLine</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth" >
+ <number>4</number>
+ </property>
+ <property name="midLineWidth" >
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_28" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>173</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Panel, Plain</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_26" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>203</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Panel, Raised</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_27" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>233</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Panel, Sunken</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_40" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>573</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>StyledPanel, Plain</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_39" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>603</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>StyledPanel, Raised</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_38" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>633</y>
+ <width>146</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>StyledPanel, Sunken</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ <widget class="QFrame" name="frame" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>70</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::Box</enum>
+ </property>
+ <property name="frameShadow" >
+ <enum>QFrame::Plain</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_16" >
+ <property name="geometry" >
+ <rect>
+ <x>460</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_12" >
+ <property name="geometry" >
+ <rect>
+ <x>430</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_8" >
+ <property name="geometry" >
+ <rect>
+ <x>400</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_41" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_15" >
+ <property name="geometry" >
+ <rect>
+ <x>340</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_11" >
+ <property name="geometry" >
+ <rect>
+ <x>310</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_7" >
+ <property name="geometry" >
+ <rect>
+ <x>280</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_4" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_14" >
+ <property name="geometry" >
+ <rect>
+ <x>220</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_10" >
+ <property name="geometry" >
+ <rect>
+ <x>190</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_6" >
+ <property name="geometry" >
+ <rect>
+ <x>160</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_5" >
+ <property name="geometry" >
+ <rect>
+ <x>40</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_9" >
+ <property name="geometry" >
+ <rect>
+ <x>70</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_13" >
+ <property name="geometry" >
+ <rect>
+ <x>100</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_17" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>114</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>40</y>
+ <width>24</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>0</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_18" >
+ <property name="geometry" >
+ <rect>
+ <x>130</x>
+ <y>10</y>
+ <width>114</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>1</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_19" >
+ <property name="geometry" >
+ <rect>
+ <x>250</x>
+ <y>10</y>
+ <width>114</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>2</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_20" >
+ <property name="geometry" >
+ <rect>
+ <x>370</x>
+ <y>10</y>
+ <width>114</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="autoFillBackground" >
+ <bool>true</bool>
+ </property>
+ <property name="frameShape" >
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="text" >
+ <string>3</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_22" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>42</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>79</green>
+ <blue>175</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>79</green>
+ <blue>175</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>midLineWidth()</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_21" >
+ <property name="geometry" >
+ <rect>
+ <x>500</x>
+ <y>12</y>
+ <width>141</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="palette" >
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>79</green>
+ <blue>175</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </active>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>79</green>
+ <blue>175</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>103</red>
+ <green>141</green>
+ <blue>178</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </inactive>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>221</red>
+ <green>223</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>85</red>
+ <green>85</green>
+ <blue>85</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>199</red>
+ <green>199</green>
+ <blue>199</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>239</red>
+ <green>239</green>
+ <blue>239</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>86</red>
+ <green>117</green>
+ <blue>148</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>238</blue>
+ </color>
+ <color>
+ <red>82</red>
+ <green>24</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>232</red>
+ <green>232</green>
+ <blue>232</blue>
+ </color>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font" >
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>11</pointsize>
+ <weight>50</weight>
+ <italic>false</italic>
+ <bold>false</bold>
+ <underline>false</underline>
+ <strikeout>false</strikeout>
+ </font>
+ </property>
+ <property name="text" >
+ <string>lineWidth()</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ </widget>
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/doc/src/diagrams/qimage-32bit.sk b/doc/src/diagrams/qimage-32bit.sk
new file mode 100644
index 0000000..0c19197
--- /dev/null
+++ b/doc/src/diagrams/qimage-32bit.sk
@@ -0,0 +1,18 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+G()
+lw(1)
+r(200,0,0,-200,21.921,817.509)
+lw(1)
+r(134.5,0,0,-133.5,87.421,751.009)
+lw(1)
+r(132.5,0,0,-134,21.921,817.509)
+lw(1)
+r(65.5,0,0,-66.5,21.921,817.509)
+lw(1)
+r(67.5,0,0,-66,154.421,683.509)
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qimage-8bit.sk b/doc/src/diagrams/qimage-8bit.sk
new file mode 100644
index 0000000..a08a122
--- /dev/null
+++ b/doc/src/diagrams/qimage-8bit.sk
@@ -0,0 +1,50 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+G()
+lw(1)
+r(200,0,0,-200,14.2453,827.844)
+lw(1)
+r(134.5,0,0,-133.5,79.7453,761.344)
+lw(1)
+r(132.5,0,0,-134,14.2453,827.844)
+lw(1)
+r(65.5,0,0,-66.5,14.2453,827.844)
+lw(1)
+r(67.5,0,0,-66,146.745,693.844)
+G_()
+lw(1)
+r(65.5,0,0,-24.875,243.995,827.344)
+lw(1)
+r(20.5,0,0,-24.875,223.875,827.344)
+lw(1)
+r(65.5,0,0,-24.875,243.995,727.844)
+lw(1)
+r(20.5,0,0,-24.875,223.875,727.844)
+lw(1)
+r(65.5,0,0,-24.875,243.995,777.594)
+lw(1)
+r(20.5,0,0,-24.875,223.875,777.594)
+lw(1)
+r(65.5,0,0,-24.875,243.995,678.094)
+lw(1)
+r(20.5,0,0,-24.875,223.875,678.094)
+lw(1)
+r(65.5,0,0,-24.875,243.995,802.469)
+lw(1)
+r(20.5,0,0,-24.875,223.875,802.469)
+lw(1)
+r(65.5,0,0,-24.875,243.995,702.969)
+lw(1)
+r(20.5,0,0,-24.875,223.875,702.969)
+lw(1)
+r(65.5,0,0,-24.875,243.995,752.719)
+lw(1)
+r(20.5,0,0,-24.875,223.875,752.719)
+lw(1)
+r(65.5,0,0,-24.875,243.995,653.219)
+lw(1)
+r(20.5,0,0,-24.875,223.875,653.219)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qline-coordinates.sk b/doc/src/diagrams/qline-coordinates.sk
new file mode 100644
index 0000000..1f741f3
--- /dev/null
+++ b/doc/src/diagrams/qline-coordinates.sk
@@ -0,0 +1,61 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(2)
+b()
+bs(138.776,520.124,0)
+bs(319.58,700.927,0)
+fp((0.254,0.664,0.072))
+lw(1)
+e(6.02587,0,0,-6.0259,316.516,698.083)
+fp((0.254,0.664,0.072))
+lw(1)
+e(6.02587,0,0,-6.0259,139.569,520.916)
+lw(1)
+b()
+bs(139.654,500.815,0)
+bs(139.654,498.287,0)
+bs(139.654,479.75,0)
+bs(212.502,479.75,0)
+lw(1)
+b()
+bs(320.458,499.937,0)
+bs(320.458,479.75,0)
+bs(248.487,479.75,0)
+lw(1)
+b()
+bs(120.345,700.05,0)
+bs(100.158,700.05,0)
+bs(100.158,628.079,0)
+lw(1)
+b()
+bs(99.2803,590.339,0)
+bs(99.2803,589.306,0)
+bs(99.2803,520.124,0)
+bs(121.222,520.124,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('dx()',(219.524,477.117))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('dy()',(90.5034,606.137))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('x1(), y1()',(80.8488,499.059))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('x2(), y2()',(244.099,690.395))
+le()
+lw(1)
+r(320,0,0,-300,59.7843,740.254)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qline-point.sk b/doc/src/diagrams/qline-point.sk
new file mode 100644
index 0000000..d62303f
--- /dev/null
+++ b/doc/src/diagrams/qline-point.sk
@@ -0,0 +1,61 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(2)
+b()
+bs(138.776,520.124,0)
+bs(319.58,700.927,0)
+lw(1)
+b()
+bs(139.654,500.815,0)
+bs(139.654,498.287,0)
+bs(139.654,479.75,0)
+bs(212.502,479.75,0)
+lw(1)
+b()
+bs(320.458,499.937,0)
+bs(320.458,479.75,0)
+bs(248.487,479.75,0)
+lw(1)
+b()
+bs(120.345,700.05,0)
+bs(100.158,700.05,0)
+bs(100.158,628.079,0)
+lw(1)
+b()
+bs(99.2803,590.339,0)
+bs(99.2803,589.306,0)
+bs(99.2803,520.124,0)
+bs(121.222,520.124,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('dx()',(219.524,477.117))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('dy()',(90.5034,606.137))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('p1()',(104.546,497.304))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('p2()',(299.393,661.431))
+fp((0.254,0.664,0.072))
+lw(1)
+e(6.02587,0,0,-6.0259,138.219,520.006)
+fp((0.254,0.664,0.072))
+lw(1)
+e(6.02587,0,0,-6.0259,319.369,700.716)
+le()
+lw(1)
+r(320,0,0,-300,59.6378,739.945)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qlinef-angle-identicaldirection.sk b/doc/src/diagrams/qlinef-angle-identicaldirection.sk
new file mode 100644
index 0000000..5064938
--- /dev/null
+++ b/doc/src/diagrams/qlinef-angle-identicaldirection.sk
@@ -0,0 +1,28 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+b()
+bs(4.13779,835.945,0)
+bs(105.138,784.445,0)
+lw(1)
+b()
+bs(3.88779,783.695,0)
+bs(104.888,835.195,0)
+lw(1)
+b()
+bs(104.638,834.945,0)
+bs(94.3878,833.945,0)
+bs(104.638,829.945,0)
+bs(104.388,834.195,0)
+lw(1)
+b()
+bs(4.13779,836.195,0)
+bs(14.3878,835.195,0)
+bs(4.13779,831.195,0)
+bs(4.38779,835.445,0)
+lw(1)
+e(22.5,0,0,-11.5,55.1378,810.445)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qlinef-angle-oppositedirection.sk b/doc/src/diagrams/qlinef-angle-oppositedirection.sk
new file mode 100644
index 0000000..69fa46d
--- /dev/null
+++ b/doc/src/diagrams/qlinef-angle-oppositedirection.sk
@@ -0,0 +1,28 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+b()
+bs(4.13779,835.945,0)
+bs(105.138,784.445,0)
+lw(1)
+b()
+bs(3.88779,783.695,0)
+bs(104.888,835.195,0)
+lw(1)
+b()
+bs(4.13779,783.695,0)
+bs(14.3878,784.695,0)
+bs(4.13779,788.695,0)
+bs(4.38779,784.445,0)
+lw(1)
+b()
+bs(4.13779,836.195,0)
+bs(14.3878,835.195,0)
+bs(4.13779,831.195,0)
+bs(4.38779,835.445,0)
+lw(1)
+e(22.5,0,0,-11.5,55.1378,810.445)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qlistview.png b/doc/src/diagrams/qlistview.png
new file mode 100644
index 0000000..986fbc5
--- /dev/null
+++ b/doc/src/diagrams/qlistview.png
Binary files differ
diff --git a/doc/src/diagrams/qmatrix.sk b/doc/src/diagrams/qmatrix.sk
new file mode 100644
index 0000000..83bb4a6
--- /dev/null
+++ b/doc/src/diagrams/qmatrix.sk
@@ -0,0 +1,74 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lp((0,0.174,1))
+lw(1)
+r(90,0,0,-90,12.1378,827.945)
+lp((0,0.054,1))
+lw(1)
+b()
+bs(41.6378,827.945,0)
+bs(41.6378,737.945,0)
+lp((0,0.054,1))
+lw(1)
+b()
+bs(11.6378,797.445,0)
+bs(101.638,797.445,0)
+lp((0,0.054,1))
+lw(1)
+b()
+bs(11.6378,767.945,0)
+bs(101.638,767.945,0)
+lp((0.007,0.06,1))
+lw(1)
+b()
+bs(71.6378,827.445,0)
+bs(71.6378,738.445,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('m11',(15.8878,806.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('m12',(45.8878,806.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('m22',(45.8878,777.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('m21',(15.8878,777.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('dx',(21.2218,747.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('dy',(51.2218,747.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(82.6378,747.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('0',(82.6378,806.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('0',(82.6378,777.945))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qpainter-pathstroking.png b/doc/src/diagrams/qpainter-pathstroking.png
new file mode 100644
index 0000000..4896a11
--- /dev/null
+++ b/doc/src/diagrams/qpainter-pathstroking.png
Binary files differ
diff --git a/doc/src/diagrams/qrect-coordinates.sk b/doc/src/diagrams/qrect-coordinates.sk
new file mode 100644
index 0000000..4c0792d
--- /dev/null
+++ b/doc/src/diagrams/qrect-coordinates.sk
@@ -0,0 +1,102 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('topLeft()',(91.1378,721.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('topRight()',(271.642,721.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('bottomRight()',(251.638,593.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('bottomLeft()',(71.1338,593.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left()',(135.138,518.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right()',(317.138,518.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('top()',(405.142,709.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('bottom()',(405.142,583.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('x(), y()',(153.138,696.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('center()',(224.638,652.945))
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(145.138,742.445,0)
+bs(145.138,529.945,0)
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(329.638,744.445,0)
+bs(329.638,530.945,0)
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(401.138,587.945,0)
+bs(67.1378,587.945,0)
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(398.138,713.445,0)
+bs(68.1378,713.445,0)
+lw(1)
+r(197.5,0,0,-137.5,145.138,713.445)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,144.638,713.445)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,144.638,588.945)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,329.638,587.945)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,242.638,646.945)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,329.138,713.445)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrect-diagram-one.sk b/doc/src/diagrams/qrect-diagram-one.sk
new file mode 100644
index 0000000..0396d80
--- /dev/null
+++ b/doc/src/diagrams/qrect-diagram-one.sk
@@ -0,0 +1,69 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(400.24,0,0,-299.507,39.5975,801.199)
+fp((0.228,0.228,0.228))
+lw(1)
+r(228.418,0,0,-163.469,128.024,741.52)
+fp((1,1,1))
+lw(1)
+r(188.922,0,0,-121.779,149.309,720.237)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,319.305,616.689)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(52.7628,664.942))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left(), top()',(108.935,771.142))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right(), bottom()',(345.033,544.699))
+G()
+lw(1)
+b()
+bs(112.866,598.944,0)
+bs(83.0108,598.944,0)
+bs(83.0108,649.497,0)
+bs(83.0108,652.933,0)
+lw(1)
+b()
+bs(82.5719,684.034,0)
+bs(82.5719,742.871,0)
+bs(112.2,742.871,0)
+G_()
+lw(1)
+b()
+bs(129.505,573.041,0)
+bs(129.505,540.72,0)
+bs(203.382,540.72,0)
+lw(1)
+b()
+bs(337.804,572.907,0)
+bs(337.797,540.759,0)
+bs(262.698,540.759,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(214.257,537.543))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-42.3082,0)
+guide(437.823,1)
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrect-diagram-three.sk b/doc/src/diagrams/qrect-diagram-three.sk
new file mode 100644
index 0000000..77be4ee
--- /dev/null
+++ b/doc/src/diagrams/qrect-diagram-three.sk
@@ -0,0 +1,67 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(400.24,0,0,-299.507,39.5975,801.199)
+lw(1)
+b()
+bs(124.239,550.355,0)
+bs(124.239,518.034,0)
+bs(199.871,518.034,0)
+lw(1)
+b()
+bs(336.049,550.221,0)
+bs(336.042,518.073,0)
+bs(260.943,518.073,0)
+lw(1)
+b()
+bs(103.65,598.944,0)
+bs(73.795,598.944,0)
+bs(73.795,649.497,0)
+bs(73.795,652.933,0)
+lw(1)
+b()
+bs(73.3561,684.034,0)
+bs(73.3561,742.871,0)
+bs(102.984,742.871,0)
+fp((0.228,0.228,0.228))
+lw(1)
+r(275.594,0,0,-203.623,107.179,759.732)
+fp((1,1,1))
+lw(1)
+r(145.696,0,0,-80.7471,168.618,700.928)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,311.59,622.904)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(52.7628,664.942))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(208.991,514.857))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left(), top()',(108.935,771.142))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right(), bottom()',(345.911,537.678))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-42.3082,0)
+guide(458.887,1)
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrect-diagram-two.sk b/doc/src/diagrams/qrect-diagram-two.sk
new file mode 100644
index 0000000..4447923
--- /dev/null
+++ b/doc/src/diagrams/qrect-diagram-two.sk
@@ -0,0 +1,67 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(400.24,0,0,-299.507,39.5975,801.199)
+lw(1)
+b()
+bs(125.117,574.053,0)
+bs(125.117,541.732,0)
+bs(200.749,541.732,0)
+lw(1)
+b()
+bs(335.171,573.919,0)
+bs(335.164,541.771,0)
+bs(260.065,541.771,0)
+lw(1)
+b()
+bs(103.65,598.944,0)
+bs(73.795,598.944,0)
+bs(73.795,649.497,0)
+bs(73.795,652.933,0)
+lw(1)
+b()
+bs(73.3561,684.034,0)
+bs(73.3561,742.871,0)
+bs(102.984,742.871,0)
+fp((0.228,0.228,0.228))
+lw(1)
+r(249.263,0,0,-181.681,107.179,759.732)
+fp((1,1,1))
+lw(1)
+r(165.005,0,0,-103.567,149.309,720.237)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,314.228,619.387)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(52.7628,664.942))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(211.624,538.555))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left(), top()',(108.935,771.142))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right(), bottom()',(345.033,544.699))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-42.3082,0)
+guide(600.195,1)
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrect-diagram-zero.sk b/doc/src/diagrams/qrect-diagram-zero.sk
new file mode 100644
index 0000000..d5198dc
--- /dev/null
+++ b/doc/src/diagrams/qrect-diagram-zero.sk
@@ -0,0 +1,48 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+b()
+bs(109.757,614.427,0)
+bs(109.757,582.106,0)
+bs(191.533,582.106,0)
+lw(1)
+b()
+bs(319.372,614.732,0)
+bs(319.366,582.584,0)
+bs(244.266,582.584,0)
+lw(1)
+b()
+bs(95.7507,625.714,0)
+bs(65.8958,625.714,0)
+bs(65.8958,676.267,0)
+bs(65.8958,679.703,0)
+lw(1)
+b()
+bs(65.8958,708.171,0)
+bs(65.8958,768.763,0)
+bs(98.1562,768.763,0)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,111.196,769.222)
+lw(1)
+r(0,0,0,0,288.422,731.646)
+lw(1)
+r(0,0,0,0,264.724,735.596)
+lw(1)
+r(0,0,0,0,241.027,741.301)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(198.459,578.929))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(45.7413,688.64))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-63.3727,0)
+guide(433.434,1)
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrect-intersect.sk b/doc/src/diagrams/qrect-intersect.sk
new file mode 100644
index 0000000..7e5da3e
--- /dev/null
+++ b/doc/src/diagrams/qrect-intersect.sk
@@ -0,0 +1,62 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.378,0.772,0.399))
+lw(1)
+r(200.113,0,0,-119.366,79.9711,759.732)
+fp((0.49,0.49,0.49))
+lw(1)
+r(200.113,0,0,-120.243,159.841,700.05)
+fp((0.491,0.625,0.785))
+lp((0.732,0.198,0.029))
+lw(2)
+r(120.243,0,0,-59.6828,159.841,700.05)
+lw(1)
+b()
+bs(379.702,700.05,0)
+bs(400.327,700.05,0)
+bs(400.327,679.424,0)
+lw(1)
+b()
+bs(380.14,639.489,0)
+bs(380.14,639.938,0)
+bs(399.888,639.938,0)
+bs(399.888,660.115,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('r.intersect(s).height()',(377.638,666.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('r',(84.6378,624.945))
+lw(1)
+b()
+bs(160.138,779.945,0)
+bs(160.138,800.445,0)
+bs(180.138,800.445,0)
+lw(1)
+b()
+bs(260.138,799.445,0)
+bs(280.138,799.445,0)
+bs(280.138,779.445,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('r.intersect(s).',(187.138,802.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(200.638,790.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('s',(145.207,584.51))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrect-unite.sk b/doc/src/diagrams/qrect-unite.sk
new file mode 100644
index 0000000..975183b
--- /dev/null
+++ b/doc/src/diagrams/qrect-unite.sk
@@ -0,0 +1,63 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.47,0.47,0.47))
+lw(1)
+r(200.113,0,0,-120.243,159.841,700.05)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('r',(84.6378,624.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('s',(149.138,584.945))
+fp((0.378,0.772,0.399))
+lw(1)
+r(200.113,0,0,-119.366,79.9711,759.732)
+lw(1)
+b()
+bs(80.1378,778.445,0)
+bs(80.1378,799.445,0)
+bs(160.138,799.445,0)
+lw(1)
+b()
+bs(360.138,779.945,0)
+bs(360.138,799.945,0)
+bs(279.638,799.945,0)
+lw(1)
+b()
+bs(380.138,759.924,0)
+bs(380.138,760.445,0)
+bs(400.138,760.445,0)
+bs(400.138,698.945,0)
+lw(1)
+b()
+bs(380.138,579.945,0)
+bs(400.138,579.945,0)
+bs(400.138,641.445,0)
+lp((0.819,0.075,0.043))
+lw(2)
+r(280,0,0,-180,80.1378,759.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('r.united(s).width()',(179.638,796.945))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(380.638,661.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('r.united(s).',(375.638,675.445))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrectf-coordinates.sk b/doc/src/diagrams/qrectf-coordinates.sk
new file mode 100644
index 0000000..76223c2
--- /dev/null
+++ b/doc/src/diagrams/qrectf-coordinates.sk
@@ -0,0 +1,102 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('topLeft()',(90.6378,721.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('topRight()',(349.638,721.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('bottomRight()',(349.638,560.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('bottomLeft()',(70.6338,560.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left()',(135.138,519.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right()',(327.638,519.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('top()',(446.142,708.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('bottom()',(447.142,570.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('x(), y()',(153.138,696.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('center()',(225.138,630.445))
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(145.138,742.445,0)
+bs(145.138,529.945,0)
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(342.638,745.445,0)
+bs(342.638,531.945,0)
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(441.638,575.945,0)
+bs(68.1378,575.945,0)
+lp((0.866,0,0))
+lw(1)
+ld((4, 4))
+b()
+bs(436.138,713.445,0)
+bs(68.1378,713.445,0)
+lw(1)
+r(197.5,0,0,-137.5,145.138,713.445)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,144.638,713.445)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,144.638,575.945)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,342.138,576.445)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,242.638,646.945)
+fp((0.852,0,0))
+le()
+lw(1)
+e(3,0,0,-3,342.638,713.945)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,20,20),0,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrectf-diagram-one.sk b/doc/src/diagrams/qrectf-diagram-one.sk
new file mode 100644
index 0000000..4e445dd
--- /dev/null
+++ b/doc/src/diagrams/qrectf-diagram-one.sk
@@ -0,0 +1,69 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(400.24,0,0,-299.507,39.5975,801.199)
+fp((0.228,0.228,0.228))
+lw(1)
+r(228.418,0,0,-163.469,128.024,741.52)
+fp((1,1,1))
+lw(1)
+r(188.922,0,0,-121.779,149.309,720.237)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,336.256,599.116)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(52.7628,664.942))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left(), top()',(108.935,771.142))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right(), bottom()',(345.911,559.62))
+G()
+lw(1)
+b()
+bs(112.866,598.944,0)
+bs(83.0108,598.944,0)
+bs(83.0108,649.497,0)
+bs(83.0108,652.933,0)
+lw(1)
+b()
+bs(82.5719,684.034,0)
+bs(82.5719,742.871,0)
+bs(112.2,742.871,0)
+G_()
+lw(1)
+b()
+bs(129.505,573.041,0)
+bs(129.505,540.72,0)
+bs(203.382,540.72,0)
+lw(1)
+b()
+bs(337.804,572.907,0)
+bs(337.797,540.759,0)
+bs(262.698,540.759,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(214.257,537.543))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-42.3082,0)
+guide(437.823,1)
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrectf-diagram-three.sk b/doc/src/diagrams/qrectf-diagram-three.sk
new file mode 100644
index 0000000..21c5b14
--- /dev/null
+++ b/doc/src/diagrams/qrectf-diagram-three.sk
@@ -0,0 +1,67 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(400.24,0,0,-299.507,39.5975,801.199)
+lw(1)
+b()
+bs(124.239,550.355,0)
+bs(124.239,518.034,0)
+bs(199.871,518.034,0)
+lw(1)
+b()
+bs(336.049,550.221,0)
+bs(336.042,518.073,0)
+bs(260.943,518.073,0)
+lw(1)
+b()
+bs(103.65,598.944,0)
+bs(73.795,598.944,0)
+bs(73.795,649.497,0)
+bs(73.795,652.933,0)
+lw(1)
+b()
+bs(73.3561,684.034,0)
+bs(73.3561,742.871,0)
+bs(102.984,742.871,0)
+fp((0.228,0.228,0.228))
+lw(1)
+r(275.594,0,0,-203.623,107.179,759.732)
+fp((1,1,1))
+lw(1)
+r(145.696,0,0,-80.7471,168.618,700.928)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,337.134,598.238)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(52.7628,664.942))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(208.991,514.857))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left(), top()',(108.935,771.142))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right(), bottom()',(345.911,537.678))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-42.3082,0)
+guide(458.887,1)
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qrectf-diagram-two.sk b/doc/src/diagrams/qrectf-diagram-two.sk
new file mode 100644
index 0000000..50d462e
--- /dev/null
+++ b/doc/src/diagrams/qrectf-diagram-two.sk
@@ -0,0 +1,67 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(400.24,0,0,-299.507,39.5975,801.199)
+lw(1)
+b()
+bs(125.117,574.053,0)
+bs(125.117,541.732,0)
+bs(200.749,541.732,0)
+lw(1)
+b()
+bs(335.171,573.919,0)
+bs(335.164,541.771,0)
+bs(260.065,541.771,0)
+lw(1)
+b()
+bs(103.65,598.944,0)
+bs(73.795,598.944,0)
+bs(73.795,649.497,0)
+bs(73.795,652.933,0)
+lw(1)
+b()
+bs(73.3561,684.034,0)
+bs(73.3561,742.871,0)
+bs(102.984,742.871,0)
+fp((0.228,0.228,0.228))
+lw(1)
+r(249.263,0,0,-181.681,107.179,759.732)
+fp((1,1,1))
+lw(1)
+r(165.005,0,0,-103.567,149.309,720.237)
+lp((0.799,0.109,0.048))
+lw(2)
+r(209.605,0,0,-142.77,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,128.75,741.136)
+fp((0.254,0.664,0.072))
+lw(1)
+e(9.42692,0,0,-9.42693,338.012,598.238)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('height()',(52.7628,664.942))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('width()',(211.624,538.555))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('left(), top()',(108.935,771.142))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('right(), bottom()',(345.033,544.699))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(-42.3082,0)
+guide(600.195,1)
+grid((0,0,20,20),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qstyleoptiontoolbar-position.sk b/doc/src/diagrams/qstyleoptiontoolbar-position.sk
new file mode 100644
index 0000000..d877f98
--- /dev/null
+++ b/doc/src/diagrams/qstyleoptiontoolbar-position.sk
@@ -0,0 +1,125 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+r(347.5,0,0,-199,162.138,754.445)
+lw(1)
+r(430.5,0,0,-25,79.6378,523.945)
+lw(1)
+b()
+bs(161.638,733.945,0)
+bs(509.638,734.445,0)
+lw(1)
+b()
+bs(162.138,714.445,0)
+bs(508.638,714.945,0)
+lw(1)
+b()
+bs(162.138,673.945,0)
+bs(510.138,674.445,0)
+lw(1)
+b()
+bs(162.138,694.445,0)
+bs(509.138,694.945,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Middle (m)',(444.638,717.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Middle',(218.138,506.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Middle',(327.138,506.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Middle (m)',(445.138,697.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Beginning (b)',(428.638,737.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('b',(86.1378,566.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Beginning',(105.138,507.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QStyleOptionToolBar::positionOfLine',(185.138,762.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QStyleOptionToolBar::positionWithinLine',(184.138,532.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('End (e)',(460.638,677.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('End',(443.638,506.945))
+lw(1)
+b()
+bs(182.138,524.445,0)
+bs(182.138,499.445,0)
+lw(1)
+b()
+bs(100.138,754.945,0)
+bs(100.138,555.945,0)
+lw(1)
+b()
+bs(120.138,754.945,0)
+bs(120.138,555.945,0)
+lw(1)
+b()
+bs(141.138,754.445,0)
+bs(141.138,555.445,0)
+lw(1)
+b()
+bs(403.138,523.445,0)
+bs(403.138,499.445,0)
+lw(1)
+b()
+bs(291.638,523.445,0)
+bs(291.638,499.445,0)
+lw(1)
+r(82.5,0,0,199,79.6378,555.445)
+lw(1)
+r(0,0,0,0,124.638,535.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('m',(105.138,567.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('m',(125.638,567.945))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('e',(147.138,567.445))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+guide(509.138,0)
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qt-embedded-vnc-screen.png b/doc/src/diagrams/qt-embedded-vnc-screen.png
new file mode 100644
index 0000000..b6fb649
--- /dev/null
+++ b/doc/src/diagrams/qt-embedded-vnc-screen.png
Binary files differ
diff --git a/doc/src/diagrams/qtableview-resized.png b/doc/src/diagrams/qtableview-resized.png
new file mode 100644
index 0000000..709aef1
--- /dev/null
+++ b/doc/src/diagrams/qtableview-resized.png
Binary files differ
diff --git a/doc/src/diagrams/qtableview-small.png b/doc/src/diagrams/qtableview-small.png
new file mode 100644
index 0000000..0363904
--- /dev/null
+++ b/doc/src/diagrams/qtableview-small.png
Binary files differ
diff --git a/doc/src/diagrams/qtableview-stretched.png b/doc/src/diagrams/qtableview-stretched.png
new file mode 100644
index 0000000..4441427
--- /dev/null
+++ b/doc/src/diagrams/qtableview-stretched.png
Binary files differ
diff --git a/doc/src/diagrams/qtableview.png b/doc/src/diagrams/qtableview.png
new file mode 100644
index 0000000..c2b5787
--- /dev/null
+++ b/doc/src/diagrams/qtableview.png
Binary files differ
diff --git a/doc/src/diagrams/qtconfig-appearance.png b/doc/src/diagrams/qtconfig-appearance.png
new file mode 100644
index 0000000..9d2d9e7
--- /dev/null
+++ b/doc/src/diagrams/qtconfig-appearance.png
Binary files differ
diff --git a/doc/src/diagrams/qtdemo-example.png b/doc/src/diagrams/qtdemo-example.png
new file mode 100644
index 0000000..8a399d6
--- /dev/null
+++ b/doc/src/diagrams/qtdemo-example.png
Binary files differ
diff --git a/doc/src/diagrams/qtdemo.png b/doc/src/diagrams/qtdemo.png
new file mode 100644
index 0000000..2db5399
--- /dev/null
+++ b/doc/src/diagrams/qtdemo.png
Binary files differ
diff --git a/doc/src/diagrams/qtdesignerextensions.sk b/doc/src/diagrams/qtdesignerextensions.sk
new file mode 100644
index 0000000..6c991cc
--- /dev/null
+++ b/doc/src/diagrams/qtdesignerextensions.sk
@@ -0,0 +1,254 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.906,0.732,0.467))
+lw(1)
+e(63,0,0,-24.5,506.638,720.945)
+fp((0.633,0.805,0.54))
+lw(1)
+r(228.847,0,0,-31.9855,160.081,797.596)
+fp((0.654,0.799,0.611))
+lw(1)
+r(126.847,0,0,-32.3666,415.674,589.688)
+lw(1)
+r(120.347,0,0,-32.3666,24.0692,505.37)
+fp((0.596,0.758,0.524))
+lw(1)
+r(230.847,0,0,-32.3666,157.485,463.23)
+lw(1)
+r(179.347,0,0,-31.8666,189.83,588.259)
+fp((0.543,0.82,0.899))
+lw(1)
+r(179.847,0,0,-33.3666,189.366,669.613)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QExtensionManager',(423.494,568.427))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QExtensionFactory',(226.125,443.933))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('MyExtensionFactory',(225.078,566.617))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('MyCustomWidgetInterface',(1,0,0,1.06376,207.091,646.338))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Qt Designer',(472.469,715.932))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('MyExtension',(49.3756,486.573))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('can create',(103.516,647.507))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('can create',(102.516,567.507))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QDesignerCustomWidgetInterface',(183.016,776.507))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('can identify',(59.6232,608.689))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('accesses',(400.623,647.189))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('accesses',(499.623,630.189))
+lw(1)
+b()
+bs(84.1673,725.837,0)
+bs(84.1673,650.617,0)
+bs(100.267,650.617,0)
+lw(1)
+b()
+bs(38.1673,726.255,0)
+bs(38.1673,611.117,0)
+bs(54.2666,611.117,0)
+lw(1)
+r(120.347,0,0,-31.9855,23.5806,758.096)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('MyCustomWidget',(1.02995,0,0,1.0597,36.9433,736.685))
+lw(1)
+b()
+bs(278.138,765.445,0)
+bs(278.138,723.445,0)
+lw(1)
+b()
+bs(523.638,697.445,0)
+bs(523.638,643.445,0)
+lw(1)
+b()
+bs(164.638,650.445,0)
+bs(189.138,650.445,0)
+lw(1)
+b()
+bs(163.638,571.945,0)
+bs(190.638,571.945,0)
+lw(1)
+b()
+bs(369.638,649.945,0)
+bs(395.638,649.945,0)
+lw(1)
+b()
+bs(488.138,695.945,0)
+bs(488.138,650.445,0)
+bs(457.638,650.445,0)
+lw(1)
+b()
+bs(83.1378,505.445,0)
+bs(83.1378,571.945,0)
+bs(99.6378,571.945,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('inherits',(260.016,708.007))
+lw(1)
+b()
+bs(278.638,700.445,0)
+bs(278.638,669.445,0)
+lw(1)
+b()
+bs(524.138,620.445,0)
+bs(524.138,589.445,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('inherits',(257.516,510.007))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('initializes',(277.016,609.507))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('controls',(349.016,523.507))
+lw(1)
+b()
+bs(277.138,463.445,0)
+bs(277.138,505.445,0)
+lw(1)
+b()
+bs(299.638,590.445,0)
+bs(299.638,606.445,0)
+lw(1)
+b()
+bs(278.638,524.945,0)
+bs(278.638,555.945,0)
+lw(1)
+b()
+bs(299.138,619.945,0)
+bs(299.138,635.945,0)
+lw(1)
+b()
+bs(124.638,611.945,0)
+bs(214.138,611.945,0)
+bs(214.138,588.945,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(523.888,589.695,0)
+bs(518.638,597.445,0)
+bs(528.888,597.445,0)
+bs(523.888,590.195,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(83.3878,506.195,0)
+bs(78.1378,513.945,0)
+bs(88.3878,513.945,0)
+bs(83.3878,506.695,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(277.388,463.695,0)
+bs(272.138,471.445,0)
+bs(282.388,471.445,0)
+bs(277.388,464.195,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(299.888,588.695,0)
+bs(294.638,596.445,0)
+bs(304.888,596.445,0)
+bs(299.888,589.195,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(84.3878,726.445,0)
+bs(79.1378,718.695,0)
+bs(89.3878,718.695,0)
+bs(84.3878,725.945,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(38.3878,726.445,0)
+bs(33.1378,718.695,0)
+bs(43.3878,718.695,0)
+bs(38.3878,725.945,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(324.138,556.445,0)
+bs(329.388,548.695,0)
+bs(319.138,548.695,0)
+bs(324.138,555.945,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(278.388,765.945,0)
+bs(273.138,758.195,0)
+bs(283.388,758.195,0)
+bs(278.388,765.445,0)
+fp((0,0,0))
+lw(1)
+b()
+bs(369.638,649.945,0)
+bs(377.263,654.945,0)
+bs(377.263,644.945,0)
+bs(369.763,650.07,0)
+lw(1)
+b()
+bs(460.888,557.945,0)
+bs(460.888,528.445,0)
+bs(398.388,528.445,0)
+lw(1)
+b()
+bs(324.388,554.945,0)
+bs(324.388,527.945,0)
+bs(344.388,527.945,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtexttable-cells.sk b/doc/src/diagrams/qtexttable-cells.sk
new file mode 100644
index 0000000..3e6eb5b
--- /dev/null
+++ b/doc/src/diagrams/qtexttable-cells.sk
@@ -0,0 +1,107 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(167.5,0,0,-95,120,825)
+lp((0.631,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(162.5,810,0)
+bc(167.5,815.625,182.5,815.625,187.5,810,2)
+lp((0.631,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(217.5,810,0)
+bc(222.5,815.625,237.5,815.625,242.5,810,2)
+G()
+lw(1)
+r(50,0,0,-25,177.5,820)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(192.168,802.484))
+G_()
+G()
+lw(1)
+r(50,0,0,-25,177.5,790)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(192.168,772.484))
+G_()
+lp((0.631,0.631,0.631))
+lw(1)
+r(50,0,0,-25,177.5,760)
+fp((0.631,0.631,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(192.168,742.484))
+G()
+lw(1)
+r(50,0,0,-25,232.5,820)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(247.168,802.484))
+G_()
+G()
+lw(1)
+r(50,0,0,-25,232.5,790)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(247.168,772.484))
+G_()
+lp((0.631,0.631,0.631))
+lw(1)
+r(50,0,0,-25,232.5,760)
+fp((0.631,0.631,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(247.168,742.484))
+G()
+lw(1)
+r(47.5,0,0,-25,125,820)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(138.418,802.484))
+G_()
+G()
+lw(1)
+r(47.5,0,0,-25,125,790)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(138.418,772.484))
+G_()
+lp((0.631,0.631,0.631))
+lw(1)
+r(47.5,0,0,-25,125,760)
+fp((0.631,0.631,0.631))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell',(138.418,742.484))
+lp((0.631,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(275,802.5,0)
+bc(270,795,262.5,792.5,250,792.5,1)
+bc(245,792.5,157.5,792.5,152.5,792.5,1)
+bc(140,792.5,137.306,786.007,132.5,780,1)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtexttableformat-cell.sk b/doc/src/diagrams/qtexttableformat-cell.sk
new file mode 100644
index 0000000..75b45f5
--- /dev/null
+++ b/doc/src/diagrams/qtexttableformat-cell.sk
@@ -0,0 +1,67 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lp((0.627,0.627,0.627))
+lw(1)
+ld((2, 2))
+r(-210,0,0,-60,255,670)
+lp((0.627,0.627,0.627))
+lw(1)
+ld((2, 2))
+r(-65,0,0,-135,320,805)
+lp((0.627,0.627,0.627))
+lw(1)
+ld((2, 2))
+r(-210,0,0,-135,255,805)
+lw(1)
+r(275,0,0,-195,45,805)
+lw(1)
+ld((2, 2))
+r(170,0,0,-95,65,785)
+lw(1)
+ld((2, 2))
+r(45,0,0,-95,275,785)
+lw(1)
+ld((2, 2))
+r(170,0,0,-40,65,650)
+lw(1)
+ld((2, 2))
+r(45,0,0,-40,275,650)
+lw(1)
+r(130,0,0,-55,85,765)
+lw(1)
+r(25,0,0,-55,295,765)
+lw(1)
+r(130,0,0,-20,85,630)
+lw(1)
+r(25,0,0,-20,295,630)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell padding',(116.652,696.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Cell spacing',(117.324,790))
+fp((0.627,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('Cell contents',(92.2,732.39))
+fp((1,1,1))
+le()
+lw(1)
+r(10,0,0,-205,315,810)
+fp((1,1,1))
+le()
+lw(1)
+r(280,0,0,-10,40,615)
+le()
+lw(1)
+r(280,0,0,-200,40,810)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/architecture-emb.sk b/doc/src/diagrams/qtopiacore/architecture-emb.sk
new file mode 100644
index 0000000..cca31f3
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/architecture-emb.sk
@@ -0,0 +1,425 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(284.808,62.5,0)
+bs(282.5,62.5,0)
+bs(282.5,67.5,0)
+bs(287.5,67.5,0)
+bs(287.5,62.5,0)
+bs(284.808,62.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(134.808,72.5,0)
+bs(132.5,72.5,0)
+bs(132.5,77.5,0)
+bs(137.5,77.5,0)
+bs(137.5,72.5,0)
+bs(134.808,72.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(22.308,72.5,0)
+bs(20,72.5,0)
+bs(20,77.5,0)
+bs(25,77.5,0)
+bs(25,72.5,0)
+bs(22.308,72.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(78.7166,72.5,0)
+bs(22.5,72.5,0)
+bs(22.5,75,0)
+bs(135,75,0)
+bs(135,72.5,0)
+bs(78.7166,72.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(152.308,62.5,0)
+bs(150,62.5,0)
+bs(150,67.5,0)
+bs(155,67.5,0)
+bs(155,62.5,0)
+bs(152.308,62.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(218.711,62.5,0)
+bs(152.5,62.5,0)
+bs(152.5,65,0)
+bs(285,65,0)
+bs(285,62.5,0)
+bs(218.711,62.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(284.808,27.5,0)
+bs(282.5,27.5,0)
+bs(282.5,32.5,0)
+bs(287.5,32.5,0)
+bs(287.5,27.5,0)
+bs(284.808,27.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(284.808,127.5,0)
+bs(282.5,127.5,0)
+bs(282.5,132.5,0)
+bs(287.5,132.5,0)
+bs(287.5,127.5,0)
+bs(284.808,127.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(12.308,27.5,0)
+bs(10,27.5,0)
+bs(10,32.5,0)
+bs(15,32.5,0)
+bs(15,27.5,0)
+bs(12.308,27.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(12.308,127.5,0)
+bs(10,127.5,0)
+bs(10,132.5,0)
+bs(15,132.5,0)
+bs(15,127.5,0)
+bs(12.308,127.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(284.808,55,0)
+bs(282.5,55,0)
+bs(282.5,60,0)
+bs(287.5,60,0)
+bs(287.5,55,0)
+bs(284.808,55,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(284.808,165,0)
+bs(282.5,165,0)
+bs(282.5,170,0)
+bs(287.5,170,0)
+bs(287.5,165,0)
+bs(284.808,165,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(284.808,120,0)
+bs(282.5,120,0)
+bs(282.5,125,0)
+bs(287.5,125,0)
+bs(287.5,120,0)
+bs(284.808,120,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(134.808,110,0)
+bs(132.5,110,0)
+bs(132.5,115,0)
+bs(137.5,115,0)
+bs(137.5,110,0)
+bs(134.808,110,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(148.669,27.5,0)
+bs(12.5,27.5,0)
+bs(12.5,30,0)
+bs(285,30,0)
+bs(285,27.5,0)
+bs(148.669,27.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(148.669,127.5,0)
+bs(12.5,127.5,0)
+bs(12.5,130,0)
+bs(285,130,0)
+bs(285,127.5,0)
+bs(148.669,127.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(286.249,30,0)
+bs(285,30,0)
+bs(285,57.5,0)
+bs(287.5,57.5,0)
+bs(287.5,30,0)
+bs(286.249,30,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(286.249,130,0)
+bs(285,130,0)
+bs(285,167.5,0)
+bs(287.5,167.5,0)
+bs(287.5,130,0)
+bs(286.249,130,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(286.249,65,0)
+bs(285,65,0)
+bs(285,122.5,0)
+bs(287.5,122.5,0)
+bs(287.5,65,0)
+bs(286.249,65,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(136.249,75,0)
+bs(135,75,0)
+bs(135,112.5,0)
+bs(137.5,112.5,0)
+bs(137.5,75,0)
+bs(136.249,75,0)
+gl([(0,(0,0,0)),(1,(0.362,0.362,0.362))])
+pgl(0,-1,0)
+fp()
+r(275,0,0,-30,10,60)
+fp((1,1,1))
+b()
+bs(10,150,0)
+bs(285,150,0)
+bs(285,170,0)
+bs(10,170,0)
+bs(10,150,0)
+bC()
+fp((0.8,0.8,0.8))
+b()
+bs(10,130,0)
+bs(285,130,0)
+bs(285,150,0)
+bs(10,150,0)
+bs(10,130,0)
+bC()
+fp((0.651,0.808,0.224))
+b()
+bs(150,105,0)
+bs(285,105,0)
+bs(285,125,0)
+bs(150,125,0)
+bs(150,105,0)
+bC()
+fp((0.5,0.5,0.5))
+b()
+bs(150,85,0)
+bs(285,85,0)
+bs(285,105,0)
+bs(150,105,0)
+bs(150,85,0)
+bC()
+fp((0.651,0.808,0.224))
+b()
+bs(20,75,0)
+bs(135,75,0)
+bs(135,115,0)
+bs(20,115,0)
+bs(20,75,0)
+bC()
+lp((0.785,0.785,0.785))
+b()
+bs(10,65,0)
+bs(145,65,0)
+bs(145,125,0)
+bs(10,125,0)
+bs(10,65,0)
+bC()
+lp((0.631,0.631,0.631))
+b()
+bs(15,70,0)
+bs(140,70,0)
+bs(140,120,0)
+bs(15,120,0)
+bs(15,70,0)
+bC()
+fp((0.5,0.5,0.5))
+b()
+bs(150,65,0)
+bs(285,65,0)
+bs(285,85,0)
+bs(150,85,0)
+bs(150,65,0)
+bC()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Application Source Code',(81.47,156.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Qt API',(129.824,136.384))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Qt for X11',(190.152,111.384))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Xlib',(207.498,90))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('X Window Server',(171.156,71.384))
+gl([(0,(0.248,0.248,0.248)),(1,(0.362,0.362,0.362))])
+pgl(0,-1,0)
+fp()
+le()
+lw(0.5)
+b()
+bs(105,35,0)
+bs(115,55,0)
+bs(200,55,0)
+bs(190,35,0)
+bs(105,35,0)
+bC()
+fp((0.788,0.13,0.13))
+le()
+lw(0.5)
+b()
+bs(190,35,0)
+bs(200,55,0)
+bs(280,55,0)
+bs(280,35,0)
+bs(190,35,0)
+bC()
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Framebuffer',(120,41.384))
+gl([(0,(0.248,0.248,0.248)),(1,(0.362,0.362,0.362))])
+pgl(0,-1,0)
+fp()
+le()
+lw(0.5)
+b()
+bs(15,35,0)
+bs(15,55,0)
+bs(110,55,0)
+bs(99.4444,35,0)
+bs(15,35,0)
+bC()
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Linux Kernel',(25,41.384))
+G()
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(8)
+txt('Accelerated',(217.76,46.756))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(8)
+txt('Graphics',(222.876,37.6))
+G_()
+G()
+fp((1,1,1))
+Fn('Helvetica')
+txt('Qt for',(62.494,98.742))
+fp((1,1,1))
+Fn('Helvetica')
+txt('Embedded Linux',(32.476,85.126))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/clamshell-phone.png b/doc/src/diagrams/qtopiacore/clamshell-phone.png
new file mode 100644
index 0000000..07f562d
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/clamshell-phone.png
Binary files differ
diff --git a/doc/src/diagrams/qtopiacore/launcher.png b/doc/src/diagrams/qtopiacore/launcher.png
new file mode 100644
index 0000000..a72671f
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/launcher.png
Binary files differ
diff --git a/doc/src/diagrams/qtopiacore/qt-embedded-opengl1.sk b/doc/src/diagrams/qtopiacore/qt-embedded-opengl1.sk
new file mode 100644
index 0000000..abacde9
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qt-embedded-opengl1.sk
@@ -0,0 +1,410 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(217.308,642.5,0)
+bs(215,642.5,0)
+bs(215,647.5,0)
+bs(220,647.5,0)
+bs(220,642.5,0)
+bs(217.308,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(339.808,642.5,0)
+bs(337.5,642.5,0)
+bs(337.5,647.5,0)
+bs(342.5,647.5,0)
+bs(342.5,642.5,0)
+bs(339.808,642.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(278.714,642.5,0)
+bs(217.5,642.5,0)
+bs(217.5,645,0)
+bs(340,645,0)
+bs(340,642.5,0)
+bs(278.714,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(339.808,695,0)
+bs(337.5,695,0)
+bs(337.5,700,0)
+bs(342.5,700,0)
+bs(342.5,695,0)
+bs(339.808,695,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(341.249,645,0)
+bs(340,645,0)
+bs(340,697.5,0)
+bs(342.5,697.5,0)
+bs(342.5,645,0)
+bs(341.249,645,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(169.808,642.5,0)
+bs(167.5,642.5,0)
+bs(167.5,647.5,0)
+bs(172.5,647.5,0)
+bs(172.5,642.5,0)
+bs(169.808,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,512.5,0)
+bs(347.5,512.5,0)
+bs(347.5,517.5,0)
+bs(352.5,517.5,0)
+bs(352.5,512.5,0)
+bs(349.808,512.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,572.5,0)
+bs(347.5,572.5,0)
+bs(347.5,577.5,0)
+bs(352.5,577.5,0)
+bs(352.5,572.5,0)
+bs(349.808,572.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(62.308,512.5,0)
+bs(60,512.5,0)
+bs(60,517.5,0)
+bs(65,517.5,0)
+bs(65,512.5,0)
+bs(62.308,512.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(142.308,572.5,0)
+bs(140,572.5,0)
+bs(140,577.5,0)
+bs(145,577.5,0)
+bs(145,572.5,0)
+bs(142.308,572.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(139.808,732.5,0)
+bs(137.5,732.5,0)
+bs(137.5,737.5,0)
+bs(142.5,737.5,0)
+bs(142.5,732.5,0)
+bs(139.808,732.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(169.808,695,0)
+bs(167.5,695,0)
+bs(167.5,700,0)
+bs(172.5,700,0)
+bs(172.5,695,0)
+bs(169.808,695,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(139.808,785,0)
+bs(137.5,785,0)
+bs(137.5,790,0)
+bs(142.5,790,0)
+bs(142.5,785,0)
+bs(139.808,785,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(171.249,645,0)
+bs(170,645,0)
+bs(170,697.5,0)
+bs(172.5,697.5,0)
+bs(172.5,645,0)
+bs(171.249,645,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(141.249,735,0)
+bs(140,735,0)
+bs(140,787.5,0)
+bs(142.5,787.5,0)
+bs(142.5,735,0)
+bs(141.249,735,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(62.308,642.5,0)
+bs(60,642.5,0)
+bs(60,647.5,0)
+bs(65,647.5,0)
+bs(65,642.5,0)
+bs(62.308,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(62.308,732.5,0)
+bs(60,732.5,0)
+bs(60,737.5,0)
+bs(65,737.5,0)
+bs(65,732.5,0)
+bs(62.308,732.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(116.218,642.5,0)
+bs(62.5,642.5,0)
+bs(62.5,645,0)
+bs(170,645,0)
+bs(170,642.5,0)
+bs(116.218,642.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(101.227,732.5,0)
+bs(62.5,732.5,0)
+bs(62.5,735,0)
+bs(140,735,0)
+bs(140,732.5,0)
+bs(101.227,732.5,0)
+fp((0.651,0.808,0.224))
+b()
+bs(215,645,0)
+bs(340,645,0)
+bs(340,700,0)
+bs(215,700,0)
+bs(215,645,0)
+bC()
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,535,0)
+bs(347.5,535,0)
+bs(347.5,540,0)
+bs(352.5,540,0)
+bs(352.5,535,0)
+bs(349.808,535,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,595,0)
+bs(347.5,595,0)
+bs(347.5,600,0)
+bs(352.5,600,0)
+bs(352.5,595,0)
+bs(349.808,595,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(206.165,512.5,0)
+bs(62.5,512.5,0)
+bs(62.5,515,0)
+bs(350,515,0)
+bs(350,512.5,0)
+bs(206.165,512.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(246.188,572.5,0)
+bs(142.5,572.5,0)
+bs(142.5,575,0)
+bs(350,575,0)
+bs(350,572.5,0)
+bs(246.188,572.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(351.249,515,0)
+bs(350,515,0)
+bs(350,537.5,0)
+bs(352.5,537.5,0)
+bs(352.5,515,0)
+bs(351.249,515,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(351.249,575,0)
+bs(350,575,0)
+bs(350,597.5,0)
+bs(352.5,597.5,0)
+bs(352.5,575,0)
+bs(351.249,575,0)
+fp((0.503,0.503,0.503))
+r(290,0,0,-25,60,540)
+fp((0.503,0.503,0.503))
+r(210,0,0,-25,140,600)
+fp((0.337,0.357,1))
+b()
+bs(60,735,0)
+bs(140,735,0)
+bs(140,790,0)
+bs(60,790,0)
+bs(60,735,0)
+bC()
+fp((0.651,0.808,0.224))
+b()
+bs(60,645,0)
+bs(170,645,0)
+bs(170,700,0)
+bs(60,700,0)
+bs(60,645,0)
+bC()
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Application',(70.654,759.434))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Framebuffer',(172.5,523.884))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Acceleration Hardware',(184.316,583.884))
+G()
+fp((0,0,0))
+Fn('Helvetica')
+txt('Qt for',(99.994,676.242))
+fp((0,0,0))
+Fn('Helvetica')
+txt('Embedded Linux',(69.976,662.626))
+G_()
+fp((0,0,0))
+Fn('Helvetica')
+txt('Acceleration Plugin',(226.146,669.434))
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(100,735,0)
+bs(100,702.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(115,645,0)
+bs(115,542.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(280,645,0)
+bs(280,602.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(170,682.5,0)
+bs(212.5,682.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(215,662.5,0)
+bs(172.5,662.5,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qt-embedded-opengl2.sk b/doc/src/diagrams/qtopiacore/qt-embedded-opengl2.sk
new file mode 100644
index 0000000..531a34c
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qt-embedded-opengl2.sk
@@ -0,0 +1,592 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(227.308,642.5,0)
+bs(225,642.5,0)
+bs(225,647.5,0)
+bs(230,647.5,0)
+bs(230,642.5,0)
+bs(227.308,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(269.808,547.5,0)
+bs(267.5,547.5,0)
+bs(267.5,552.5,0)
+bs(272.5,552.5,0)
+bs(272.5,547.5,0)
+bs(269.808,547.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(62.308,547.5,0)
+bs(60,547.5,0)
+bs(60,552.5,0)
+bs(65,552.5,0)
+bs(65,547.5,0)
+bs(62.308,547.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,642.5,0)
+bs(347.5,642.5,0)
+bs(347.5,647.5,0)
+bs(352.5,647.5,0)
+bs(352.5,642.5,0)
+bs(349.808,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(339.808,547.5,0)
+bs(337.5,547.5,0)
+bs(337.5,552.5,0)
+bs(342.5,552.5,0)
+bs(342.5,547.5,0)
+bs(339.808,547.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(244.808,547.5,0)
+bs(242.5,547.5,0)
+bs(242.5,552.5,0)
+bs(247.5,552.5,0)
+bs(247.5,547.5,0)
+bs(244.808,547.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(288.714,642.5,0)
+bs(227.5,642.5,0)
+bs(227.5,645,0)
+bs(350,645,0)
+bs(350,642.5,0)
+bs(288.714,642.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(304.979,547.5,0)
+bs(270,547.5,0)
+bs(270,550,0)
+bs(340,550,0)
+bs(340,547.5,0)
+bs(304.979,547.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(153.696,547.5,0)
+bs(62.5,547.5,0)
+bs(62.5,550,0)
+bs(245,550,0)
+bs(245,547.5,0)
+bs(153.696,547.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,695,0)
+bs(347.5,695,0)
+bs(347.5,700,0)
+bs(352.5,700,0)
+bs(352.5,695,0)
+bs(349.808,695,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(339.808,595,0)
+bs(337.5,595,0)
+bs(337.5,600,0)
+bs(342.5,600,0)
+bs(342.5,595,0)
+bs(339.808,595,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(244.808,595,0)
+bs(242.5,595,0)
+bs(242.5,600,0)
+bs(247.5,600,0)
+bs(247.5,595,0)
+bs(244.808,595,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(351.249,645,0)
+bs(350,645,0)
+bs(350,697.5,0)
+bs(352.5,697.5,0)
+bs(352.5,645,0)
+bs(351.249,645,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(341.249,550,0)
+bs(340,550,0)
+bs(340,597.5,0)
+bs(342.5,597.5,0)
+bs(342.5,550,0)
+bs(341.249,550,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(246.249,550,0)
+bs(245,550,0)
+bs(245,597.5,0)
+bs(247.5,597.5,0)
+bs(247.5,550,0)
+bs(246.249,550,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(189.808,642.5,0)
+bs(187.5,642.5,0)
+bs(187.5,647.5,0)
+bs(192.5,647.5,0)
+bs(192.5,642.5,0)
+bs(189.808,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,432.5,0)
+bs(347.5,432.5,0)
+bs(347.5,437.5,0)
+bs(352.5,437.5,0)
+bs(352.5,432.5,0)
+bs(349.808,432.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(309.808,482.5,0)
+bs(307.5,482.5,0)
+bs(307.5,487.5,0)
+bs(312.5,487.5,0)
+bs(312.5,482.5,0)
+bs(309.808,482.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(62.308,432.5,0)
+bs(60,432.5,0)
+bs(60,437.5,0)
+bs(65,437.5,0)
+bs(65,432.5,0)
+bs(62.308,432.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(102.308,482.5,0)
+bs(100,482.5,0)
+bs(100,487.5,0)
+bs(105,487.5,0)
+bs(105,482.5,0)
+bs(102.308,482.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(139.808,732.5,0)
+bs(137.5,732.5,0)
+bs(137.5,737.5,0)
+bs(142.5,737.5,0)
+bs(142.5,732.5,0)
+bs(139.808,732.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(189.808,695,0)
+bs(187.5,695,0)
+bs(187.5,700,0)
+bs(192.5,700,0)
+bs(192.5,695,0)
+bs(189.808,695,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(139.808,785,0)
+bs(137.5,785,0)
+bs(137.5,790,0)
+bs(142.5,790,0)
+bs(142.5,785,0)
+bs(139.808,785,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(191.249,645,0)
+bs(190,645,0)
+bs(190,697.5,0)
+bs(192.5,697.5,0)
+bs(192.5,645,0)
+bs(191.249,645,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(141.249,735,0)
+bs(140,735,0)
+bs(140,787.5,0)
+bs(142.5,787.5,0)
+bs(142.5,735,0)
+bs(141.249,735,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(82.308,642.5,0)
+bs(80,642.5,0)
+bs(80,647.5,0)
+bs(85,647.5,0)
+bs(85,642.5,0)
+bs(82.308,642.5,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(62.308,732.5,0)
+bs(60,732.5,0)
+bs(60,737.5,0)
+bs(65,737.5,0)
+bs(65,732.5,0)
+bs(62.308,732.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(136.218,642.5,0)
+bs(82.5,642.5,0)
+bs(82.5,645,0)
+bs(190,645,0)
+bs(190,642.5,0)
+bs(136.218,642.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(101.227,732.5,0)
+bs(62.5,732.5,0)
+bs(62.5,735,0)
+bs(140,735,0)
+bs(140,732.5,0)
+bs(101.227,732.5,0)
+fp((0.651,0.808,0.224))
+b()
+bs(225,645,0)
+bs(350,645,0)
+bs(350,700,0)
+bs(225,700,0)
+bs(225,645,0)
+bC()
+fp((0.965,0.522,0.439))
+b()
+bs(267.5,550,0)
+bs(340,550,0)
+bs(340,600,0)
+bs(267.5,600,0)
+bs(267.5,550,0)
+bC()
+fp((0.965,0.522,0.439))
+b()
+bs(60,550,0)
+bs(245,550,0)
+bs(245,600,0)
+bs(60,600,0)
+bs(60,550,0)
+bC()
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(349.808,455,0)
+bs(347.5,455,0)
+bs(347.5,460,0)
+bs(352.5,460,0)
+bs(352.5,455,0)
+bs(349.808,455,0)
+gl([(0,(1,1,1)),(0.29,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgr(0.5,0.5,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(309.808,505,0)
+bs(307.5,505,0)
+bs(307.5,510,0)
+bs(312.5,510,0)
+bs(312.5,505,0)
+bs(309.808,505,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(206.165,432.5,0)
+bs(62.5,432.5,0)
+bs(62.5,435,0)
+bs(350,435,0)
+bs(350,432.5,0)
+bs(206.165,432.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(0,-1,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(206.188,482.5,0)
+bs(102.5,482.5,0)
+bs(102.5,485,0)
+bs(310,485,0)
+bs(310,482.5,0)
+bs(206.188,482.5,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(351.249,435,0)
+bs(350,435,0)
+bs(350,457.5,0)
+bs(352.5,457.5,0)
+bs(352.5,435,0)
+bs(351.249,435,0)
+gl([(0,(1,1,1)),(1,(0.396,0.396,0.396))])
+pgl(1,0,0)
+fp()
+le()
+lw(1)
+lj(1)
+b()
+bs(311.249,485,0)
+bs(310,485,0)
+bs(310,507.5,0)
+bs(312.5,507.5,0)
+bs(312.5,485,0)
+bs(311.249,485,0)
+fp((0.503,0.503,0.503))
+r(290,0,0,-25,60,460)
+fp((0.503,0.503,0.503))
+r(210,0,0,-25,100,510)
+fp((0.337,0.357,1))
+b()
+bs(60,735,0)
+bs(140,735,0)
+bs(140,790,0)
+bs(60,790,0)
+bs(60,735,0)
+bC()
+fp((0.651,0.808,0.224))
+b()
+bs(80,645,0)
+bs(190,645,0)
+bs(190,700,0)
+bs(80,700,0)
+bs(80,645,0)
+bC()
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Application',(70.654,759.434))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Framebuffer',(172.5,443.884))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Acceleration Hardware',(144.316,493.884))
+G()
+fp((0,0,0))
+Fn('Helvetica')
+txt('Qt for',(119.994,676.242))
+fp((0,0,0))
+Fn('Helvetica')
+txt('Embedded Linux',(89.976,662.626))
+G_()
+fp((0,0,0))
+Fn('Helvetica')
+txt('EGL',(291.744,571.384))
+fp((0,0,0))
+Fn('Helvetica')
+txt('OpenGL ES',(120.148,571.384))
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(100,735,0)
+bs(100,702.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(70,735,0)
+bs(70,602.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(137.5,645,0)
+bs(137.5,602.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(80,550,0)
+bs(80,462.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(325,550,0)
+bs(325,462.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(150,550,0)
+bs(150,512.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(290,550,0)
+bs(290,512.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(305,645,0)
+bs(305,602.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(190,682.5,0)
+bs(222.5,682.5,0)
+lw(1.25)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(225,662.5,0)
+bs(192.5,662.5,0)
+G()
+fp((0,0,0))
+Fn('Helvetica')
+txt('Reference',(259.822,676.384))
+fp((0,0,0))
+Fn('Helvetica')
+txt('Implementation',(246.484,662.768))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-accelerateddriver.sk b/doc/src/diagrams/qtopiacore/qtopiacore-accelerateddriver.sk
new file mode 100644
index 0000000..d2b5c18
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-accelerateddriver.sk
@@ -0,0 +1,70 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+G()
+lw(1)
+ld((4, 4))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(243.103,720,0)
+bc(243.103,720,312.371,742.5,243.103,780,2)
+lw(1)
+ld((4, 4))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(225.786,720,0)
+bc(225.786,720,156.518,742.5,225.786,780,2)
+G_()
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,15,770)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Client Application',(32.3,746.934))
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-40,170,820)
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-40,170,720)
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-20,170,760)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,325,770)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Paint Engine',(200.98,796.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Widget',(216.328,746.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Paint Device',(201.322,696.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Window Surface',(346.32,746.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(145,750,0)
+bs(170,750,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(300,750,0)
+bs(325,750,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-architecture-emb.svg b/doc/src/diagrams/qtopiacore/qtopiacore-architecture-emb.svg
new file mode 100644
index 0000000..5f4d889
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-architecture-emb.svg
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="285.482"
+ height="140.482"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.42"
+ sodipodi:docname="architecture-emb.svg"
+ sodipodi:docbase="/home/dboddie/dev/whitepapers/qtopia-core/diagrams">
+ <metadata
+ id="metadata88">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <sodipodi:namedview
+ inkscape:window-height="574"
+ inkscape:window-width="924"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="true"
+ inkscape:grid-points="true"
+ inkscape:zoom="2.1612571"
+ inkscape:cx="142.74100"
+ inkscape:cy="70.240997"
+ inkscape:window-x="61"
+ inkscape:window-y="164"
+ inkscape:current-layer="svg2" />
+ <defs
+ id="defs4">
+ <marker
+ id="ArrowEnd"
+ viewBox="0 0 10 10"
+ refX="0"
+ refY="5"
+ markerUnits="strokeWidth"
+ markerWidth="4"
+ markerHeight="3"
+ orient="auto">
+ <path
+ d="M 0 0 L 10 5 L 0 10 z"
+ id="path7" />
+ </marker>
+ <marker
+ id="ArrowStart"
+ viewBox="0 0 10 10"
+ refX="10"
+ refY="5"
+ markerUnits="strokeWidth"
+ markerWidth="4"
+ markerHeight="3"
+ orient="auto">
+ <path
+ d="M 10 0 L 0 5 L 10 10 z"
+ id="path10" />
+ </marker>
+ </defs>
+ <g
+ id="g12">
+ <defs
+ id="defs14">
+ <linearGradient
+ id="1"
+ x1="142.741"
+ y1="140.482"
+ x2="142.741"
+ y2="100"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ offset="0"
+ style="stop-color:#000000"
+ id="stop17" />
+ <stop
+ offset="1"
+ style="stop-color:#5c5c5c"
+ id="stop19" />
+ </linearGradient>
+ </defs>
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:url(#1)"
+ d="M 5.24084 105.241L 280.241 105.241L 280.241 135.241L 5.24084 135.241L 5.24084 105.241z"
+ id="path21" />
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:#ffffff"
+ d="M 5.24084 25.2408L 280.241 25.2408L 280.241 5.24084L 5.24084 5.24084L 5.24084 25.2408z"
+ id="path23" />
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:#cccccc"
+ d="M 280.141 9.44084L 280.741 9.44084L 280.741 8.84085L 280.141 8.84085L 280.141 9.44084z"
+ id="path25" />
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:#cccccc"
+ d="M 280.141 28.6408L 280.741 28.6408L 280.741 28.0408L 280.141 28.0408L 280.141 28.6408z"
+ id="path27" />
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:#cccccc"
+ d="M 5.24084 45.2408L 280.241 45.2408L 280.241 25.2408L 5.24084 25.2408L 5.24084 45.2408z"
+ id="path29" />
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:#cccccc"
+ d="M 280.141 47.8408L 280.741 47.8408L 280.741 47.2408L 280.141 47.2408L 280.141 47.8408z"
+ id="path31" />
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:#a6ce39"
+ d="M 145.241 65.2408L 280.241 65.2408L 280.241 45.2408L 145.241 45.2408L 145.241 65.2408z"
+ id="path33" />
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:#cccccc"
+ d="M 141.991 66.4407L 142.591 66.4407L 142.591 47.2408L 141.991 47.2408L 141.991 66.4407z"
+ id="path35" />
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:#7f7f7f"
+ d="M 145.241 85.2408L 280.241 85.2408L 280.241 65.2408L 145.241 65.2408L 145.241 85.2408z"
+ id="path37" />
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:#cccccc"
+ d="M 141.991 85.6406L 142.591 85.6406L 142.591 66.4407L 141.991 66.4407L 141.991 85.6406z"
+ id="path39" />
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:#a6ce39"
+ d="M 5.24084 105.241L 145.241 105.241L 145.241 45.2408L 5.24084 45.2408L 5.24084 105.241z"
+ id="path41" />
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 42.8948 78.8568)"
+ id="text43">
+Qtopia Core
+</text>
+ <path
+ style="stroke:#000000; stroke-width:1; fill-rule:evenodd; fill:#7f7f7f"
+ d="M 145.241 105.241L 280.241 105.241L 280.241 85.2408L 145.241 85.2408L 145.241 105.241z"
+ id="path45" />
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#000000; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 76.7108 18.8568)"
+ id="text47">
+Application Source Code
+</text>
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#000000; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 125.065 38.8568)"
+ id="text49">
+Qt API
+</text>
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 194.063 60.2408)"
+ id="text51">
+Qt/X11
+</text>
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 202.739 80.2408)"
+ id="text53">
+Xlib
+</text>
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 166.397 98.8568)"
+ id="text55">
+X Window Server
+</text>
+ <defs
+ id="defs57">
+ <linearGradient
+ id="2"
+ x1="147.741"
+ y1="130.241"
+ x2="147.741"
+ y2="110.241"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ offset="0"
+ style="stop-color:#3f3f3f"
+ id="stop60" />
+ <stop
+ offset="1"
+ style="stop-color:#5c5c5c"
+ id="stop62" />
+ </linearGradient>
+ </defs>
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:url(#2)"
+ d="M 100.241 130.241L 110.241 110.241L 195.241 110.241L 185.241 130.241L 100.241 130.241z"
+ id="path64" />
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:#c82121"
+ d="M 185.241 130.241L 195.241 110.241L 275.241 110.241L 275.241 130.241L 185.241 130.241z"
+ id="path66" />
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 115.241 123.857)"
+ id="text68">
+Framebuffer
+</text>
+ <defs
+ id="defs70">
+ <linearGradient
+ id="3"
+ x1="57.7408"
+ y1="130.241"
+ x2="57.7408"
+ y2="110.241"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ offset="0"
+ style="stop-color:#3f3f3f"
+ id="stop73" />
+ <stop
+ offset="1"
+ style="stop-color:#5c5c5c"
+ id="stop75" />
+ </linearGradient>
+ </defs>
+ <path
+ style="stroke:none; fill-rule:evenodd; fill:url(#3)"
+ d="M 10.2408 130.241L 10.2408 110.241L 105.241 110.241L 94.6852 130.241L 10.2408 130.241z"
+ id="path77" />
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:12.0"
+ transform="matrix(1 0 0 1 20.2408 123.857)"
+ id="text79">
+Linux Kernel
+</text>
+ <g
+ id="g81">
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:8"
+ transform="matrix(1 0 0 1 213.001 118.485)"
+ id="text83">
+Accelerated
+</text>
+ <text
+ style="stroke:none; fill-rule:evenodd; fill:#ffffff; font-family:FreeSans; font-size:8"
+ transform="matrix(1 0 0 1 218.117 127.641)"
+ id="text85">
+Graphics
+</text>
+ </g>
+ </g>
+</svg>
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-architecture.sk b/doc/src/diagrams/qtopiacore/qtopiacore-architecture.sk
new file mode 100644
index 0000000..e670eac
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-architecture.sk
@@ -0,0 +1,136 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(-1228916532,'clamshell-phone.png')
+im((17,498),-1228916532)
+fp((1,1,1))
+ft(0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(130,0,0,-40,364.61,761.65)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,204.942,761.65)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(236.27,738.584))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Memory',(504.551,724.079))
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,395.562,756.65)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,445.086,756.65)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,420.324,756.65)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,370.8,756.65)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,469.848,756.65)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(427.452,816.049))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,430.124,820.297)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(322.628,699.078))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,325.3,703.826)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(178.299,751.825))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,181.299,755.709)
+G_()
+lw(1)
+b()
+bs(276.959,770.65,0)
+bc(276.959,770.65,86.959,790.65,346.959,810.65,2)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(412.959,771.65,0)
+bc(412.959,771.65,602.959,791.65,342.959,811.65,2)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,289.177,829.533)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Client',(322.839,808.584))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(339.942,741.65,0)
+bs(358.589,741.65,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(166.646,741.65,0)
+bs(199.058,741.65,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(385,713,0)
+bs(385,695,0)
+le()
+lw(1)
+r(540.005,0,0,-59.2946,10.1647,575.005)
+G()
+fp((0.688,0.839,0.475))
+lw(1)
+r(15,0,0,-15,453.816,561.299)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Server side',(475.472,550.733))
+fp((0.636,0.839,0.81))
+lw(1)
+r(15,0,0,-15,453.816,541.299)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Client side',(475.472,530.733))
+G_()
+bm(-1229576468,'home-screen.png')
+im((295,560),-1229576468)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-characterinputlayer.sk b/doc/src/diagrams/qtopiacore/qtopiacore-characterinputlayer.sk
new file mode 100644
index 0000000..bcf52bb
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-characterinputlayer.sk
@@ -0,0 +1,118 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(264.98,607,0)
+bc(264.98,607,364.98,652,264.98,727,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,194.98,772)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(226.308,748.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(239.98,607,0)
+bc(239.98,607,139.98,652,239.98,727,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,194.98,602)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Keyboard Handler',(211.626,578.934))
+fp((0.812,0.906,0.651))
+lw(1)
+r(135,0,0,-20,260,667)
+fp((0.812,0.906,0.651))
+lw(1)
+r(135,0,0,-20,260,692)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Key pressed!',(29.968,564.616))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Start application',(357.968,747.616))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Keyboard Driver Factory',(263.809,653.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Keyboard Driver Plugin',(265.814,678.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(149.506,582,0)
+bs(189.98,582,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(351.454,752,0)
+bs(329.98,752,0)
+fp((1,1,1))
+lw(1)
+r(65,0,0,-45,164.98,692)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWSEvent',(167.804,665.684))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(32.3079,0,0,-32.0833,90,632,0.0416667,0.0555556)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(32.3079,0,0,-32.0833,108.846,594.083,0.0416667,0.0555556)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(32.3079,0,0,-32.0833,127.692,632,0.0416667,0.0555556)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(26.9232,0,0,-26.25,92.6923,629.083,0.05,0.0714286)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(26.9232,0,0,-26.25,111.538,591.167,0.05,0.0714286)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(26.9232,0,0,-26.25,130.384,629.083,0.05,0.0714286)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(36)
+txt('J',(0.666667,0,0,0.666667,100,607.837))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(36)
+txt('GO!',(0.666667,0,0,0.666667,450.984,745.232))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(36)
+txt('M',(0.666667,0,0,0.666667,115,569.504))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(36)
+txt('K',(0.666667,0,0,0.666667,133.992,607.232))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-client.sk b/doc/src/diagrams/qtopiacore/qtopiacore-client.sk
new file mode 100644
index 0000000..e339a63
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-client.sk
@@ -0,0 +1,51 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.688,0.839,0.475))
+lw(1)
+r(85,0,0,-40,9.99982,795)
+fp((0.636,0.839,0.81))
+lw(1)
+r(90,0,0,-40,135,795)
+fp((0.636,0.839,0.81))
+lw(1)
+r(90,0,0,-40,265,795)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWSServer',(20.4958,771.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWSClient',(150.33,771.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('UNIX Domain Socket',(191.636,687.616))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QApplication',(274.318,771.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(94.526,775,0)
+bs(135,775,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(224.526,775,0)
+bs(265,775,0)
+lw(1)
+ld((5, 5))
+b()
+bs(245,835,0)
+bs(245,705,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-clientrendering.sk b/doc/src/diagrams/qtopiacore/qtopiacore-clientrendering.sk
new file mode 100644
index 0000000..b37c5a6
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-clientrendering.sk
@@ -0,0 +1,166 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+G()
+fp((1,1,1))
+ft(0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(130,0,0,-40,264,675)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Memory',(351,620.252))
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,294.952,670)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,344.476,670)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,319.714,670)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,270.19,670)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,369.238,670)
+G_()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(393.5,734,0)
+bc(393.5,734,681.5,699.384,393.5,659,2)
+lw(1)
+b()
+bs(332.018,759,0)
+bc(332.018,759,142.018,779,402.018,799,2)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(468.018,760,0)
+bc(468.018,760,658.018,780,398.018,800,2)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,264,749.636)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(270.328,691.752))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,273,696)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(412.328,641.252))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,415,646)
+G_()
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,99,748.939)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(130.328,725.873))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Client Application',(281.3,726.57))
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-21,334,829)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Decoration Plugin',(351.648,815.434))
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-21,334,800)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Decoration Factory',(348.318,786.434))
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-40,414,749.636)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Decoration',(449.99,726.57))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Something happened!',(1,682.116))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(69,729,0)
+bs(94,729,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(228.526,719,0)
+bs(264,719,0)
+lw(1)
+ld((4, 4))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(264,734,0)
+bs(228.526,734,0)
+G()
+lw(1)
+b()
+bs(43.5002,769.5,0)
+bs(43.5002,769.5,0)
+bs(68.5,769.5,0)
+bs(58.5,719.5,0)
+bs(53.5,719.5,0)
+bs(43.5002,769.5,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(7.5,0,0,-7.5,56,707)
+G_()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(334,709,0)
+bs(334,679,0)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(108.164,757.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,111,762)
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-clientservercommunication.sk b/doc/src/diagrams/qtopiacore/qtopiacore-clientservercommunication.sk
new file mode 100644
index 0000000..4f8bcb6
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-clientservercommunication.sk
@@ -0,0 +1,130 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+b()
+bs(236.982,752,0)
+bc(236.982,752,46.9824,772,306.982,792,2)
+lw(1)
+ld((5, 5))
+b()
+bs(236.982,704,0)
+bc(236.982,704,46.9824,684,306.982,664,2)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(372.982,753,0)
+bc(372.982,753,562.982,773,302.982,793,2)
+lw(1)
+ld((5, 5))
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(372.982,703,0)
+bc(372.982,703,562.982,683,302.982,663,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,130,748)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,350,748)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(161.328,724.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Something happened!',(10,679.252))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Client',(383.662,724.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Top-level Windows',(380,795.616))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(265,728,0)
+bs(345,728,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(90,728,0)
+bs(125,728,0)
+G()
+lw(1)
+b()
+bs(55,768,0)
+bs(55,768,0)
+bs(80,768,0)
+bs(70,718,0)
+bs(65,718,0)
+bs(55,768,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(7.5,0,0,-7.5,67.5,705.5)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(102,740.116))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,105,744)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(202.328,793.752))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,205,798)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(277.328,739.252))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,280,744)
+G_()
+fp((0.812,0.906,0.651))
+lw(1)
+r(130,0,0,-18,240,673)
+fp((0.812,0.906,0.651))
+lw(1)
+r(130,0,0,-18,240,698)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Input Method Filter',(254.65,684.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Keyboard Filter',(263.32,658.934))
+fp((0.887,0.946,0.764))
+lw(1)
+r(130,0,0,40,225,788)
+fp((0.887,0.946,0.764))
+lw(1)
+r(130,0,0,40,235,778)
+fp((0.812,0.906,0.651))
+lw(1)
+r(130,0,0,40,245,768)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-drawingonscreen.sk b/doc/src/diagrams/qtopiacore/qtopiacore-drawingonscreen.sk
new file mode 100644
index 0000000..58d7c28
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-drawingonscreen.sk
@@ -0,0 +1,144 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+b()
+bs(117.018,750,0)
+bc(117.018,750,-72.9824,770,187.018,790,2)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(253.018,751,0)
+bc(253.018,751,443.018,771,183.018,791,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(-130,0,0,-40,335,740)
+fp((0.772,0.913,0.89))
+lw(1)
+r(-130,0,0,-40,510,740)
+fp((0.688,0.839,0.475))
+lw(1)
+r(-130,0,0,-40,160,740)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Screen Driver',(233.328,716.934))
+fp((0.812,0.906,0.651))
+lw(1)
+r(-130,0,0,-21,245,817.232)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Screen Plugin',(142.65,803.484))
+fp((0.812,0.906,0.651))
+lw(1)
+r(-130,0,0,-21,245,791)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Screen Factory',(139.32,777.434))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(61.328,716.934))
+fp((1,1,1))
+ft(0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(130,0,0,-40,380,670)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Memory',(465,611.252))
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,410.952,665)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,460.476,665)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,435.714,665)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,386.19,665)
+phs((0.349,0.349,0.349),(1,1,1),1,0,5,0.5)
+fp()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(18.5714,0,0,-30,485.238,665)
+le()
+lw(1)
+r(530,0,0,-270,10,830)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(160,720,0)
+bs(205,720,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(335,720,0)
+bs(380,720,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(380,650,0)
+bs(335,650,0)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(354.828,735.752))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,357.5,740)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(354.828,660.252))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,357.5,665)
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(181.862,735.939))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,185,740)
+G_()
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('Window Surface',(401.32,716.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(450,700,0)
+bs(450,670,0)
+bm(-1229773172,'launcher.png')
+im((0.35,0,0,0.35,241,573),-1229773172)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-opengl.sk b/doc/src/diagrams/qtopiacore/qtopiacore-opengl.sk
new file mode 100644
index 0000000..96076ed
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-opengl.sk
@@ -0,0 +1,38 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.704,0.775,0.846))
+le()
+lw(1)
+e(100,0,0,-32.5,175,795)
+fp((0.545,0.819,0.302))
+le()
+lw(1)
+r(120,0,0,-30,210,780)
+fp((0.545,0.819,0.302))
+le()
+lw(1)
+r(120,0,0,-30,15,780)
+fp((0.309,0.309,0.309))
+le()
+lw(1)
+Fn('Helvetica')
+txt('OpenGL',(52.32,761.934))
+fp((0.309,0.309,0.309))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Q Window System',(220.656,761.934))
+fp((0.369,0.369,0.369))
+le()
+lw(1)
+Fn('Helvetica')
+txt('EGL',(160.988,807.616))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(Native Platform Graphics Interface)',(79.306,791.934))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-pointerhandlinglayer.sk b/doc/src/diagrams/qtopiacore/qtopiacore-pointerhandlinglayer.sk
new file mode 100644
index 0000000..8d38864
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-pointerhandlinglayer.sk
@@ -0,0 +1,94 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(250,625,0)
+bc(250,625,350,670,250,745,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,180,790)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(211.328,766.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(225,625,0)
+bc(225,625,125,670,225,745,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,180,620)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Mouse Handler',(204.32,596.934))
+fp((0.812,0.906,0.651))
+lw(1)
+r(130,0,0,-20,245,685)
+fp((0.812,0.906,0.651))
+lw(1)
+r(130,0,0,-20,245,710)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Pointer pressed!',(22.592,582.616))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Mouse Driver Factory',(252.658,671.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Mouse Driver Plugin',(255.988,696.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(134.526,600,0)
+bs(175,600,0)
+fp((1,1,1))
+lw(1)
+r(65,0,0,-43.5,150,708.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWSEvent',(152.824,683.684))
+lw(1)
+lc(2)
+lj(1)
+b()
+bs(95,595,0)
+bs(105,605,0)
+bs(125,580,0)
+bs(135,590,0)
+bs(115,615,0)
+bs(125,625,0)
+bs(95,625,0)
+bs(95,595,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Start application',(343.039,762.252))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(336.525,766.636,0)
+bs(315.051,766.636,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(36)
+txt('GO!',(0.666667,0,0,0.666667,440,760))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-reserveregion.sk b/doc/src/diagrams/qtopiacore/qtopiacore-reserveregion.sk
new file mode 100644
index 0000000..04f9c99
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-reserveregion.sk
@@ -0,0 +1,89 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+e(10,0,0,-10,365,625)
+fp((1,1,1))
+lw(1)
+e(10,0,0,-10,195,630)
+fp((1,1,1))
+lw(1)
+e(10,0,0,-10,235,755)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(171.344,700,0)
+bc(171.344,700,25.7042,670,225,640,2)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(403.656,700,0)
+bc(403.656,700,549.296,670,350,640,2)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,150,740)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('2',(232.328,750.752))
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,150,810)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(181.328,786.934))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('Client Application',(168.65,716.934))
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-40,45,660)
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-40,305,740)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('Direct Painter',(73.658,636.934))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('Widget',(351.328,716.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(280,720,0)
+bs(300,720,0)
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('1',(191.862,625.939))
+fp((0,0,0))
+lw(1)
+Fn('Helvetica')
+txt('3',(362.328,620.252))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(215,770,0)
+bs(215,767.272,0)
+bs(215,740,0)
+lw(1)
+ld((5, 5))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(205,740,0)
+bs(205,742.728,0)
+bs(205,770,0)
+le()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(440,0,0,-260,30,820)
+bm(-1229732052,'launcher.png')
+im((0.45,0,0,0.45,232,541),-1229732052)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-setwindowattribute.sk b/doc/src/diagrams/qtopiacore/qtopiacore-setwindowattribute.sk
new file mode 100644
index 0000000..78d705d
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-setwindowattribute.sk
@@ -0,0 +1,102 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,430,725)
+fp((1,1,1))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,340,810)
+fp((1,1,1))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,140,760)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(228.165,800,0)
+bc(228.165,800,91.5416,775,278.5,750,2)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,195,820)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('2',(337.328,805.752))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(277.328,720.252))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(10,0,0,-10,280,725)
+G_()
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,20,820)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QWS Server',(51.328,796.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Client Application',(213.65,796.934))
+fp((0.772,0.913,0.89))
+lw(1)
+r(130,0,0,-40,280,770)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Widget',(326.328,746.934))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(150,800,0)
+bs(193.765,800,0)
+lw(1)
+ld((4, 4))
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(187.882,810,0)
+bs(151.235,810,0)
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(420,745,0)
+bs(445,745,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('1',(136.862,755.939))
+fp((1,1,1))
+lw(1)
+r(95,0,0,-25,240,740)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Paint On Screen',(243.478,724.434))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('3',(427.328,720.252))
+le()
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+r(570,0,0,-140,10,830)
+bm(-1229691508,'launcher.png')
+im((0.35,0,0,0.35,455,713),-1229691508)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtopiacore/qtopiacore-vanilla.sk b/doc/src/diagrams/qtopiacore/qtopiacore-vanilla.sk
new file mode 100644
index 0000000..73a9937
--- /dev/null
+++ b/doc/src/diagrams/qtopiacore/qtopiacore-vanilla.sk
@@ -0,0 +1,43 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.545,0.819,0.302))
+le()
+lw(1)
+r(370,0,0,-65,20,795)
+fp((0.309,0.309,0.309))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Q Window System',(286.312,737.616))
+fp((0.467,0.555,0.644))
+le()
+lw(1)
+e(150,0,0,-37.5,200,795)
+fp((0.704,0.775,0.846))
+le()
+lw(1)
+e(92.5,0,0,-25,167.5,800)
+fp((0.369,0.369,0.369))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Vanilla EGL Implementation',(101.272,800.626))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(Hybrid Graphics Ltd.)',(115,787.616))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Qtopia Core',(265,800.626))
+fp((1,1,1))
+le()
+lw(1)
+Fn('Helvetica')
+txt('interface',(274.336,787.616))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qtreeview.png b/doc/src/diagrams/qtreeview.png
new file mode 100644
index 0000000..05a70bf
--- /dev/null
+++ b/doc/src/diagrams/qtreeview.png
Binary files differ
diff --git a/doc/src/diagrams/qtscript-calculator.png b/doc/src/diagrams/qtscript-calculator.png
new file mode 100644
index 0000000..9ab824f
--- /dev/null
+++ b/doc/src/diagrams/qtscript-calculator.png
Binary files differ
diff --git a/doc/src/diagrams/qtscript-context2d.png b/doc/src/diagrams/qtscript-context2d.png
new file mode 100644
index 0000000..d3ad995
--- /dev/null
+++ b/doc/src/diagrams/qtscript-context2d.png
Binary files differ
diff --git a/doc/src/diagrams/qtwizard-page.sk b/doc/src/diagrams/qtwizard-page.sk
new file mode 100644
index 0000000..bd7b9ef
--- /dev/null
+++ b/doc/src/diagrams/qtwizard-page.sk
@@ -0,0 +1,144 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(1089094028,'/tmp/wizard2.png')
+im((-71.3622,789.945),1089094028)
+bm(1083700940,'qtwizard-page.png')
+im((45.535,207.627),1083700940)
+lp((1,0,0))
+lw(1.5)
+r(158.372,0,0,-22.6246,57.6554,643.69,0.0680272,0.487805)
+lp((1,0,0))
+lw(1.5)
+r(165.372,0,0,-22.6246,131.655,1241.69,0.0680272,0.487805)
+lp((1,0,0))
+lw(1.5)
+r(384.08,0,0,-39.8624,72.5035,624.062,0.0680272,0.487805)
+lp((1,0,0))
+lw(1.5)
+r(419.371,0,0,-39.8624,141.212,1197.06,0.0680272,0.487805)
+fp((1,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('title',(-19.9279,627.778))
+fp((1,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('title',(-111.95,1225.78))
+fp((0.064,0.45,0.228))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('banner',(587.072,627.778))
+fp((0.064,0.45,0.228))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('logo',(587.072,601.278))
+fp((1,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('subtitle',(-51.9319,599.532))
+fp((1,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('subtitle',(1.06195,0,0,1,-147.919,1172.53))
+lp((0.064,0.45,0.228))
+lw(1.5)
+r(61.1473,0,0,-57.6388,476.211,642.073,0.123333,0.130841)
+lp((0.064,0.45,0.228))
+lw(1.5)
+r(494.509,0,0,-69.4899,52.5723,647.764,0.0217865,0.155038)
+lp((1,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(18.3317,632.377,0)
+bs(55.5006,632.377,0)
+bs(55.5006,632.377,0)
+bs(55.5006,632.377,0)
+lp((1,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-67.6683,1230.38,0)
+bs(129.501,1230.38,0)
+bs(129.501,1230.38,0)
+bs(129.501,1230.38,0)
+lp((0.064,0.45,0.228))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(577.821,632.377,0)
+bs(549.809,632.377,0)
+lp((0.064,0.45,0.228))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(577.821,605.877,0)
+bs(539.809,605.877,0)
+lp((1,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(19.1741,604.131,0)
+bs(69.8101,604.131,0)
+bs(69.8101,604.131,0)
+bs(69.8101,604.131,0)
+lp((1,0,0))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-66.9213,1177.13,0)
+bs(135.351,1177.13,0)
+bs(135.351,1177.13,0)
+bs(135.351,1177.13,0)
+G()
+fp((0.064,0.45,0.228))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('watermark',(-77.9599,415.278))
+lp((0.064,0.45,0.228))
+lw(1.5)
+r(162.143,0,0,-304.355,52.3374,571.575,0.0664452,0.0353982)
+lp((0.064,0.45,0.228))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(19.8675,419.877,0)
+bs(49.8789,419.877,0)
+bs(49.8789,419.877,0)
+bs(49.8789,419.877,0)
+G_()
+fp((0.064,0.45,0.228))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+Fs(18)
+txt('background',(-182.96,1038.55))
+lp((0.064,0.45,0.228))
+lw(1.5)
+r(239.143,0,0,-345.855,-34.1627,1216.07,0.0664452,0.0353982)
+lp((0.064,0.45,0.228))
+lw(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-66.6325,1043.15,0)
+bs(-36.6211,1043.15,0)
+bs(-36.6211,1043.15,0)
+bs(-36.6211,1043.15,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,10000,10000),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/qwsserver_keyboardfilter.sk b/doc/src/diagrams/qwsserver_keyboardfilter.sk
new file mode 100644
index 0000000..3ac0f80
--- /dev/null
+++ b/doc/src/diagrams/qwsserver_keyboardfilter.sk
@@ -0,0 +1,39 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(1)
+b()
+bs(78.195,794,0)
+bc(78.195,794,-115.245,809.5,149.463,825,2)
+lw(1)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(216.804,795,0)
+bc(216.804,795,410.246,810,145.537,825,2)
+fp((0.688,0.839,0.475))
+lw(1)
+r(130,0,0,-40,10,790)
+fp((0.636,0.839,0.81))
+lw(1)
+r(130,0,0,-40,155,790)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Qtopia Core Server',(23.316,766.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Qtopia Core Client',(170.65,766.934))
+fp((0.812,0.906,0.651))
+lw(1)
+r(130,0,0,-18,80,830)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Keyboard Filter',(103.32,815.934))
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/resources.sk b/doc/src/diagrams/resources.sk
new file mode 100644
index 0000000..a679205
--- /dev/null
+++ b/doc/src/diagrams/resources.sk
@@ -0,0 +1,125 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lw(5)
+la2(([(-6.0, 3.0), (-5.0, 0.0, 0.0, 0.0, 1.0, 0.0), (0.0, 0.0, -5.0, 0.0, -6.0, -3.0)], 0))
+b()
+bs(266.638,603.695,0)
+bs(344.138,603.695,0)
+G()
+fp((0.727,0.843,1))
+lw(1)
+r(150,0,0,-20,90.5128,722.445)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('application.pro',(126.495,708.445))
+fp((0.727,0.843,1))
+lw(1)
+r(150,0,0,-20,90.5128,694.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('application.qrc',(126.831,680.945))
+fp((0.727,0.843,1))
+lw(1)
+r(150,0,0,-20,90.5128,667.445)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('main.cpp',(141.171,653.445))
+fp((0.727,0.843,1))
+lw(1)
+r(150,0,0,-20,90.5128,639.445)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('mainwindow.cpp',(121.167,625.445))
+fp((0.727,0.843,1))
+lw(1)
+r(150,0,0,-20,90.5128,612.445)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('mainwindow.h',(127.503,598.445))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Times-Roman')
+txt('. . .',(0.000374682,-1,1,0.000374682,162.714,532.24))
+fp((1,0.756,0.576))
+lw(1)
+r(150,0,0,-20,90.5128,585)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('images/copy.png',(120.159,571))
+fp((1,0.756,0.576))
+lw(1)
+r(150,0,0,-20,90.5128,557.445)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('images/cut.png',(124.827,543.445))
+fp((1,0.756,0.576))
+lw(1)
+r(150,0,0,-20,90.5128,514.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('images/save.png',(120.159,500.945))
+G_()
+fp((0.941,0.941,0.941))
+lw(1)
+r(178,0,0,-154.5,370.138,671.945)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('application.exe',(399.108,647.929))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Times-Roman')
+txt('. . .',(0.000374682,-1,1,0.000374682,458.951,572.295))
+fp((1,0.756,0.576))
+lw(1)
+r(150,0,0,-20,385,625.055)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt(':/images/copy.png',(411.31,611.055))
+fp((1,0.756,0.576))
+lw(1)
+r(150,0,0,-20,385,597.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt(':/images/cut.png',(415.978,583.5))
+fp((1,0.756,0.576))
+lw(1)
+r(150,0,0,-20,385,555)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt(':/images/save.png',(411.31,541))
+G_()
+le()
+lw(1)
+r(482.5,0,0,-252.5,80,735)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/shapedclock.sk b/doc/src/diagrams/shapedclock.sk
new file mode 100644
index 0000000..ba3b020
--- /dev/null
+++ b/doc/src/diagrams/shapedclock.sk
@@ -0,0 +1,46 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(-1214279092,'clock.png')
+im((30,697.5),-1214279092)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('frameGeometry().topLeft()',(23.86,822.07))
+fp((0,0,0))
+lp((0.631,0,0))
+lw(2)
+Fn('Helvetica')
+Fs(10)
+txt('event->globalPos()',(92.5,767.07))
+lp((0.631,0,0))
+lw(1)
+lc(2)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(25,817.5,0)
+bs(87.5,765,0)
+lw(1)
+ld((1, 1))
+b()
+bs(25,817.5,0)
+bs(32.5,817.5,0)
+lw(1)
+ld((1, 1))
+b()
+bs(25,817.5,0)
+bs(25,810,0)
+fp((0.631,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(10)
+txt('dragPosition',(0.758173,-0.652054,0.652054,0.758173,38.8498,810.656))
+le()
+lw(1)
+r(177.5,0,0,-152.5,10,840)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/sharedmodel-tableviews.zip b/doc/src/diagrams/sharedmodel-tableviews.zip
new file mode 100644
index 0000000..5a62f02
--- /dev/null
+++ b/doc/src/diagrams/sharedmodel-tableviews.zip
Binary files differ
diff --git a/doc/src/diagrams/sharedselection-tableviews.zip b/doc/src/diagrams/sharedselection-tableviews.zip
new file mode 100644
index 0000000..b591e19
--- /dev/null
+++ b/doc/src/diagrams/sharedselection-tableviews.zip
Binary files differ
diff --git a/doc/src/diagrams/standard-views.sk b/doc/src/diagrams/standard-views.sk
new file mode 100644
index 0000000..d67a603
--- /dev/null
+++ b/doc/src/diagrams/standard-views.sk
@@ -0,0 +1,16 @@
+##Sketch 1 2
+document()
+layout('A3',1)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((1,1,1))
+le()
+lw(1)
+r(845,0,0,-240,70,310)
+bm(-1090754548,'gallery-images/plastique-listview.png')
+im((80,82),-1090754548)
+bm(-1090737652,'gallery-images/plastique-treeview.png')
+im((360,82),-1090737652)
+bm(-1090629812,'gallery-images/plastique-tableview.png')
+im((640,82),-1090629812)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/standarddialogs-example.png b/doc/src/diagrams/standarddialogs-example.png
new file mode 100644
index 0000000..73a8e8a
--- /dev/null
+++ b/doc/src/diagrams/standarddialogs-example.png
Binary files differ
diff --git a/doc/src/diagrams/standarddialogs-example.zip b/doc/src/diagrams/standarddialogs-example.zip
new file mode 100644
index 0000000..109b69e
--- /dev/null
+++ b/doc/src/diagrams/standarddialogs-example.zip
Binary files differ
diff --git a/doc/src/diagrams/stylesheet/coffee-plastique.png b/doc/src/diagrams/stylesheet/coffee-plastique.png
new file mode 100644
index 0000000..7da1fdc
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/coffee-plastique.png
Binary files differ
diff --git a/doc/src/diagrams/stylesheet/coffee-windows.png b/doc/src/diagrams/stylesheet/coffee-windows.png
new file mode 100644
index 0000000..9083a07
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/coffee-windows.png
Binary files differ
diff --git a/doc/src/diagrams/stylesheet/coffee-xp.png b/doc/src/diagrams/stylesheet/coffee-xp.png
new file mode 100644
index 0000000..4188a23
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/coffee-xp.png
Binary files differ
diff --git a/doc/src/diagrams/stylesheet/pagefold.png b/doc/src/diagrams/stylesheet/pagefold.png
new file mode 100644
index 0000000..b479d4d
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/pagefold.png
Binary files differ
diff --git a/doc/src/diagrams/stylesheet/pagefold.svg b/doc/src/diagrams/stylesheet/pagefold.svg
new file mode 100644
index 0000000..5f20e2e
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/pagefold.svg
@@ -0,0 +1,1678 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.43"
+ sodipodi:docbase="/home/qt/dev/qt/doc/src/diagrams/stylesheet"
+ sodipodi:docname="pagefold.svg"
+ inkscape:export-filename="c:\lineedit.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient2650">
+ <stop
+ style="stop-color:#8b8b8b;stop-opacity:1;"
+ offset="0"
+ id="stop2652" />
+ <stop
+ style="stop-color:#8b8b8b;stop-opacity:0;"
+ offset="1"
+ id="stop2654" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2530">
+ <stop
+ id="stop2532"
+ offset="0"
+ style="stop-color:#fafafa;stop-opacity:0.74509805;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0.37254903;"
+ offset="1"
+ id="stop2536" />
+ <stop
+ id="stop2534"
+ offset="1"
+ style="stop-color:#666666;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2287">
+ <stop
+ id="stop2289"
+ offset="0"
+ style="stop-color:#dfbbbb;stop-opacity:1;" />
+ <stop
+ id="stop2291"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient14054">
+ <stop
+ id="stop14056"
+ offset="0"
+ style="stop-color:white;stop-opacity:1;" />
+ <stop
+ id="stop14058"
+ offset="1"
+ style="stop-color:white;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11371">
+ <stop
+ id="stop11373"
+ offset="0"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ id="stop11375"
+ offset="1"
+ style="stop-color:#611a02;stop-opacity:0.88659793;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient11290">
+ <stop
+ id="stop11292"
+ offset="0"
+ style="stop-color:#c8c8c8;stop-opacity:0.86666667;" />
+ <stop
+ id="stop11294"
+ offset="1"
+ style="stop-color:#ded5cf;stop-opacity:0.86274511;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient10355">
+ <stop
+ id="stop10357"
+ offset="0"
+ style="stop-color:#eeeae6;stop-opacity:0.86274511;" />
+ <stop
+ id="stop10359"
+ offset="1"
+ style="stop-color:white;stop-opacity:0.86666667;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient8520">
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="0"
+ id="stop8522" />
+ <stop
+ style="stop-color:white;stop-opacity:0;"
+ offset="1"
+ id="stop8524" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient8477">
+ <stop
+ style="stop-color:#ded5cf;stop-opacity:0.86274511;"
+ offset="0"
+ id="stop8479" />
+ <stop
+ style="stop-color:white;stop-opacity:0.86666667;"
+ offset="1"
+ id="stop8481" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6598">
+ <stop
+ style="stop-color:#d0c7c7;stop-opacity:0.84705883;"
+ offset="0"
+ id="stop6600" />
+ <stop
+ id="stop6606"
+ offset="0.5"
+ style="stop-color:#997e7e;stop-opacity:0.42352942;" />
+ <stop
+ style="stop-color:#887f7f;stop-opacity:0;"
+ offset="1"
+ id="stop6602" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6584">
+ <stop
+ style="stop-color:#887f7f;stop-opacity:0.84705883;"
+ offset="0"
+ id="stop6586" />
+ <stop
+ style="stop-color:#887f7f;stop-opacity:0.84705883;"
+ offset="1"
+ id="stop6588" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6569">
+ <stop
+ style="stop-color:#d8cfcf;stop-opacity:0.11340206;"
+ offset="0"
+ id="stop6571" />
+ <stop
+ style="stop-color:#9f9f9f;stop-opacity:0.84705883;"
+ offset="1"
+ id="stop6573" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5655">
+ <stop
+ id="stop5657"
+ offset="0"
+ style="stop-color:#795e5e;stop-opacity:1;" />
+ <stop
+ id="stop5659"
+ offset="1"
+ style="stop-color:#170000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4756">
+ <stop
+ style="stop-color:#dfc8c8;stop-opacity:1;"
+ offset="0"
+ id="stop4758" />
+ <stop
+ style="stop-color:#f7f7f7;stop-opacity:1;"
+ offset="1"
+ id="stop4760" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7289">
+ <stop
+ id="stop7291"
+ offset="0"
+ style="stop-color:#616161;stop-opacity:1;" />
+ <stop
+ id="stop7293"
+ offset="1"
+ style="stop-color:white;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4599">
+ <stop
+ style="stop-color:#616161;stop-opacity:1;"
+ offset="0"
+ id="stop4601" />
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="1"
+ id="stop4603" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3671">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop3673" />
+ <stop
+ style="stop-color:#e8e6fc;stop-opacity:0;"
+ offset="1"
+ id="stop3675" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2760">
+ <stop
+ style="stop-color:#ffc476;stop-opacity:1;"
+ offset="0"
+ id="stop2762" />
+ <stop
+ style="stop-color:#fcf95c;stop-opacity:1;"
+ offset="1"
+ id="stop2764" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4599"
+ id="linearGradient4605"
+ x1="743.97229"
+ y1="10.354198"
+ x2="665.18542"
+ y2="103.28822"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6584"
+ id="radialGradient6596"
+ cx="56.730461"
+ cy="175.79576"
+ fx="56.730461"
+ fy="175.79576"
+ r="33.814732"
+ gradientTransform="matrix(-2.331063e-2,0.911966,-0.685725,-1.752744e-2,186.5197,128.41)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6598"
+ id="linearGradient6604"
+ x1="39.926405"
+ y1="177.065"
+ x2="63.861485"
+ y2="207.90289"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6569"
+ id="radialGradient7498"
+ cx="73.741135"
+ cy="177.065"
+ fx="73.741135"
+ fy="177.065"
+ r="39.288086"
+ gradientTransform="matrix(1,0,0,0.987144,0,2.276301)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6569"
+ id="radialGradient7532"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.987144,0,2.276301)"
+ cx="73.741135"
+ cy="177.065"
+ fx="73.741135"
+ fy="177.065"
+ r="39.288086" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6598"
+ id="linearGradient7560"
+ gradientUnits="userSpaceOnUse"
+ x1="39.926405"
+ y1="177.065"
+ x2="63.861485"
+ y2="207.90289" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6584"
+ id="radialGradient7562"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.331063e-2,0.911966,-0.685725,-1.752744e-2,186.5197,128.41)"
+ cx="56.730461"
+ cy="175.79576"
+ fx="56.730461"
+ fy="175.79576"
+ r="33.814732" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient11306"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-208.8971,-30.27314)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient11310"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,8.175633,-10.42983)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient11314"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-211.1668,-83.31197)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient11318"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,8.324065,-66.639)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient11328"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-211.0184,-139.5212)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11371"
+ id="radialGradient11369"
+ cx="58.5"
+ cy="327.36218"
+ fx="58.5"
+ fy="327.36218"
+ r="29.5"
+ gradientTransform="matrix(1,0,0,0.983051,0,5.548512)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6569"
+ id="linearGradient14052"
+ x1="216"
+ y1="342.36218"
+ x2="176"
+ y2="297.36218"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(1,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2287"
+ id="linearGradient2285"
+ x1="328"
+ y1="282.86218"
+ x2="328"
+ y2="358.86218"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.655738,0,0,0.625,102.418,113.1983)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2528"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5"
+ gradientTransform="matrix(1,0,0,1.058824,-6.299127e-14,-21.31542)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2540"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-2.288447e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2544"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-4.936329e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2548"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-5.097311e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2552"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-6.823707e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2556"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-7.367717e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2560"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-3.060052e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2564"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-6.49064e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2568"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-8.000546e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2572"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,-1.133121e-13,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2586"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,7.160949e-15,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2588"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,9.328648e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2590"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,7.746581e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2592"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,8.586184e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2594"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,1.825207e-13,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2596"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,4.617141e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2598"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,1.225548e-13,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2600"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,8.193448e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2602"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,4.961308e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2604"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,2.60764e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2616"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,4.556079e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2618"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,2.11359e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2620"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,4.184152e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2622"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,8.16708e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2624"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,8.19379e-14,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2530"
+ id="radialGradient2626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.058824,1.20513e-13,-21.31542)"
+ cx="404.5"
+ cy="362.36218"
+ fx="404.5"
+ fy="362.36218"
+ r="8.5" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2650"
+ id="linearGradient2658"
+ x1="260.63467"
+ y1="439.97522"
+ x2="323.47839"
+ y2="502.97522"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2650"
+ id="linearGradient2662"
+ gradientUnits="userSpaceOnUse"
+ x1="260.63467"
+ y1="439.97522"
+ x2="323.47839"
+ y2="502.97522"
+ gradientTransform="matrix(0.848296,0,0,0.848296,53.62318,81.14764)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2650"
+ id="linearGradient2668"
+ gradientUnits="userSpaceOnUse"
+ x1="260.63467"
+ y1="439.97522"
+ x2="323.47839"
+ y2="502.97522"
+ gradientTransform="translate(-7,-7)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2650"
+ id="linearGradient2852"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.718744,0,0,0.718744,83.39873,135.0499)"
+ x1="260.63467"
+ y1="439.97522"
+ x2="323.47839"
+ y2="502.97522" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2650"
+ id="linearGradient2856"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.475495,0,0,0.475495,163.1776,260.7723)"
+ x1="260.63467"
+ y1="439.97522"
+ x2="323.47839"
+ y2="502.97522" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2650"
+ id="linearGradient2859"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.718744,0,0,0.718744,88.64874,139.3206)"
+ x1="260.63467"
+ y1="439.97522"
+ x2="323.47839"
+ y2="502.97522" />
+ <pattern
+ patternUnits="userSpaceOnUse"
+ width="17"
+ height="17"
+ patternTransform="translate(363,334.3622)"
+ id="pattern3055">
+ <image
+ y="0"
+ x="0"
+ xlink:href="/tmp/sizegrip.png"
+ sodipodi:absref="/tmp/sizegrip.png"
+ width="17"
+ height="17"
+ id="image3052" />
+ </pattern>
+ <pattern
+ patternUnits="userSpaceOnUse"
+ width="17"
+ height="17"
+ patternTransform="translate(363,334.3622)"
+ id="pattern3062">
+ <image
+ y="0"
+ x="0"
+ xlink:href="/tmp/sizegrip.png"
+ sodipodi:absref="/tmp/sizegrip.png"
+ width="17"
+ height="17"
+ id="image3060" />
+ </pattern>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2287"
+ id="linearGradient3171"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.655738,0,0,-0.625,533.082,557.5261)"
+ x1="328"
+ y1="282.86218"
+ x2="328"
+ y2="358.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient2346"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,55.64416,318.6709)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient4123"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-211.0184,-139.5212)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient4125"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,8.324065,-66.639)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient4128"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,-177.3558,334.6709)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient4132"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-396.6983,261.7887)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient4149"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-491.6195,14.76774)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient5042"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-211.1668,-83.31197)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient5044"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,8.175633,-10.42983)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient5048"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,-200.3559,296.6709)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient5051"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-419.6983,223.7887)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient5060"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-208.8971,-30.27314)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient5063"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-416.6983,243.7888)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient5955"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-213.0217,14.29092)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient5959"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-400.0217,15.29092)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient5963"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-306.0217,15.29092)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient5973"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-489.7228,1063.41)"
+ x1="357.00003"
+ y1="415.53799"
+ x2="357.00003"
+ y2="469.14316" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient5975"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-212.3206,1059.933)"
+ x1="357.17999"
+ y1="415.53723"
+ x2="357.17999"
+ y2="470.05835" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient5977"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-396.3206,1061.933)"
+ x1="357.17999"
+ y1="415.53705"
+ x2="357.17999"
+ y2="469.14362" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient5979"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-303.3206,1059.933)"
+ x1="357.17999"
+ y1="415.53699"
+ x2="357.17999"
+ y2="469.14362" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient1500"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-481.6711,170.2793)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient1503"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-209.0216,170.7205)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient1507"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-301.5216,169.7205)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient1511"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,1.09434,-391.5216,170.2205)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient2394"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-481.3464,1204.445)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient2396"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-208.6969,1204.004)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient2398"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-301.1969,1205.004)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient2400"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.543478,0,0,-1.09434,-391.1969,1204.504)"
+ x1="357.17999"
+ y1="469.23767"
+ x2="357.17999"
+ y2="415.86218" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8477"
+ id="linearGradient2428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-211.0184,-139.5212)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient2430"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,8.324065,-66.639)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient11290"
+ id="linearGradient2432"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-208.8971,-30.27314)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient10355"
+ id="linearGradient2434"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.718783,0,0,1.40468,-211.1668,-83.31197)"
+ x1="331.16711"
+ y1="199.51926"
+ x2="331.16711"
+ y2="177.27299" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient8520"
+ id="linearGradient2436"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.986928,0,0,1,8.175633,-10.42983)"
+ x1="358.32635"
+ y1="172.3678"
+ x2="358.32635"
+ y2="177.58272" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2"
+ inkscape:cx="146.93424"
+ inkscape:cy="238.10225"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1017"
+ inkscape:window-height="703"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:#dcdcdc;fill-opacity:0.35526314;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 587.40371,4.7760765 L 743.97735,115.89285 C 743.97735,115.89285 714.96821,103.50692 666.19562,146.19742 C 662.12502,149.76041 661.14485,70.435993 587.40371,4.7760765 z "
+ id="path7285"
+ sodipodi:nodetypes="ccsc"
+ inkscape:export-filename="c:\pagefold.png"
+ inkscape:export-xdpi="51.43"
+ inkscape:export-ydpi="51.43" />
+ <path
+ style="fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 745.49258,1.7858134 L 746.50273,117.97107 L 745.49258,1.7858134 z "
+ id="path3710"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:url(#linearGradient4605);fill-rule:evenodd;stroke:#8b8b8b;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1.0"
+ d="M 586.89863,1.8035354 L 743.47227,112.92031 C 743.47227,112.92031 702.3413,100.53438 653.56871,143.22488 C 649.49811,146.78787 660.63977,67.463454 586.89863,1.8035354 z "
+ id="path3712"
+ sodipodi:nodetypes="ccsc"
+ inkscape:export-filename="c:\pagefold.png"
+ inkscape:export-xdpi="51.43"
+ inkscape:export-ydpi="51.43" />
+ <path
+ style="fill:#e5ecf8;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.32236841"
+ d="M 586.89863,1.8035355 C 743.47227,1.8035355 743.47227,1.8035355 743.47227,1.8035355 L 743.47227,111.91016 L 586.89863,1.8035355 z "
+ id="path4608"
+ inkscape:export-xdpi="28.74"
+ inkscape:export-ydpi="28.74" />
+ <rect
+ style="fill:#f7f7f7;fill-opacity:0.78947371;stroke:#8b8b8b;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect1872"
+ width="298.86383"
+ height="60.557034"
+ x="24.819391"
+ y="12.94127"
+ rx="14.293656"
+ inkscape:export-filename="c:\lineedit.png"
+ inkscape:export-xdpi="28.74"
+ inkscape:export-ydpi="28.74" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#f7f7f7;fill-opacity:0.78431374;stroke:#8b8b8b;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path2978"
+ sodipodi:cx="73.741135"
+ sodipodi:cy="177.065"
+ sodipodi:rx="31.31473"
+ sodipodi:ry="30.809652"
+ d="M 105.05586 177.065 A 31.31473 30.809652 0 1 1 42.426405,177.065 A 31.31473 30.809652 0 1 1 105.05586 177.065 z"
+ transform="translate(-20.20305,-25.25381)"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_unchecked.png"
+ inkscape:export-xdpi="17.299999"
+ inkscape:export-ydpi="17.299999" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#f7f7f7;fill-opacity:0.78431373;stroke:url(#radialGradient7498);stroke-width:15.94671249;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3867"
+ sodipodi:cx="73.741135"
+ sodipodi:cy="177.065"
+ sodipodi:rx="31.31473"
+ sodipodi:ry="30.809652"
+ d="M 105.05586 177.065 A 31.31473 30.809652 0 1 1 42.426405,177.065 A 31.31473 30.809652 0 1 1 105.05586 177.065 z"
+ transform="matrix(0.909446,0,0,0.907961,60.2157,-8.95693)"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_unchecked_hover.png"
+ inkscape:export-xdpi="16.336388"
+ inkscape:export-ydpi="16.336388" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient6604);fill-opacity:1;stroke:url(#radialGradient6596);stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3869"
+ sodipodi:cx="73.741135"
+ sodipodi:cy="177.065"
+ sodipodi:rx="31.31473"
+ sodipodi:ry="30.809652"
+ d="M 105.05586 177.065 A 31.31473 30.809652 0 1 1 42.426405,177.065 A 31.31473 30.809652 0 1 1 105.05586 177.065 z"
+ transform="translate(144.4518,-28.78935)"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_unchecked_pressed.png"
+ inkscape:export-xdpi="17.299999"
+ inkscape:export-ydpi="17.299999" />
+ <g
+ id="g7526"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_checked.png"
+ inkscape:export-xdpi="17.299999"
+ inkscape:export-ydpi="17.299999">
+ <path
+ inkscape:export-ydpi="17.299999"
+ inkscape:export-xdpi="17.299999"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton.png"
+ transform="translate(-19.1929,50.00255)"
+ d="M 105.05586 177.065 A 31.31473 30.809652 0 1 1 42.426405,177.065 A 31.31473 30.809652 0 1 1 105.05586 177.065 z"
+ sodipodi:ry="30.809652"
+ sodipodi:rx="31.31473"
+ sodipodi:cy="177.065"
+ sodipodi:cx="73.741135"
+ id="path7500"
+ style="fill:#f7f7f7;fill-opacity:0.78431373;stroke:#8b8b8b;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.772198,0,0,0.675157,10.75109,73.06635)"
+ d="M 64.649762 229.59293 A 8.586297 7.5761442 0 1 1 47.477168,229.59293 A 8.586297 7.5761442 0 1 1 64.649762 229.59293 z"
+ sodipodi:ry="7.5761442"
+ sodipodi:rx="8.586297"
+ sodipodi:cy="229.59293"
+ sodipodi:cx="56.063465"
+ id="path7512"
+ style="fill:#f7f7f7;fill-opacity:0.78431373;stroke:#b7adad;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.80921056"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7536"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_checked_hover.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999">
+ <path
+ inkscape:export-ydpi="16.336388"
+ inkscape:export-xdpi="16.336388"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_hover.png"
+ transform="matrix(0.909446,0,0,0.907961,66.27656,65.28928)"
+ d="M 105.05586 177.065 A 31.31473 30.809652 0 1 1 42.426405,177.065 A 31.31473 30.809652 0 1 1 105.05586 177.065 z"
+ sodipodi:ry="30.809652"
+ sodipodi:rx="31.31473"
+ sodipodi:cy="177.065"
+ sodipodi:cx="73.741135"
+ id="path7530"
+ style="fill:#f7f7f7;fill-opacity:0.78431373;stroke:url(#radialGradient7532);stroke-width:15.94671249;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.772198,0,0,0.675157,90.04808,71.04611)"
+ d="M 64.649762 229.59293 A 8.586297 7.5761442 0 1 1 47.477168,229.59293 A 8.586297 7.5761442 0 1 1 64.649762 229.59293 z"
+ sodipodi:ry="7.5761442"
+ sodipodi:rx="8.586297"
+ sodipodi:cy="229.59293"
+ sodipodi:cx="56.063465"
+ id="path7534"
+ style="fill:#f7f7f7;fill-opacity:0.78431373;stroke:#b7adad;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.80921056"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g7556"
+ transform="matrix(1.074683,0,0,1.060652,-15.71476,-12.762)"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_checked_pressed.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999">
+ <path
+ transform="matrix(0.772198,0,0,0.675157,174.3959,72.05619)"
+ d="M 64.649762 229.59293 A 8.586297 7.5761442 0 1 1 47.477168,229.59293 A 8.586297 7.5761442 0 1 1 64.649762 229.59293 z"
+ sodipodi:ry="7.5761442"
+ sodipodi:rx="8.586297"
+ sodipodi:cy="229.59293"
+ sodipodi:cx="56.063465"
+ id="path7524"
+ style="fill:#f7f7f7;fill-opacity:0.78431373;stroke:#b7adad;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.80921056"
+ sodipodi:type="arc" />
+ <path
+ inkscape:transform-center-x="70.710678"
+ inkscape:export-ydpi="17.299999"
+ inkscape:export-xdpi="17.299999"
+ inkscape:export-filename="c:\depot\qt\4.2\examples\widgets\stylesheet\images\radiobutton_pressed.png"
+ transform="translate(143.4416,50.00254)"
+ d="M 105.05586 177.065 A 31.31473 30.809652 0 1 1 42.426405,177.065 A 31.31473 30.809652 0 1 1 105.05586 177.065 z"
+ sodipodi:ry="30.809652"
+ sodipodi:rx="31.31473"
+ sodipodi:cy="177.065"
+ sodipodi:cx="73.741135"
+ id="path7540"
+ style="fill:url(#linearGradient7560);fill-opacity:1;stroke:url(#radialGradient7562);stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="g11333">
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton.png"
+ rx="8.4277067"
+ y="109.12024"
+ x="302.04776"
+ height="40.971741"
+ width="119.00411"
+ id="rect8557"
+ style="fill:black;fill-opacity:0.0657895;stroke:none;stroke-width:2.38755798;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton.png"
+ rx="8.5229921"
+ y="103.71593"
+ x="298.01132"
+ height="42.515831"
+ width="120.34961"
+ id="rect8559"
+ style="fill:url(#linearGradient11328);fill-opacity:1;stroke:#8b8b8b;stroke-width:3.40678048;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton.png"
+ ry="3.3333139"
+ rx="0.90303022"
+ y="107.7652"
+ x="298.56201"
+ height="34.143112"
+ width="3.1697834"
+ id="rect8561"
+ style="fill:white;fill-opacity:0.66447371;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton.png"
+ ry="1.5026071"
+ rx="0.78104818"
+ y="105.7288"
+ x="305.26501"
+ height="3.0052142"
+ width="106.77315"
+ id="rect8563"
+ style="fill:url(#linearGradient11318);fill-opacity:1;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g11345">
+ <rect
+ inkscape:export-ydpi="34.630936"
+ inkscape:export-xdpi="34.630936"
+ inkscape:export-filename="c:\pushbutton_pressed.png"
+ rx="8.4277067"
+ y="218.36829"
+ x="304.1691"
+ height="40.971741"
+ width="119.00411"
+ id="rect10379"
+ style="fill:black;fill-opacity:0.0657895;stroke:none;stroke-width:2.38755798;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630936"
+ inkscape:export-xdpi="34.630936"
+ inkscape:export-filename="c:\pushbutton_pressed.png"
+ rx="8.5229921"
+ y="212.96397"
+ x="300.13266"
+ height="42.515831"
+ width="120.34961"
+ id="rect10381"
+ style="fill:url(#linearGradient11306);fill-opacity:1;stroke:#8b8b8b;stroke-width:3.40678048;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="g11339">
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton_hover.png"
+ rx="8.4277067"
+ y="165.32945"
+ x="301.89935"
+ height="40.971741"
+ width="119.00411"
+ id="rect7570"
+ style="fill:black;fill-opacity:0.0657895;stroke:none;stroke-width:2.38755798;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton_hover.png"
+ rx="8.5229921"
+ y="159.92514"
+ x="297.86288"
+ height="42.515831"
+ width="120.34961"
+ id="rect8483"
+ style="fill:url(#linearGradient11314);fill-opacity:1;stroke:#8b8b8b;stroke-width:3.40678048;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton_hover.png"
+ ry="1.5026071"
+ rx="0.78104818"
+ y="161.93797"
+ x="305.11658"
+ height="3.0052142"
+ width="106.77315"
+ id="rect8518"
+ style="fill:url(#linearGradient11310);fill-opacity:1;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ inkscape:export-ydpi="34.630928"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-filename="c:\pushbutton_hover.png"
+ ry="3.3333139"
+ rx="0.90303022"
+ y="164.66541"
+ x="298.93549"
+ height="34.143112"
+ width="3.1697834"
+ id="rect11331"
+ style="fill:white;fill-opacity:0.66447371;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <rect
+ style="fill:white;fill-opacity:0.50196078;stroke:#818181;stroke-width:10;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect12262"
+ width="54"
+ height="52"
+ x="38"
+ y="309.36218"
+ rx="0"
+ inkscape:export-filename="c:\checkbox_unchecked.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444" />
+ <rect
+ style="fill:white;fill-opacity:0.50196078;stroke:#9a9a9a;stroke-width:10;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14034"
+ width="54"
+ height="52"
+ x="111"
+ y="310.36218"
+ rx="0"
+ inkscape:export-filename="c:\checkbox_unchecked_hover.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444" />
+ <rect
+ style="fill:url(#linearGradient14052);fill-opacity:1;stroke:#9a9a9a;stroke-width:10;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14036"
+ width="54"
+ height="52"
+ x="182"
+ y="308.36218"
+ rx="0"
+ inkscape:export-filename="c:\checkbox_unchecked_pressed.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444" />
+ <rect
+ style="fill:white;fill-opacity:0.50196078;stroke:#818181;stroke-width:10;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14062"
+ width="54"
+ height="52"
+ x="114"
+ y="382.36218"
+ rx="0"
+ inkscape:export-filename="c:\checkbox_unchecked.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444" />
+ <rect
+ style="fill:white;fill-opacity:0.50196078;stroke:#818181;stroke-width:10;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14064"
+ width="54"
+ height="52"
+ x="186"
+ y="381.36218"
+ rx="0"
+ inkscape:export-filename="c:\checkbox_unchecked.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444" />
+ <g
+ id="g14074"
+ inkscape:export-filename="c:\checkbox_checked.png"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-ydpi="18.619444">
+ <rect
+ inkscape:export-ydpi="18.619444"
+ inkscape:export-xdpi="18.619444"
+ inkscape:export-filename="c:\checkbox_unchecked.png"
+ rx="0"
+ y="383.36218"
+ x="41"
+ height="52"
+ width="54"
+ id="rect14060"
+ style="fill:white;fill-opacity:0.50196078;stroke:#818181;stroke-width:10;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path14066"
+ d="M 53,410.36218 C 62,421.36218 62,421.36218 62,421.36218 L 83,398.36218"
+ style="fill:white;fill-opacity:0.50196078;fill-rule:evenodd;stroke:#818181;stroke-width:10;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <path
+ style="fill:url(#linearGradient2285);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.6401844px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 337.17213,302.17468 L 297.82787,302.17468 L 316.18852,331.54968 L 337.17213,302.17468 z "
+ id="path1402"
+ inkscape:export-filename="/home/qt/down-arrow.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient2594);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:80.00000187;stroke-opacity:1"
+ id="path2550"
+ sodipodi:cx="404.5"
+ sodipodi:cy="362.36218"
+ sodipodi:rx="8.5"
+ sodipodi:ry="9"
+ d="M 413 362.36218 A 8.5 9 0 1 1 396,362.36218 A 8.5 9 0 1 1 413 362.36218 z"
+ transform="matrix(1.173299,0,0,1.083714,49.6358,-39.58126)" />
+ <image
+ id="image3150"
+ height="17"
+ width="17"
+ sodipodi:absref="/tmp/sizegrip.png"
+ xlink:href="/tmp/sizegrip.png"
+ x="514.5"
+ y="283.36218" />
+ <path
+ style="fill:url(#linearGradient3171);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.6401844px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 298.32787,368.54968 L 337.67213,368.54968 L 319.31148,339.17468 L 298.32787,368.54968 z "
+ id="path3169"
+ inkscape:export-filename="/home/qt/up_arrow.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <rect
+ style="fill:url(#linearGradient2346);fill-opacity:1;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2339"
+ width="106.77315"
+ height="3.0052142"
+ x="352.58511"
+ y="491.0387"
+ rx="0.78104818"
+ ry="1.5026071"
+ inkscape:export-filename="c:\pushbutton.png"
+ inkscape:export-xdpi="34.630928"
+ inkscape:export-ydpi="34.630928" />
+ <path
+ style="fill:url(#linearGradient4149);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 22.3587,471.50369 L 20.81522,526.12633 L 97.98913,526.22067 L 97.98913,490.91878 C 97.98913,474.71285 91.53261,470.59803 69.83696,471.59803 L 22.3587,471.50369 z "
+ id="path3226"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spinbutton.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5955);fill-opacity:1;fill-rule:nonzero;stroke:#c7c7c7;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 300.95652,471.02687 L 299.41304,526.64951 L 376.58695,526.74385 L 376.58695,490.44196 C 376.58695,474.23603 370.13043,470.12121 348.43478,471.12121 L 300.95652,471.02687 z "
+ id="path5953"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spinbutton_off.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5959);fill-opacity:1.0;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 113.95652,472.02687 L 112.41304,526.64951 L 189.58695,526.74385 L 189.58695,491.44196 C 189.58695,475.23603 183.13043,471.12121 161.43478,472.12121 L 113.95652,472.02687 z "
+ id="path5957"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spinbutton_hover.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5963);fill-opacity:1.0;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 207.95652,472.02687 L 206.41304,526.64951 L 283.58695,526.74385 L 283.58695,491.44196 C 283.58695,475.23603 277.13043,471.12121 255.43478,472.12121 L 207.95652,472.02687 z "
+ id="path5961"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spinbutton_pressed.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5973);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 24.25543,606.67432 L 22.71195,552.05168 L 99.88586,551.95734 L 99.88586,587.25923 C 99.88586,603.46516 93.42934,607.57998 71.73369,606.57998 L 24.25543,606.67432 z "
+ id="path5965"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spindown.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5975);fill-opacity:1;fill-rule:nonzero;stroke:#c7c7c7;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 301.65761,603.1975 L 300.11413,547.57486 L 377.28804,547.48052 L 377.28804,583.78241 C 377.28804,599.98834 370.83152,604.10316 349.13587,603.10316 L 301.65761,603.1975 z "
+ id="path5967"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spindown_off.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5977);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 117.65761,605.1975 L 116.11413,550.57486 L 193.28804,550.48052 L 193.28804,585.78241 C 193.28804,601.98834 186.83152,606.10316 165.13587,605.10316 L 117.65761,605.1975 z "
+ id="path5969"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spindown_hover.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient5979);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 210.65761,603.1975 L 209.11413,548.57486 L 286.28804,548.48052 L 286.28804,583.78241 C 286.28804,599.98834 279.83152,604.10316 258.13587,603.10316 L 210.65761,603.1975 z "
+ id="path5971"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spindown_pressed.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:#c8c8c8;fill-opacity:0.96022725;fill-rule:evenodd;stroke:#000000;stroke-width:0.6401844px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 396.42213,301.17468 L 357.07787,301.17468 L 375.43852,330.54968 L 396.42213,301.17468 z "
+ id="path5981"
+ inkscape:export-filename="/home/qt/down_arrow_disabled.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:#c8c8c8;fill-opacity:0.96078432;fill-rule:evenodd;stroke:#000000;stroke-width:0.6401844px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 357.57787,366.54968 L 396.92213,366.54968 L 378.56148,337.17468 L 357.57787,366.54968 z "
+ id="path5983"
+ inkscape:export-filename="/home/qt/up_arrow_enabled.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient1500);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 31.30707,642.01528 L 30.76359,681.63792 L 107.9375,681.73226 L 107.9375,646.43037 C 107.9375,630.22444 107.98098,627.85962 79.78533,627.10962 C 31.37591,627.57817 31.21649,625.79673 31.30707,642.01528 z "
+ id="path1484"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrollup.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient1503);fill-opacity:1;fill-rule:nonzero;stroke:#c7c7c7;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 303.95653,642.45652 L 303.41305,682.07916 L 380.58695,682.1735 L 380.58695,646.87161 C 380.58695,630.66568 380.63043,628.30086 352.43479,627.55086 C 304.02537,628.01941 303.86595,626.23797 303.95653,642.45652 z "
+ id="path1500"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrollup_disabled.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient1507);fill-opacity:1.0;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 211.45653,641.45652 L 210.91305,681.07916 L 288.08695,681.1735 L 288.08695,645.87161 C 288.08695,629.66568 288.13043,627.30086 259.93479,626.55086 C 211.52537,627.01941 211.36595,625.23797 211.45653,641.45652 z "
+ id="path1505"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrollup_pressed.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient1511);fill-opacity:1.0;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 121.45653,641.95652 L 120.91305,681.57916 L 198.08695,681.6735 L 198.08695,646.37161 C 198.08695,630.16568 198.13043,627.80086 169.93479,627.05086 C 121.52537,627.51941 121.36595,625.73797 121.45653,641.95652 z "
+ id="path1509"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrollup_hover.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient2394);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 31.6318,732.70908 L 31.08832,693.08644 L 108.26223,692.9921 L 108.26223,728.29399 C 108.26223,744.49992 108.30571,746.86474 80.11006,747.61474 C 31.70064,747.14619 31.54122,748.92763 31.6318,732.70908 z "
+ id="path2386"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrolldown.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient2396);fill-opacity:1;fill-rule:nonzero;stroke:#c7c7c7;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 304.28126,732.26784 L 303.73778,692.6452 L 380.91168,692.55086 L 380.91168,727.85275 C 380.91168,744.05868 380.95516,746.4235 352.75952,747.1735 C 304.3501,746.70495 304.19068,748.48639 304.28126,732.26784 z "
+ id="path2388"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/spinbutton.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient2398);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 211.78126,733.26784 L 211.23778,693.6452 L 288.41168,693.55086 L 288.41168,728.85275 C 288.41168,745.05868 288.45516,747.4235 260.25952,748.1735 C 211.8501,747.70495 211.69068,749.48639 211.78126,733.26784 z "
+ id="path2390"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrolldown_disabled.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ <path
+ style="fill:url(#linearGradient2400);fill-opacity:1;fill-rule:nonzero;stroke:#8b8b8b;stroke-width:3.89894915;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 121.78126,732.76784 L 121.23778,693.1452 L 198.41168,693.05086 L 198.41168,728.35275 C 198.41168,744.55868 198.45516,746.9235 170.25952,747.6735 C 121.8501,747.20495 121.69068,748.98639 121.78126,732.76784 z "
+ id="path2392"
+ sodipodi:nodetypes="cccccc"
+ inkscape:export-filename="/home/qt/scrolldown_hover.png"
+ inkscape:export-xdpi="16.379999"
+ inkscape:export-ydpi="16.379999" />
+ </g>
+</svg>
diff --git a/doc/src/diagrams/stylesheet/stylesheet-boxmodel.svg b/doc/src/diagrams/stylesheet/stylesheet-boxmodel.svg
new file mode 100644
index 0000000..833f606
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/stylesheet-boxmodel.svg
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.44"
+ sodipodi:docbase="C:\Documents and Settings\Girish\Desktop"
+ sodipodi:docname="box.svg"
+ inkscape:export-filename="C:\Documents and Settings\Girish\Desktop\box.png"
+ inkscape:export-xdpi="51.43"
+ inkscape:export-ydpi="51.43">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="375"
+ inkscape:cy="520"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1600"
+ inkscape:window-height="1140"
+ inkscape:window-x="1196"
+ inkscape:window-y="-4"
+ showgrid="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <text
+ xml:space="preserve"
+ style="font-size:23.51597595px;font-style:normal;font-weight:normal;fill:white;fill-opacity:1;stroke:white;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="335.02917"
+ y="277.45633"
+ id="text9058"
+ transform="scale(0.889318,1.124457)"><tspan
+ sodipodi:role="line"
+ x="335.02917"
+ y="277.45633"
+ id="tspan9064">B O R D E R</tspan></text>
+ <rect
+ style="fill:white;fill-opacity:1;stroke:black;stroke-width:4.25704765;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:8.51409454, 4.25704727;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2760"
+ width="695.74298"
+ height="515.74292"
+ x="22.128525"
+ y="214.49071"
+ rx="6.996594"
+ ry="0" />
+ <rect
+ style="fill:#e8e6cd;fill-opacity:1;stroke:black;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3655"
+ width="580"
+ height="400"
+ x="81"
+ y="271.36218"
+ rx="6.6371522" />
+ <rect
+ style="fill:#e8e6fc;fill-opacity:1;stroke:black;stroke-width:1.81467748;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3657"
+ width="463.04248"
+ height="284.47104"
+ x="137.05019"
+ y="332.26953"
+ rx="6.1465664"
+ ry="0" />
+ <rect
+ style="fill:#d5d5d5;fill-opacity:1;stroke:black;stroke-width:2;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4547"
+ width="340"
+ height="160"
+ x="200"
+ y="392.36218"
+ rx="6.6371522" />
+ <text
+ xml:space="preserve"
+ style="font-size:24.11601067px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="326.578"
+ y="229.81458"
+ id="text9012"
+ transform="scale(0.912007,1.096483)"><tspan
+ sodipodi:role="line"
+ id="tspan9014"
+ x="326.578"
+ y="229.81458">M A R G I N</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:23.5159874px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="336.01672"
+ y="419.74713"
+ id="text9026"
+ transform="scale(0.889318,1.124457)"><tspan
+ sodipodi:role="line"
+ id="tspan9028"
+ x="336.01672"
+ y="419.74713">C O N T E N T</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:23.51598358px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="336.01666"
+ y="330.81543"
+ id="text9036"
+ transform="scale(0.889318,1.124457)"><tspan
+ sodipodi:role="line"
+ x="336.01666"
+ y="330.81543"
+ id="tspan9040">P A D D I N G</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:23.98760986px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="341.32919"
+ y="276.49072"
+ id="text12608"
+ transform="scale(0.884818,1.130176)"><tspan
+ sodipodi:role="line"
+ id="tspan12610"
+ x="341.32919"
+ y="276.49072">B O R D E R</tspan></text>
+ <rect
+ style="fill:white;fill-opacity:1;stroke:black;stroke-width:1.72772717;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect12612"
+ width="40.016171"
+ height="30.904003"
+ x="38.863865"
+ y="755.78369"
+ rx="6.9994221" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot13507"
+ transform="matrix(2.291562,0,0,2.696637,-268.2496,-1290.608)"><flowRegion
+ id="flowRegion13509"><rect
+ id="rect13511"
+ width="277.14285"
+ height="37.142857"
+ x="161.42857"
+ y="775.2193" /></flowRegion><flowPara
+ id="flowPara13513">Border Rectangle</flowPara></flowRoot> <rect
+ style="fill:#e8e6cd;fill-opacity:1;stroke:black;stroke-width:1.72772717;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14400"
+ width="40.016171"
+ height="30.904003"
+ x="40.864674"
+ y="797.98364"
+ rx="6.9994221" />
+ <rect
+ style="fill:#e8e6fc;fill-opacity:1;stroke:black;stroke-width:1.77121222;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14402"
+ width="39.972687"
+ height="32.514557"
+ x="401.03195"
+ y="753.24774"
+ rx="6.991816" />
+ <rect
+ style="fill:#d5d5d5;fill-opacity:1;stroke:black;stroke-width:1.72772717;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14404"
+ width="40.016171"
+ height="30.904003"
+ x="401.01019"
+ y="797.98358"
+ rx="6.9994221" />
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot17946"
+ transform="matrix(2.291562,0,0,2.696635,-270.0219,-1336.443)"><flowRegion
+ id="flowRegion17948"><rect
+ id="rect17950"
+ width="277.14285"
+ height="37.142857"
+ x="161.42857"
+ y="775.2193" /></flowRegion><flowPara
+ id="flowPara17952">Margin Rectangle</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot17954"
+ transform="matrix(2.291562,0,0,2.696637,87.39117,-1337.924)"><flowRegion
+ id="flowRegion17956"><rect
+ id="rect17958"
+ width="277.14285"
+ height="37.142857"
+ x="161.42857"
+ y="775.2193" /></flowRegion><flowPara
+ id="flowPara17960">Padding Rectangle</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot17962"
+ transform="matrix(2.291562,0,0,2.696635,87.39117,-1293.164)"><flowRegion
+ id="flowRegion17964"><rect
+ id="rect17966"
+ width="277.14285"
+ height="37.142857"
+ x="161.42857"
+ y="775.2193" /></flowRegion><flowPara
+ id="flowPara17968">Content Rectangle</flowPara></flowRoot> </g>
+</svg>
diff --git a/doc/src/diagrams/stylesheet/treeview.svg b/doc/src/diagrams/stylesheet/treeview.svg
new file mode 100644
index 0000000..1d2d4ce
--- /dev/null
+++ b/doc/src/diagrams/stylesheet/treeview.svg
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448819"
+ height="1052.3622047"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.45"
+ sodipodi:docbase="/home/qt/Desktop"
+ sodipodi:docname="drawing.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:modified="TRUE">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient4175">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4177" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4179" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient3159">
+ <stop
+ style="stop-color:#360d08;stop-opacity:1;"
+ offset="0"
+ id="stop3161" />
+ <stop
+ style="stop-color:#360d08;stop-opacity:0;"
+ offset="1"
+ id="stop3163" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3159"
+ id="linearGradient3165"
+ x1="-9.5219469"
+ y1="122.3622"
+ x2="567.62091"
+ y2="-23.352087"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3159"
+ id="linearGradient3169"
+ gradientUnits="userSpaceOnUse"
+ x1="-9.5219469"
+ y1="122.3622"
+ x2="567.62091"
+ y2="-23.352087" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3159"
+ id="linearGradient3173"
+ gradientUnits="userSpaceOnUse"
+ x1="-9.5219469"
+ y1="122.3622"
+ x2="567.62091"
+ y2="-23.352087" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="10"
+ objecttolerance="10"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="369.55257"
+ inkscape:cy="750.96613"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ inkscape:window-width="1018"
+ inkscape:window-height="710"
+ inkscape:window-x="0"
+ inkscape:window-y="0" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.95999995;fill:url(#linearGradient3165);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="path3157"
+ sodipodi:sides="3"
+ sodipodi:cx="170"
+ sodipodi:cy="248.07648"
+ sodipodi:r1="76.197914"
+ sodipodi:r2="38.098953"
+ sodipodi:arg1="0"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 246.19791,248.07648 L 189.04948,281.07114 L 131.90104,314.06581 L 131.90105,248.07648 L 131.90104,182.08715 L 189.04948,215.08182 L 246.19791,248.07648 z "
+ transform="matrix(0,0.8547291,-1.1082434,0,407.78631,67.649535)"
+ inkscape:export-filename="/tmp/downarrow.png"
+ inkscape:export-xdpi="7.3838849"
+ inkscape:export-ydpi="7.3838849" />
+ <path
+ sodipodi:type="star"
+ style="opacity:0.95999995;fill:url(#linearGradient3173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:1;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="path3171"
+ sodipodi:sides="3"
+ sodipodi:cx="170"
+ sodipodi:cy="248.07648"
+ sodipodi:r1="76.197914"
+ sodipodi:r2="38.098953"
+ sodipodi:arg1="0"
+ sodipodi:arg2="1.0471976"
+ inkscape:flatsided="false"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 246.19791,248.07648 L 189.04948,281.07114 L 131.90104,314.06581 L 131.90105,248.07648 L 131.90104,182.08715 L 189.04948,215.08182 L 246.19791,248.07648 z "
+ transform="matrix(0.8547291,0,0,1.1082434,-51.586095,-168.28122)"
+ inkscape:export-filename="/tmp/rightarrow.png"
+ inkscape:export-xdpi="7.3838849"
+ inkscape:export-ydpi="7.3838849" />
+ <g
+ id="g7143"
+ transform="matrix(1.9467612,0,0,1.49,-171.55861,-412.48606)"
+ inkscape:export-filename="/tmp/branch.png"
+ inkscape:export-xdpi="7.3838849"
+ inkscape:export-ydpi="7.3838849">
+ <rect
+ style="opacity:0.95999995;fill:#63564d;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect5182"
+ width="72"
+ height="7.1428542"
+ x="287.14282"
+ y="361.64792"
+ rx="0"
+ ry="2.3969309" />
+ <rect
+ inkscape:export-ydpi="24.70105"
+ inkscape:export-xdpi="24.70105"
+ inkscape:export-filename="/tmp/vline.png"
+ style="opacity:0.95999995;fill:#63564d;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect5184"
+ width="142.85713"
+ height="7.2871542"
+ x="298.07648"
+ y="-286.58728"
+ rx="0"
+ ry="1.947962"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="opacity:0.95999995;fill:none;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect5203"
+ width="72"
+ height="7.1428542"
+ x="206.85713"
+ y="361.64792"
+ rx="0"
+ ry="2.3969309" />
+ </g>
+ <rect
+ ry="3.5714271"
+ rx="0"
+ y="425.65506"
+ x="-33.231937"
+ height="10.642853"
+ width="140.16681"
+ id="rect7154"
+ style="opacity:0.95999995;fill:none;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1" />
+ <g
+ id="g10132"
+ inkscape:export-filename="/tmp/branch2.png"
+ inkscape:export-xdpi="24.70105"
+ inkscape:export-ydpi="24.70105">
+ <rect
+ style="opacity:0.95999995;fill:#63564d;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect9152"
+ width="141.59538"
+ height="10.642853"
+ x="469.49371"
+ y="436.36935"
+ rx="0"
+ ry="3.5714271" />
+ <rect
+ inkscape:export-ydpi="24.70105"
+ inkscape:export-xdpi="24.70105"
+ inkscape:export-filename="/tmp/vline.png"
+ style="opacity:0.95999995;fill:#63564d;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect9154"
+ width="105.71427"
+ height="14.186349"
+ x="341.64789"
+ y="-469.84076"
+ rx="0"
+ ry="3.792217"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="opacity:0.95999995;fill:none;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect9156"
+ width="140.16681"
+ height="10.642853"
+ x="314.62521"
+ y="436.36935"
+ rx="0"
+ ry="3.5714271" />
+ <rect
+ inkscape:export-ydpi="24.70105"
+ inkscape:export-xdpi="24.70105"
+ inkscape:export-filename="/tmp/vline.png"
+ style="opacity:0.95999995;fill:none;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect9161"
+ width="107.14285"
+ height="13.140697"
+ x="447.36218"
+ y="-469.42749"
+ rx="0"
+ ry="3.7922168"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+ <g
+ id="g11122"
+ inkscape:export-filename="/tmp/vline.png"
+ inkscape:export-xdpi="24.70105"
+ inkscape:export-ydpi="24.70105">
+ <rect
+ style="opacity:0.95999995;fill:none;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect10144"
+ width="140.16681"
+ height="10.642853"
+ x="179.4937"
+ y="409.2265"
+ rx="0"
+ ry="3.5714271" />
+ <rect
+ inkscape:export-ydpi="24.70105"
+ inkscape:export-xdpi="24.70105"
+ inkscape:export-filename="/tmp/vline.png"
+ style="opacity:0.95999995;fill:#63564d;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect10146"
+ width="212.85713"
+ height="14.186349"
+ x="314.50507"
+ y="-178.41219"
+ rx="0"
+ ry="3.792217"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="opacity:0.95999995;fill:none;fill-opacity:0.50574712;fill-rule:nonzero;stroke:none;stroke-width:2.02099991;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:8;stroke-opacity:1"
+ id="rect10148"
+ width="140.16681"
+ height="10.642853"
+ x="23.196629"
+ y="409.2265"
+ rx="0"
+ ry="3.5714271" />
+ </g>
+ </g>
+</svg>
diff --git a/doc/src/diagrams/tcpstream.sk b/doc/src/diagrams/tcpstream.sk
new file mode 100644
index 0000000..6c1be60
--- /dev/null
+++ b/doc/src/diagrams/tcpstream.sk
@@ -0,0 +1,48 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(1083919052,'../images/complexwizard-evaluatepage.png')
+im((96.171,-22.9284),1083919052)
+G()
+bm(1083939916,'../images/complexwizard-finishpage.png')
+im((598.76,309.977),1083939916)
+bm(1083947948,'../images/complexwizard-titlepage.png')
+im((-426.888,309.977),1083947948)
+G_()
+G()
+bm(1083738188,'../images/complexwizard-detailspage.png')
+im((438.772,659.042),1083738188)
+bm(1083948908,'../images/complexwizard-registerpage.png')
+im((-246.43,659.042),1083948908)
+G_()
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-177.479,552.383,0)
+bs(-44.9634,640.727,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(661.786,645.036,0)
+bs(794.302,556.693,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(270.704,772.165,0)
+bs(403.219,772.165,0)
+fp((1,1,0))
+lp((1,0,0))
+lw(4)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(-166.705,280.888,0)
+bs(46.6125,138.676,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,0.5,0.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/threadsandobjects.sk b/doc/src/diagrams/threadsandobjects.sk
new file mode 100644
index 0000000..1523dad
--- /dev/null
+++ b/doc/src/diagrams/threadsandobjects.sk
@@ -0,0 +1,149 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+G()
+fp((0.808,0.89,1))
+lw(1)
+e(108.938,0,0,-67.3351,546.062,772.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QThread::exec()',(502.382,747.769))
+lw(2)
+lc(2)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(37.5,0,0,-12.5,546.062,775.165,4.77896,4.51499,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Thread B',(509.045,812.871))
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,467.124,805.39,0.0957655,0.213075)
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,597.124,770.39,0.0957655,0.213075)
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,502.124,735.39,0.0957655,0.213075)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 8',(475.284,792.212))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 10',(601.948,757.212))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 9',(510.284,722.212))
+G_()
+G()
+fp((0.808,0.89,1))
+lw(1)
+e(108.938,0,0,-67.3351,61.062,772.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QThread::exec()',(17.382,747.769))
+lw(2)
+lc(2)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(37.5,0,0,-12.5,61.062,775.165,4.77896,4.51499,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Thread A',(24.045,812.871))
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,-30,800.165,0.0957655,0.213075)
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,115,790.39,0.0957655,0.213075)
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,50,735.165,0.0957655,0.213075)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 5',(-21.84,786.986))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 7',(123.16,777.212))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 6',(58.16,721.986))
+G_()
+G()
+fp((0.737,1,0.849))
+lw(1)
+r(215,0,0,-125,197.5,835,0.0465116,0.08)
+lw(2)
+lc(2)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+e(37.5,0,0,-12.5,304.55,777.5,4.77896,4.51499,0)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Main Thread',(254.483,812.706))
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,207.5,795.225,0.0957655,0.213075)
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,357.5,805,0.0957655,0.213075)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 1',(215.66,782.047))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 4',(365.66,791.821))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('QApplication::exec()',(250.982,750.104))
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,352.5,740.225,0.0957655,0.213075)
+fp((1,0.616,0.639))
+lw(1)
+r(45,0,0,-20.225,222.5,740.225,0.0957655,0.213075)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 3',(360.66,727.047))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Obj 2',(230.66,727.047))
+G_()
+le()
+lw(1)
+r(725,0,0,-155,-60,850)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/treemodel-structure.sk b/doc/src/diagrams/treemodel-structure.sk
new file mode 100644
index 0000000..a76246c
--- /dev/null
+++ b/doc/src/diagrams/treemodel-structure.sk
@@ -0,0 +1,114 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+le()
+lw(1)
+r(165,0,0,-300,30,785)
+lw(1)
+ld((3, 3))
+b()
+bs(55,520,0)
+bs(55,495,0)
+lw(1)
+ld((5, 5))
+r(30,0,0,-30,40,775)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica-Bold')
+txt('Root item (empty)',(80,756.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(110,716.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 0',(145,676.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('A',(83.33,713.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('B',(118.33,633.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(20)
+txt('C',(82.78,553.14))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(145,636.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 1',(110,556.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(145,596.384))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('row = 2',(110,516.384))
+lw(1)
+b()
+bs(55,745,0)
+bs(55,520,0)
+lw(1)
+r(30,0,0,-30,110,695)
+lw(1)
+b()
+bs(90,680,0)
+bs(110,680,0)
+lw(1)
+r(30,0,0,-30,110,655)
+lw(1)
+r(30,0,0,-30,110,615)
+lw(1)
+r(30,0,0,-30,75,535)
+lw(1)
+r(30,0,0,-30,75,575)
+lw(1)
+b()
+bs(90,640,0)
+bs(110,640,0)
+lw(1)
+b()
+bs(90,600,0)
+bs(110,600,0)
+lw(1)
+b()
+bs(55,520,0)
+bs(75,520,0)
+lw(1)
+b()
+bs(55,560,0)
+bs(75,560,0)
+lw(1)
+b()
+bs(90,705,0)
+bs(90,600,0)
+lw(1)
+r(30,0,0,-30,75,735)
+lw(1)
+b()
+bs(55,720,0)
+bs(75,720,0)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/tutorial8-layout.sk b/doc/src/diagrams/tutorial8-layout.sk
new file mode 100644
index 0000000..f4ea2de
--- /dev/null
+++ b/doc/src/diagrams/tutorial8-layout.sk
@@ -0,0 +1,55 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+fp((0.65,0.748,0.919))
+lw(1)
+r(74,0,0,-36,84,776)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(1, 0)',(106.996,754.934))
+fp((0.65,0.748,0.919))
+lw(1)
+r(104,0,0,-80,166,776)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(1, 1)',(203.996,754.934))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(2, 1)',(203.996,710.934))
+fp((1,1,1))
+lp((0.5,0.5,0.5))
+lw(1)
+r(74,0,0,-36,84,732)
+fp((0.5,0.5,0.5))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(2, 0)',(106.996,710.934))
+fp((1,1,1))
+lp((0.5,0.5,0.5))
+lw(1)
+r(104,0,0,-28,166,812)
+fp((0.5,0.5,0.5))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(0, 1)',(203.996,794.934))
+fp((0.65,0.748,0.919))
+lw(1)
+r(73.8045,0,0,-28,84.1955,812)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('(0, 0)',(107.094,794.934))
+lw(1)
+r(202,0,0,-132,76,820)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2,2),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/udppackets.sk b/doc/src/diagrams/udppackets.sk
new file mode 100644
index 0000000..71a94cc
--- /dev/null
+++ b/doc/src/diagrams/udppackets.sk
@@ -0,0 +1,128 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+lp((0.217,0.6,0))
+lw(2)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(342.5,680,0)
+bs(182.5,680,0)
+lp((0.217,0.6,0))
+lw(2)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(162.5,712.5,0)
+bs(327.5,712.5,0)
+fp((0.245,0.484,0.808))
+lw(1)
+r(95,0,0,-56.1059,335,725)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('UDP Receiver',(344.496,693.881))
+fp((0.808,0.4,0.4))
+lw(1)
+r(95,0,0,-55,80,725)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('UDP Sender',(93.822,694.434))
+le()
+lw(1)
+r(360,0,0,-65,75,730)
+fp((0.217,0.6,0))
+lp((0.217,0.6,0))
+lw(1)
+r(27.5,0,0,-25,202.5,725)
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('01011',(204.443,717.828))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('10110',(204.443,710.328))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('11010',(204.443,702.828))
+fp((0.217,0.6,0))
+lp((0.217,0.6,0))
+lw(1)
+r(27.5,0,0,-25,222.5,692.5)
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('10100',(224.443,685.328))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('01101',(224.443,677.828))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('10110',(224.443,670.328))
+fp((0.217,0.6,0))
+lp((0.217,0.6,0))
+lw(1)
+r(27.5,0,0,-25,280,692.5)
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('01100',(281.943,685.328))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('10101',(281.943,677.828))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('01100',(281.943,670.328))
+fp((0.217,0.6,0))
+lp((0.217,0.6,0))
+lw(1)
+r(27.5,0,0,-25,260,725)
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('11010',(261.943,717.828))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('10101',(261.943,710.328))
+fp((1,0.97,0))
+le()
+lw(1)
+Fn('Courier-Bold')
+Fs(8)
+txt('01110',(261.943,702.828))
+le()
+lw(1)
+r(360,0,0,-67.5,75,730)
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/wVista-Cert-border.png b/doc/src/diagrams/wVista-Cert-border.png
new file mode 100644
index 0000000..5b0f1ba
--- /dev/null
+++ b/doc/src/diagrams/wVista-Cert-border.png
Binary files differ
diff --git a/doc/src/diagrams/widgetmapper/sql-widget-mapper.png b/doc/src/diagrams/widgetmapper/sql-widget-mapper.png
new file mode 100644
index 0000000..0ef3e40
--- /dev/null
+++ b/doc/src/diagrams/widgetmapper/sql-widget-mapper.png
Binary files differ
diff --git a/doc/src/diagrams/widgetmapper/widgetmapper-sql-mapping.sk b/doc/src/diagrams/widgetmapper/widgetmapper-sql-mapping.sk
new file mode 100644
index 0000000..dedac0d
--- /dev/null
+++ b/doc/src/diagrams/widgetmapper/widgetmapper-sql-mapping.sk
@@ -0,0 +1,246 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+bm(140229452,'sql-widget-mapper.png')
+im((70,477.5),140229452)
+lp((1,1,1))
+lw(3)
+lj(1)
+b()
+bs(145,747.5,0)
+bc(145,722.5,142.5,697.5,152.5,657.5,1)
+lw(1)
+r(37.5,0,0,-30,305,742.5)
+fp((0.753,1,0.753))
+lw(1)
+r(37.5,0,0,-30,305,772.5)
+lp((1,1,1))
+lw(2.75)
+b()
+bs(402.5,722.5,1)
+bc(365,725,350,732.5,335,747.5,0)
+fp((0.753,1,0.753))
+lw(1)
+r(82.5,0,0,-30,410,742.5)
+lp((1,1,1))
+lw(3)
+b()
+bs(404.376,716.319,1)
+bc(397.281,600.953,335.819,523.389,202.5,505,0)
+fp((0.753,0.753,1))
+lw(1)
+r(155,0,0,-30,150,772.5)
+lw(1)
+r(155,0,0,-30,150,742.5)
+fp((1,0.753,0.753))
+lw(1)
+r(69.9999,0,0,-30,80,772.5)
+lw(1)
+r(69.9999,0,0,-30,80,742.5)
+lw(1)
+r(69.9999,0,0,-30,80,802.5)
+lw(1)
+r(37.5,0,0,-30,305,802.5)
+lw(1)
+r(155,0,0,-30,150,802.5)
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Carol',(93.499,751.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Donald',(85,721.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Bob',(98.989,781.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('PO Box 32',(154.48,789.692))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Mail Handling Service',(154.48,775.792))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('47338 Park Avenue',(156.142,729.692))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Big City',(156.142,716.384))
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('The Lighthouse',(156.142,759.692))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+txt('Remote Island',(156.142,745.792))
+G_()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('101',(382.5,790.398))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('102',(382.5,760.398))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(14)
+txt('103',(382.5,730.398))
+fp((0,0,0))
+le()
+lw(1)
+b()
+bs(345,757.5,0)
+bs(355,750,0)
+bs(355,755,0)
+bs(365,755,0)
+bs(365,760,0)
+bs(355,760,0)
+bs(355,765,0)
+bs(345,757.5,0)
+bC()
+lw(1)
+ld((2, 2))
+b()
+bs(80,713.092,0)
+bs(80,700.592,0)
+lw(1)
+ld((2, 2))
+b()
+bs(80,815,0)
+bs(80,802.5,0)
+lw(1)
+ld((2, 2))
+b()
+bs(150,712.5,0)
+bs(150,700,0)
+lw(1)
+ld((2, 2))
+b()
+bs(150,815,0)
+bs(150,802.5,0)
+lw(1)
+ld((2, 2))
+b()
+bs(305,713.092,0)
+bs(305,700.592,0)
+lw(1)
+ld((2, 2))
+b()
+bs(305,815,0)
+bs(305,802.5,0)
+lw(1)
+ld((2, 2))
+b()
+bs(342.5,712.5,0)
+bs(342.5,700,0)
+lw(1)
+ld((2, 2))
+b()
+bs(342.5,816.908,0)
+bs(342.5,804.408,0)
+lp((1,1,1))
+lw(3)
+lj(1)
+b()
+bs(287.002,750,1)
+bc(299.502,720,302.002,647.5,259.502,602.5,0)
+lp((0,0,0.627))
+lw(2)
+lj(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(287.002,750,1)
+bc(299.502,720,302.002,647.5,259.502,602.5,0)
+lp((0.624,0,0))
+lw(2)
+lj(1)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(145,747.5,0)
+bc(145,722.5,142.5,697.5,152.5,657.5,1)
+lp((0,0.624,0))
+lw(2)
+la2(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(404.376,716.319,1)
+bc(397.281,600.953,335.819,523.389,202.5,505,0)
+lp((0,0.624,0))
+lw(1.75)
+la1(([(-4.0, 3.0), (2.0, 0.0), (-4.0, -3.0), (-4.0, 3.0)], 1))
+b()
+bs(402.5,722.5,1)
+bc(365,725,350,732.5,335,747.5,0)
+fp((1,1,1))
+lw(1)
+r(82.5,0,0,-30,410,772.5)
+lw(1)
+r(82.5,0,0,-30,410,802.5)
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('103',(308.738,751.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('101',(308.738,721.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('102',(308.738,781.226))
+G_()
+G()
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Work',(430.253,751.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Other',(428.741,721.226))
+fp((0,0,0))
+le()
+lw(1)
+Fn('Helvetica')
+Fs(18)
+txt('Home',(427.247,781.226))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,2.5,2.5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/windowsxp-menu.png b/doc/src/diagrams/windowsxp-menu.png
new file mode 100644
index 0000000..a1fda3f
--- /dev/null
+++ b/doc/src/diagrams/windowsxp-menu.png
Binary files differ
diff --git a/doc/src/diagrams/worldtimeclock-connection.zip b/doc/src/diagrams/worldtimeclock-connection.zip
new file mode 100644
index 0000000..8303215
--- /dev/null
+++ b/doc/src/diagrams/worldtimeclock-connection.zip
Binary files differ
diff --git a/doc/src/diagrams/worldtimeclockplugin-example.zip b/doc/src/diagrams/worldtimeclockplugin-example.zip
new file mode 100644
index 0000000..ef2f6e4
--- /dev/null
+++ b/doc/src/diagrams/worldtimeclockplugin-example.zip
Binary files differ
diff --git a/doc/src/diagrams/x11_dependencies.sk b/doc/src/diagrams/x11_dependencies.sk
new file mode 100644
index 0000000..5f6b304
--- /dev/null
+++ b/doc/src/diagrams/x11_dependencies.sk
@@ -0,0 +1,1416 @@
+##Sketch 1 2
+document()
+layout('A4',0)
+layer('Layer 1',1,1,0,0,(0,0,0))
+G()
+fp((0,0,0))
+le()
+b()
+bs(268.8,339.25,0)
+bs(268.8,337.15,0)
+bs(352.8,337.15,0)
+bs(352.8,362.2,0)
+bs(350.7,362.2,0)
+bs(350.7,339.25,0)
+bs(268.8,339.25,0)
+bC()
+fp((0.59,0.99,0))
+le()
+b()
+bs(266.7,339.25,0)
+bs(350.7,339.25,0)
+bs(350.7,364.3,0)
+bs(266.7,364.3,0)
+bs(266.7,339.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,339.25,0)
+bs(350.7,339.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,339.25,0)
+bs(350.7,364.3,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,364.3,0)
+bs(266.7,364.3,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,364.3,0)
+bs(266.7,339.25,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('QtGui',(290.95,347))
+fp((0,0,0))
+le()
+b()
+bs(111.3,280.05,0)
+bs(111.3,277.95,0)
+bs(195.3,277.95,0)
+bs(195.3,302.15,0)
+bs(193.2,302.15,0)
+bs(193.2,280.05,0)
+bs(111.3,280.05,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(109.2,280.05,0)
+bs(193.2,280.05,0)
+bs(193.2,304.25,0)
+bs(109.2,304.25,0)
+bs(109.2,280.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(109.2,280.05,0)
+bs(193.2,280.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(193.2,280.05,0)
+bs(193.2,304.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(193.2,304.25,0)
+bs(109.2,304.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(109.2,304.25,0)
+bs(109.2,280.05,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xcursor',(127.15,287.25))
+fp((0,0,0))
+le()
+b()
+bs(268.8,280.05,0)
+bs(268.8,277.95,0)
+bs(352.8,277.95,0)
+bs(352.8,302.15,0)
+bs(350.7,302.15,0)
+bs(350.7,280.05,0)
+bs(268.8,280.05,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(266.7,280.05,0)
+bs(350.7,280.05,0)
+bs(350.7,304.25,0)
+bs(266.7,304.25,0)
+bs(266.7,280.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,280.05,0)
+bs(350.7,280.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,280.05,0)
+bs(350.7,304.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,304.25,0)
+bs(266.7,304.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,304.25,0)
+bs(266.7,280.05,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xr',(287.8,287.25))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('andr',(301.7,287.25))
+fp((0,0,0))
+le()
+b()
+bs(426.3,280.05,0)
+bs(426.3,277.95,0)
+bs(510.3,277.95,0)
+bs(510.3,302.15,0)
+bs(508.2,302.15,0)
+bs(508.2,280.05,0)
+bs(426.3,280.05,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(424.2,280.05,0)
+bs(508.2,280.05,0)
+bs(508.2,304.25,0)
+bs(424.2,304.25,0)
+bs(424.2,280.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(424.2,280.05,0)
+bs(508.2,280.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(508.2,280.05,0)
+bs(508.2,304.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(508.2,304.25,0)
+bs(424.2,304.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(424.2,304.25,0)
+bs(424.2,280.05,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xiner',(436.55,287.25))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('ama',(469.125,287.25))
+fp((0,0,0))
+le()
+b()
+bs(561.2,280.15,0)
+bs(561.2,278.05,0)
+bs(645.2,278.05,0)
+bs(645.2,302.05,0)
+bs(643.1,302.05,0)
+bs(643.1,280.15,0)
+bs(561.2,280.15,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(559.1,280.15,0)
+bs(643.1,280.15,0)
+bs(643.1,304.15,0)
+bs(559.1,304.15,0)
+bs(559.1,280.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(559.1,280.15,0)
+bs(643.1,280.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(643.1,280.15,0)
+bs(643.1,304.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(643.1,304.15,0)
+bs(559.1,304.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(559.1,304.15,0)
+bs(559.1,280.15,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xi',(595.35,287.15))
+fp((0,0,0))
+le()
+b()
+bs(268.8,220.85,0)
+bs(268.8,218.75,0)
+bs(352.8,218.75,0)
+bs(352.8,242.95,0)
+bs(350.7,242.95,0)
+bs(350.7,220.85,0)
+bs(268.8,220.85,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(266.7,220.85,0)
+bs(350.7,220.85,0)
+bs(350.7,245.05,0)
+bs(266.7,245.05,0)
+bs(266.7,220.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,220.85,0)
+bs(350.7,220.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,220.85,0)
+bs(350.7,245.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,245.05,0)
+bs(266.7,245.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,245.05,0)
+bs(266.7,220.85,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('XRender',(281.15,228.05))
+fp((0,0,0))
+le()
+b()
+bs(662,220.95,0)
+bs(662,218.85,0)
+bs(746,218.85,0)
+bs(746,242.95,0)
+bs(743.9,242.95,0)
+bs(743.9,220.95,0)
+bs(662,220.95,0)
+bC()
+fp((0.961,0.961,0.863))
+le()
+b()
+bs(659.9,220.95,0)
+bs(743.9,220.95,0)
+bs(743.9,245.05,0)
+bs(659.9,245.05,0)
+bs(659.9,220.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,220.95,0)
+bs(743.9,220.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(743.9,220.95,0)
+bs(743.9,245.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(743.9,245.05,0)
+bs(659.9,245.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,245.05,0)
+bs(659.9,220.95,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xt*',(692.9,228.05))
+fp((0,0,0))
+le()
+b()
+bs(10.4998,160.8,0)
+bs(10.4998,158.7,0)
+bs(94.4998,158.7,0)
+bs(94.4998,183.75,0)
+bs(92.3999,183.75,0)
+bs(92.3999,160.8,0)
+bs(10.4998,160.8,0)
+bC()
+fp((0.61,0.61,1))
+le()
+b()
+bs(8.3999,160.8,0)
+bs(92.3999,160.8,0)
+bs(92.3999,185.85,0)
+bs(8.3999,185.85,0)
+bs(8.3999,160.8,0)
+lw(1.12)
+lc(2)
+b()
+bs(8.3999,160.8,0)
+bs(92.3999,160.8,0)
+lw(1.12)
+lc(2)
+b()
+bs(92.3999,160.8,0)
+bs(92.3999,185.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(92.3999,185.85,0)
+bs(8.3999,185.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(8.3999,185.85,0)
+bs(8.3999,160.8,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('QtCore',(28.1997,168.55))
+fp((0,0,0))
+le()
+b()
+bs(268.8,161.15,0)
+bs(268.8,159.05,0)
+bs(352.8,159.05,0)
+bs(352.8,183.4,0)
+bs(350.7,183.4,0)
+bs(350.7,161.15,0)
+bs(268.8,161.15,0)
+bC()
+fp((0.792,0.882,1))
+le()
+b()
+bs(266.7,161.15,0)
+bs(350.7,161.15,0)
+bs(350.7,185.5,0)
+bs(266.7,185.5,0)
+bs(266.7,161.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,161.15,0)
+bs(350.7,161.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,161.15,0)
+bs(350.7,185.5,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,185.5,0)
+bs(266.7,185.5,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,185.5,0)
+bs(266.7,161.15,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xfix',(290.1,168.35))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('es',(313.038,168.35))
+fp((0,0,0))
+le()
+b()
+bs(426.3,161.25,0)
+bs(426.3,159.15,0)
+bs(510.3,159.15,0)
+bs(510.3,183.35,0)
+bs(508.2,183.35,0)
+bs(508.2,161.25,0)
+bs(426.3,161.25,0)
+bC()
+fp((0.961,0.961,0.863))
+le()
+b()
+bs(424.2,161.25,0)
+bs(508.2,161.25,0)
+bs(508.2,185.45,0)
+bs(424.2,185.45,0)
+bs(424.2,161.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(424.2,161.25,0)
+bs(508.2,161.25,0)
+lw(1.12)
+lc(2)
+b()
+bs(508.2,161.25,0)
+bs(508.2,185.45,0)
+lw(1.12)
+lc(2)
+b()
+bs(508.2,185.45,0)
+bs(424.2,185.45,0)
+lw(1.12)
+lc(2)
+b()
+bs(424.2,185.45,0)
+bs(424.2,161.25,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Xe',(452.55,168.45))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('xt',(469.272,168.45))
+fp((0,0,0))
+le()
+b()
+bs(662,161.05,0)
+bs(662,158.95,0)
+bs(746,158.95,0)
+bs(746,183.5,0)
+bs(743.9,183.5,0)
+bs(743.9,161.05,0)
+bs(662,161.05,0)
+bC()
+fp((0.761,0.98,0.98))
+le()
+b()
+bs(659.9,161.05,0)
+bs(743.9,161.05,0)
+bs(743.9,185.6,0)
+bs(659.9,185.6,0)
+bs(659.9,161.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,161.05,0)
+bs(743.9,161.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(743.9,161.05,0)
+bs(743.9,185.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(743.9,185.6,0)
+bs(659.9,185.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,185.6,0)
+bs(659.9,161.05,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('SM',(691.9,168.3))
+fp((0,0,0))
+le()
+b()
+bs(10.4998,98.9001,0)
+bs(10.4998,96.8003,0)
+bs(94.4998,96.8003,0)
+bs(94.4998,123.7,0)
+bs(92.3999,123.7,0)
+bs(92.3999,98.9001,0)
+bs(10.4998,98.9001,0)
+bC()
+fp((0.741,0.718,0.42))
+le()
+b()
+bs(8.3999,98.9001,0)
+bs(92.3999,98.9001,0)
+bs(92.3999,125.8,0)
+bs(8.3999,125.8,0)
+bs(8.3999,98.9001,0)
+lw(1.12)
+lc(2)
+b()
+bs(8.3999,98.9001,0)
+bs(92.3999,98.9001,0)
+lw(1.12)
+lc(2)
+b()
+bs(92.3999,98.9001,0)
+bs(92.3999,125.8,0)
+lw(1.12)
+lc(2)
+b()
+bs(92.3999,125.8,0)
+bs(8.3999,125.8,0)
+lw(1.12)
+lc(2)
+b()
+bs(8.3999,125.8,0)
+bs(8.3999,98.9001,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('pthread',(27.1499,108.8))
+fp((0,0,0))
+le()
+b()
+bs(111.3,100.1,0)
+bs(111.3,98.0002,0)
+bs(195.3,98.0002,0)
+bs(195.3,122.55,0)
+bs(193.2,122.55,0)
+bs(193.2,100.1,0)
+bs(111.3,100.1,0)
+bC()
+fp((0.7,0.7,0.7))
+le()
+b()
+bs(109.2,100.1,0)
+bs(193.2,100.1,0)
+bs(193.2,124.65,0)
+bs(109.2,124.65,0)
+bs(109.2,100.1,0)
+lw(1.12)
+lc(2)
+b()
+bs(109.2,100.1,0)
+bs(193.2,100.1,0)
+lw(1.12)
+lc(2)
+b()
+bs(193.2,100.1,0)
+bs(193.2,124.65,0)
+lw(1.12)
+lc(2)
+b()
+bs(193.2,124.65,0)
+bs(109.2,124.65,0)
+lw(1.12)
+lc(2)
+b()
+bs(109.2,124.65,0)
+bs(109.2,100.1,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('Glib',(139.05,107.35))
+fp((0,0,0))
+le()
+b()
+bs(426.3,100.35,0)
+bs(426.3,98.2502,0)
+bs(510.3,98.2502,0)
+bs(510.3,122.25,0)
+bs(508.2,122.25,0)
+bs(508.2,100.35,0)
+bs(426.3,100.35,0)
+bC()
+fp((0.961,0.961,0.863))
+le()
+b()
+bs(424.2,100.35,0)
+bs(508.2,100.35,0)
+bs(508.2,124.35,0)
+bs(424.2,124.35,0)
+bs(424.2,100.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(424.2,100.35,0)
+bs(508.2,100.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(508.2,100.35,0)
+bs(508.2,124.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(508.2,124.35,0)
+bs(424.2,124.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(424.2,124.35,0)
+bs(424.2,100.35,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('X11',(455.15,107.35))
+fp((0,0,0))
+le()
+b()
+bs(662,100.1,0)
+bs(662,98.0002,0)
+bs(746,98.0002,0)
+bs(746,122.55,0)
+bs(743.9,122.55,0)
+bs(743.9,100.1,0)
+bs(662,100.1,0)
+bC()
+fp((0.761,0.98,0.98))
+le()
+b()
+bs(659.9,100.1,0)
+bs(743.9,100.1,0)
+bs(743.9,124.65,0)
+bs(659.9,124.65,0)
+bs(659.9,100.1,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,100.1,0)
+bs(743.9,100.1,0)
+lw(1.12)
+lc(2)
+b()
+bs(743.9,100.1,0)
+bs(743.9,124.65,0)
+lw(1.12)
+lc(2)
+b()
+bs(743.9,124.65,0)
+bs(659.9,124.65,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,124.65,0)
+bs(659.9,100.1,0)
+fp((0,0,0))
+Fn('Helvetica')
+Fs(14)
+txt('ICE',(690.6,107.35))
+fp((0,0,0))
+Fn('Helvetica')
+txt('some',(585.05,38.7002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('configur',(617.15,38.7002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('ations',(659.733,38.7002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('only',(694.4,38.7002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('*',(568.85,22.5002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('Xt',(585.05,22.5002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('intr',(599.4,22.5002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('insics',(616.217,22.5002))
+fp((0,0,0))
+Fn('Helvetica')
+txt('only',(648.95,22.5002))
+lw(1.12)
+lc(2)
+ld((0, 2.4999899999999999))
+b()
+bs(308.7,339.25,0)
+bs(308.7,328.05,0)
+lw(1.12)
+lc(2)
+ld((0, 2.0312000000000001))
+b()
+bs(308.7,328.05,0)
+bs(308.7,332.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(308.7,332.6,0)
+bs(308.7,332.6,0)
+bc(308.7,330.744,309.438,328.963,310.75,327.651,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543599999999999))
+b()
+bs(310.75,327.65,0)
+bs(310.75,327.651,0)
+bc(312.063,326.338,313.844,325.6,315.7,325.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4639500000000001))
+b()
+bs(315.7,325.6,0)
+bs(387.45,325.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4639500000000001))
+b()
+bs(387.45,325.6,0)
+bs(459.2,325.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(459.2,325.6,0)
+bs(459.2,325.6,0)
+bc(461.056,325.6,462.837,324.863,464.15,323.55,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(464.15,323.55,0)
+bs(464.15,323.55,0)
+bc(465.462,322.237,466.2,320.457,466.2,318.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.3437899999999998))
+b()
+bs(466.2,318.6,0)
+bs(466.2,313.35,0)
+lw(1.12)
+lc(2)
+ld((0, 2.5))
+b()
+bs(466.2,313.35,0)
+bs(466.2,311.95,0)
+fp((0,0,0))
+le()
+b()
+bs(462.35,311.95,0)
+bs(466.199,304.25,0)
+bs(470.05,311.95,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4999899999999999))
+b()
+bs(308.7,339.25,0)
+bs(308.7,328.05,0)
+lw(1.12)
+lc(2)
+ld((0, 2.0088900000000001))
+b()
+bs(308.7,328.05,0)
+bs(308.7,332.55,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(308.7,332.55,0)
+bs(308.7,332.55,0)
+bc(308.7,330.694,309.438,328.913,310.75,327.601,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543599999999999))
+b()
+bs(310.75,327.6,0)
+bs(310.75,327.601,0)
+bc(312.063,326.288,313.844,325.55,315.7,325.55,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4857100000000001))
+b()
+bs(459.2,325.6,0)
+bs(594.1,325.55,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543900000000001))
+b()
+bs(594.1,325.55,0)
+bs(594.1,325.55,0)
+bc(595.956,325.55,597.737,324.813,599.05,323.5,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4544100000000002))
+b()
+bs(599.05,323.5,0)
+bs(599.05,323.5,0)
+bc(600.362,322.187,601.1,320.407,601.1,318.55,0)
+lw(1.12)
+lc(2)
+ld((0, 2.3660899999999998))
+b()
+bs(601.1,318.55,0)
+bs(601.1,313.25,0)
+lw(1.12)
+lc(2)
+ld((0, 2.5))
+b()
+bs(601.1,313.25,0)
+bs(601.1,311.85,0)
+fp((0,0,0))
+le()
+b()
+bs(597.25,311.85,0)
+bs(601.099,304.15,0)
+bs(604.949,311.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(266.7,351.775,0)
+bs(255.5,351.775,0)
+lw(1.12)
+lc(2)
+b()
+bs(255.5,351.775,0)
+bs(57.3999,351.775,0)
+lw(1.12)
+lc(2)
+b()
+bs(57.3999,351.775,0)
+bs(57.3999,351.775,0)
+bc(53.5339,351.775,50.3999,348.641,50.3999,344.775,0)
+lw(1.12)
+lc(2)
+b()
+bs(50.3999,344.775,0)
+bs(50.3999,194.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(50.3999,194.95,0)
+bs(50.3999,193.55,0)
+fp((0,0,0))
+le()
+b()
+bs(46.5496,193.55,0)
+bs(50.3994,185.85,0)
+bs(54.2495,193.55,0)
+lw(1.12)
+lc(2)
+b()
+bs(50.3999,160.8,0)
+bs(50.3999,133.5,0)
+fp((0,0,0))
+le()
+b()
+bs(46.5496,133.5,0)
+bs(50.3994,125.8,0)
+bs(54.2495,133.5,0)
+lw(1.12)
+lc(2)
+ld((0, 2))
+b()
+bs(50.3999,160.8,0)
+bs(50.3999,149.6,0)
+lw(1.12)
+lc(2)
+ld((0, 1.7745500000000001))
+b()
+bs(50.3999,149.6,0)
+bs(50.3999,153.575,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543599999999999))
+b()
+bs(50.3999,153.575,0)
+bs(50.3999,153.575,0)
+bc(50.3999,151.719,51.1375,149.938,52.4502,148.625,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543699999999999))
+b()
+bs(52.45,148.625,0)
+bs(52.4502,148.625,0)
+bc(53.7629,147.313,55.5435,146.575,57.3999,146.575,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4218799999999998))
+b()
+bs(57.3999,146.575,0)
+bs(100.8,146.575,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4218799999999998))
+b()
+bs(100.8,146.575,0)
+bs(144.2,146.575,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(144.2,146.575,0)
+bs(144.2,146.575,0)
+bc(146.056,146.575,147.837,145.838,149.15,144.525,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543699999999999))
+b()
+bs(149.15,144.525,0)
+bs(149.15,144.525,0)
+bc(150.462,143.212,151.2,141.432,151.2,139.575,0)
+lw(1.12)
+lc(2)
+ld((0, 1.73363))
+b()
+bs(151.2,139.575,0)
+bs(151.2,133.75,0)
+lw(1.12)
+lc(2)
+ld((0, 2.5))
+b()
+bs(151.2,133.75,0)
+bs(151.2,132.35,0)
+fp((0,0,0))
+le()
+b()
+bs(147.35,132.35,0)
+bs(151.199,124.65,0)
+bs(155.05,132.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,351.775,0)
+bs(361.9,351.775,0)
+lw(1.12)
+lc(2)
+b()
+bs(361.9,351.775,0)
+bs(694.9,351.775,0)
+lw(1.12)
+lc(2)
+b()
+bs(694.9,351.775,0)
+bs(694.9,351.775,0)
+bc(698.766,351.775,701.9,348.641,701.9,344.775,0)
+lw(1.12)
+lc(2)
+b()
+bs(701.9,344.775,0)
+bs(701.9,254.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(701.9,254.15,0)
+bs(701.9,252.75,0)
+fp((0,0,0))
+le()
+b()
+bs(698.05,252.75,0)
+bs(701.899,245.05,0)
+bs(705.75,252.75,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4375200000000001))
+b()
+bs(308.7,339.25,0)
+bs(308.7,311.95,0)
+fp((0,0,0))
+le()
+b()
+bs(304.85,311.95,0)
+bs(308.699,304.25,0)
+bs(312.55,311.95,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4999899999999999))
+b()
+bs(308.7,339.25,0)
+bs(308.7,328.05,0)
+lw(1.12)
+lc(2)
+ld((0, 2.0312000000000001))
+b()
+bs(308.7,328.05,0)
+bs(308.7,332.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(308.7,332.6,0)
+bs(308.7,332.6,0)
+bc(308.7,330.744,307.962,328.963,306.65,327.651,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(306.65,327.65,0)
+bs(306.65,327.651,0)
+bc(305.337,326.338,303.556,325.601,301.7,325.601,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4639500000000001))
+b()
+bs(301.7,325.6,0)
+bs(229.95,325.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4639500000000001))
+b()
+bs(229.95,325.6,0)
+bs(158.2,325.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.4543699999999999))
+b()
+bs(158.2,325.6,0)
+bs(158.2,325.6,0)
+bc(156.344,325.6,154.563,324.863,153.25,323.55,0)
+lw(1.12)
+lc(2)
+ld((0, 2.45438))
+b()
+bs(153.25,323.55,0)
+bs(153.25,323.55,0)
+bc(151.938,322.237,151.2,320.457,151.2,318.6,0)
+lw(1.12)
+lc(2)
+ld((0, 2.3437899999999998))
+b()
+bs(151.2,318.6,0)
+bs(151.2,313.35,0)
+lw(1.12)
+lc(2)
+ld((0, 2.5))
+b()
+bs(151.2,313.35,0)
+bs(151.2,311.95,0)
+fp((0,0,0))
+le()
+b()
+bs(147.35,311.95,0)
+bs(151.199,304.25,0)
+bs(155.05,311.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(308.7,280.05,0)
+bs(308.7,252.75,0)
+fp((0,0,0))
+le()
+b()
+bs(304.85,252.75,0)
+bs(308.699,245.05,0)
+bs(312.55,252.75,0)
+lw(1.12)
+lc(2)
+b()
+bs(466.2,280.05,0)
+bs(466.2,193.15,0)
+fp((0,0,0))
+le()
+b()
+bs(462.35,193.15,0)
+bs(466.199,185.45,0)
+bs(470.05,193.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.2,280.05,0)
+bs(151.2,268.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.2,268.85,0)
+bs(151.2,239.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.2,239.95,0)
+bs(151.2,239.95,0)
+bc(151.2,236.084,154.334,232.95,158.2,232.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(158.2,232.95,0)
+bs(257.6,232.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(257.6,232.95,0)
+bs(259,232.95,0)
+fp((0,0,0))
+le()
+b()
+bs(259,229.1,0)
+bs(266.699,232.95,0)
+bs(259,236.8,0)
+lw(1.12)
+lc(2)
+b()
+bs(350.7,232.95,0)
+bs(361.9,232.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(361.9,232.95,0)
+bs(459.2,232.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(459.2,232.95,0)
+bs(459.2,232.95,0)
+bc(463.066,232.95,466.2,229.816,466.2,225.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(466.2,225.95,0)
+bs(466.2,194.55,0)
+lw(1.12)
+lc(2)
+b()
+bs(466.2,194.55,0)
+bs(466.2,193.15,0)
+fp((0,0,0))
+le()
+b()
+bs(462.35,193.15,0)
+bs(466.199,185.45,0)
+bs(470.05,193.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(559.1,292.15,0)
+bs(547.9,292.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(547.9,292.15,0)
+bs(544.5,292.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(544.5,292.15,0)
+bs(544.5,292.15,0)
+bc(542.643,292.15,540.863,291.413,539.55,290.1,0)
+lw(1.12)
+lc(2)
+b()
+bs(539.55,290.1,0)
+bs(539.55,290.1,0)
+bc(538.238,288.787,537.5,287.007,537.5,285.15,0)
+lw(1.12)
+lc(2)
+b()
+bs(537.5,285.15,0)
+bs(537.5,232.75,0)
+lw(1.12)
+lc(2)
+b()
+bs(537.5,232.75,0)
+bs(537.5,180.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(537.5,180.35,0)
+bs(537.5,180.35,0)
+bc(537.5,178.494,536.762,176.713,535.449,175.401,0)
+lw(1.12)
+lc(2)
+b()
+bs(535.449,175.4,0)
+bs(535.449,175.401,0)
+bc(534.137,174.088,532.356,173.35,530.5,173.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(530.5,173.35,0)
+bs(517.3,173.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(517.3,173.35,0)
+bs(515.9,173.35,0)
+fp((0,0,0))
+le()
+b()
+bs(515.9,177.2,0)
+bs(508.2,173.351,0)
+bs(515.9,169.5,0)
+lw(1.12)
+lc(2)
+b()
+bs(701.9,220.95,0)
+bs(701.9,193.3,0)
+fp((0,0,0))
+le()
+b()
+bs(698.05,193.3,0)
+bs(701.899,185.6,0)
+bs(705.75,193.3,0)
+lw(1.12)
+lc(2)
+b()
+bs(659.9,233,0)
+bs(648.7,233,0)
+lw(1.12)
+lc(2)
+b()
+bs(648.7,233,0)
+bs(594.9,233,0)
+lw(1.12)
+lc(2)
+b()
+bs(594.9,233,0)
+bs(594.9,233,0)
+bc(593.043,233,591.263,232.263,589.95,230.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(589.95,230.95,0)
+bs(589.95,230.95,0)
+bc(588.638,229.637,587.9,227.857,587.9,226,0)
+lw(1.12)
+lc(2)
+b()
+bs(587.9,226,0)
+bs(587.9,172.675,0)
+lw(1.12)
+lc(2)
+b()
+bs(587.9,172.675,0)
+bs(587.9,119.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(587.9,119.35,0)
+bs(587.9,119.35,0)
+bc(587.9,117.494,587.162,115.713,585.85,114.401,0)
+lw(1.12)
+lc(2)
+b()
+bs(585.85,114.4,0)
+bs(585.85,114.401,0)
+bc(584.537,113.088,582.756,112.35,580.9,112.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(580.9,112.35,0)
+bs(517.3,112.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(517.3,112.35,0)
+bs(515.9,112.35,0)
+fp((0,0,0))
+le()
+b()
+bs(515.9,116.2,0)
+bs(508.2,112.35,0)
+bs(515.9,108.5,0)
+lw(1.12)
+lc(2)
+b()
+bs(701.9,161.05,0)
+bs(701.9,132.35,0)
+fp((0,0,0))
+le()
+b()
+bs(698.05,132.35,0)
+bs(701.899,124.65,0)
+bs(705.75,132.35,0)
+lw(1.12)
+lc(2)
+b()
+bs(466.2,161.25,0)
+bs(466.2,132.05,0)
+fp((0,0,0))
+le()
+b()
+bs(462.35,132.05,0)
+bs(466.199,124.35,0)
+bs(470.05,132.05,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.2,280.05,0)
+bs(151.2,268.85,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.2,268.85,0)
+bs(151.2,180.325,0)
+lw(1.12)
+lc(2)
+b()
+bs(151.2,180.325,0)
+bs(151.2,180.325,0)
+bc(151.2,176.459,154.334,173.325,158.2,173.325,0)
+lw(1.12)
+lc(2)
+b()
+bs(158.2,173.325,0)
+bs(257.6,173.325,0)
+lw(1.12)
+lc(2)
+b()
+bs(257.6,173.325,0)
+bs(259,173.325,0)
+fp((0,0,0))
+le()
+b()
+bs(259,169.475,0)
+bs(266.699,173.325,0)
+bs(259,177.175,0)
+lw(1.12)
+lc(2)
+b()
+bs(308.7,161.15,0)
+bs(308.7,149.95,0)
+lw(1.12)
+lc(2)
+b()
+bs(308.7,149.95,0)
+bs(308.7,153.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(308.7,153.6,0)
+bs(308.7,153.6,0)
+bc(308.7,151.744,309.438,149.963,310.75,148.651,0)
+lw(1.12)
+lc(2)
+b()
+bs(310.75,148.65,0)
+bs(310.75,148.651,0)
+bc(312.063,147.338,313.844,146.6,315.7,146.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(315.7,146.6,0)
+bs(387.45,146.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(387.45,146.6,0)
+bs(459.2,146.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(459.2,146.6,0)
+bs(459.2,146.6,0)
+bc(461.056,146.6,462.837,145.863,464.15,144.55,0)
+lw(1.12)
+lc(2)
+b()
+bs(464.15,144.55,0)
+bs(464.15,144.55,0)
+bc(465.462,143.237,466.2,141.457,466.2,139.6,0)
+lw(1.12)
+lc(2)
+b()
+bs(466.2,139.6,0)
+bs(466.2,133.45,0)
+lw(1.12)
+lc(2)
+b()
+bs(466.2,133.45,0)
+bs(466.2,132.05,0)
+fp((0,0,0))
+le()
+b()
+bs(462.35,132.05,0)
+bs(466.199,124.35,0)
+bs(470.05,132.05,0)
+lw(1.12)
+lc(2)
+ld((0, 2.2889599999999999))
+b()
+bs(552.65,41.8,0)
+bs(580.85,41.8,0)
+G_()
+G()
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('libr',(341.317,393.4))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('ar',(362.494,393.4))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('y',(377.168,393.4))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('dependencies',(389.267,393.4))
+fp((0,0,0))
+Fn('Helvetica')
+Fs(16)
+txt('Qt for X11',(265.517,393.4))
+G_()
+guidelayer('Guide Lines',1,0,0,1,(0,0,1))
+grid((0,0,5,5),1,(0,0,1),'Grid')
diff --git a/doc/src/diagrams/xmlpatterns-qobjectxmlmodel.png b/doc/src/diagrams/xmlpatterns-qobjectxmlmodel.png
new file mode 100644
index 0000000..69e5f15
--- /dev/null
+++ b/doc/src/diagrams/xmlpatterns-qobjectxmlmodel.png
Binary files differ
diff --git a/doc/src/distributingqt.qdoc b/doc/src/distributingqt.qdoc
new file mode 100644
index 0000000..9b88dc4
--- /dev/null
+++ b/doc/src/distributingqt.qdoc
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Documentation on deploying Qt.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*
+\page distributingqt.html
+
+\title Deploying Qt Applications
+
+This document lists the platform-specific files needed to distribute
+Qt applications. We do not include any compiler-specific files that
+may also be required. (See also, \link winsystem.html Window
+System-specific Notes\endlink.)
+
+\tableofcontents
+
+Also see the "deployment" articles in
+\e{\link http://doc.trolltech.com/qq/ Qt Quarterly\endlink}:
+\list
+\i \link http://doc.trolltech.com/qq/qq09-mac-deployment.html
+Deploying Applications on Mac OS X\endlink
+\i \link http://doc.trolltech.com/qq/qq10-windows-deployment.html
+Deploying Applications on Windows\endlink
+\i \link http://doc.trolltech.com/qq/qq11-unix-deployment.html
+Deploying Applications on X11\endlink
+\endlist
+
+\section1 Static Qt Applications
+
+To distribute static Qt applications, you need the following file for
+all platforms:
+
+\list
+\i your application's executable
+\endlist
+
+\section1 Dynamic Qt Applications
+
+To distribute dynamic Qt applications, you will need the following
+files for all platforms:
+
+\list
+\i application executable
+\i the Qt library
+\endlist
+
+The Qt library must either be in the same directory as the application
+executable or in a directory which is included in the system library
+path.
+
+The library is provided by the following platform specific files:
+
+\table
+\header \i Platform \i File
+\row \i Windows \i \c qt[version].dll
+\row \i Unix/Linux \i \c libqt[version].so
+\row \i Mac \i \c libqt[version].dylib
+\endtable
+
+\e version includes the three version numbers.
+
+\section2 Distributing Plugins
+
+You must include any plugin files required by the application.
+
+Plugins must be put into a subdirectory under a directory known to
+Qt as a plugin directory. The subdirectory must have the name of the
+plugin category (e.g. \c styles, \c sqldrivers, \c designer, etc.).
+
+Qt searches in the following directories for plugin categories:
+
+\list
+\i Application specific plugin paths
+\i Build-directory of Qt
+\i The application directory
+\endlist
+
+Application specific plugin paths can be added using
+QCoreApplication::addLibraryPath(). The build-directory of Qt is hardcoded
+in the Qt library and can be changed as a part of the installation
+process.
+
+\section1 Dynamic Dialogs
+
+For dynamic dialogs if you use QWidgetFactory, you need the following
+files for all platforms:
+
+\list
+\i The same files as used for dynamic Qt applications
+\i The QUI Library
+\endlist
+
+The QUI library is provided by the following platform specific files:
+\table
+\header \i Platform \i File
+\row \i Windows \i\c qui.lib
+\row \i Unix/Linux \i\c libqui.so
+\row \i Mac \i \c libqui.dylib
+\endtable
+
+The QUI library must either be in the same directory as the
+application executable or in a directory which is included in the
+system library path.
+
+*/
diff --git a/doc/src/dnd.qdoc b/doc/src/dnd.qdoc
new file mode 100644
index 0000000..119922b
--- /dev/null
+++ b/doc/src/dnd.qdoc
@@ -0,0 +1,543 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page dnd.html
+ \title Drag and Drop
+ \ingroup architecture
+ \brief An overview of the drag and drop system provided by Qt.
+
+ Drag and drop provides a simple visual mechanism which users can use
+ to transfer information between and within applications. (In the
+ literature this is referred to as a "direct manipulation model".) Drag
+ and drop is similar in function to the clipboard's cut and paste
+ mechanism.
+
+ \tableofcontents
+
+ This document describes the basic drag and drop mechanism and
+ outlines the approach used to enable it in custom widgets. Drag
+ and drop operations are also supported by Qt's item views and by
+ the graphics view framework; more information is available in the
+ \l{Using Drag and Drop with Item Views} and \l{The Graphics View
+ Framework} documents.
+
+ \section1 Configuration
+
+ The QApplication object provides some properties that are related
+ to drag and drop operations:
+
+ \list
+ \i \l{QApplication::startDragTime} describes the amount of time in
+ milliseconds that the user must hold down a mouse button over an
+ object before a drag will begin.
+ \i \l{QApplication::startDragDistance} indicates how far the user has to
+ move the mouse while holding down a mouse button before the movement
+ will be interpreted as dragging. Use of high values for this quantity
+ prevents accidental dragging when the user only meant to click on an
+ object.
+ \endlist
+
+ These quantities provide sensible default values for you to use if you
+ provide drag and drop support in your widgets.
+
+ \section1 Dragging
+
+ To start a drag, create a QDrag object, and call its
+ exec() function. In most applications, it is a good idea to begin a drag
+ and drop operation only after a mouse button has been pressed and the
+ cursor has been moved a certain distance. However, the simplest way to
+ enable dragging from a widget is to reimplement the widget's
+ \l{QWidget::mousePressEvent()}{mousePressEvent()} and start a drag
+ and drop operation:
+
+ \snippet doc/src/snippets/dragging/mainwindow.cpp 0
+ \dots 8
+ \snippet doc/src/snippets/dragging/mainwindow.cpp 2
+
+ Although the user may take some time to complete the dragging operation,
+ as far as the application is concerned the exec() function is a blocking
+ function that returns with \l{Qt::DropActions}{one of several values}.
+ These indicate how the operation ended, and are described in more detail
+ below.
+
+ Note that the exec() function does not block the main event loop.
+
+ For widgets that need to distinguish between mouse clicks and drags, it
+ is useful to reimplement the widget's
+ \l{QWidget::mousePressEvent()}{mousePressEvent()} function to record to
+ start position of the drag:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 6
+
+ Later, in \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()}, we can determine
+ whether a drag should begin, and construct a drag object to handle the
+ operation:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
+ \dots
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
+
+ This particular approach uses the \l QPoint::manhattanLength() function
+ to get a rough estimate of the distance between where the mouse click
+ occurred and the current cursor position. This function trades accuracy
+ for speed, and is usually suitable for this purpose.
+
+ \section1 Dropping
+
+ To be able to receive media dropped on a widget, call
+ \l{QWidget::setAcceptDrops()}{setAcceptDrops(true)} for the widget,
+ and reimplement the \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
+ \l{QWidget::dropEvent()}{dropEvent()} event handler functions.
+
+ For example, the following code enables drop events in the constructor of
+ a QWidget subclass, making it possible to usefully implement drop event
+ handlers:
+
+ \snippet doc/src/snippets/dropevents/window.cpp 0
+ \dots
+ \snippet doc/src/snippets/dropevents/window.cpp 1
+ \snippet doc/src/snippets/dropevents/window.cpp 2
+
+ The dragEnterEvent() function is typically used to inform Qt about the
+ types of data that the widget accepts.
+ You must reimplement this function if you want to receive either
+ QDragMoveEvent or QDropEvent in your reimplementations of
+ \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and dropEvent().
+
+ The following code shows how dragEnterEvent() can be reimplemented to
+ tell the drag and drop system that we can only handle plain text:
+
+ \snippet doc/src/snippets/dropevents/window.cpp 3
+
+ The dropEvent() is used to unpack dropped data and handle it in way that
+ is suitable for your application.
+
+ In the following code, the text supplied in the event is passed to a
+ QTextBrowser and a QComboBox is filled with the list of MIME types that
+ are used to describe the data:
+
+ \snippet doc/src/snippets/dropevents/window.cpp 4
+
+ In this case, we accept the proposed action without checking what it is.
+ In a real world application, it may be necessary to return from the
+ dropEvent() function without accepting the proposed action or handling
+ the data if the action is not relevant. For example, we may choose to
+ ignore Qt::LinkAction actions if we do not support
+ links to external sources in our application.
+
+ \section2 Overriding Proposed Actions
+
+ We may also ignore the proposed action, and perform some other action on
+ the data. To do this, we would call the event object's
+ \l{QDropEvent::setDropAction()}{setDropAction()} with the preferred
+ action from Qt::DropAction before calling \l{QEvent::}{accept()}.
+ This ensures that the replacement drop action is used instead of the
+ proposed action.
+
+ For more sophisticated applications, reimplementing
+ \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and
+ \l{QWidget::dragLeaveEvent()}{dragLeaveEvent()} will let you make
+ certain parts of your widgets sensitive to drop events, and give you more
+ control over drag and drop in your application.
+
+ \section2 Subclassing Complex Widgets
+
+ Certain standard Qt widgets provide their own support for drag and drop.
+ When subclassing these widgets, it may be necessary to reimplement
+ \l{QWidget::dragMoveEvent()}{dragMoveEvent()} in addition to
+ \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
+ \l{QWidget::dropEvent()}{dropEvent()} to prevent the base class from
+ providing default drag and drop handling, and to handle any special
+ cases you are interested in.
+
+ \section1 Drag and Drop Actions
+
+ In the simplest case, the target of a drag and drop action receives a
+ copy of the data being dragged, and the source decides whether to
+ delete the original. This is described by the \c CopyAction action.
+ The target may also choose to handle other actions, specifically the
+ \c MoveAction and \c LinkAction actions. If the source calls
+ QDrag::exec(), and it returns \c MoveAction, the source is responsible
+ for deleting any original data if it chooses to do so. The QMimeData
+ and QDrag objects created by the source widget \e{should not be deleted}
+ - they will be destroyed by Qt. The target is responsible for taking
+ ownership of the data sent in the drag and drop operation; this is
+ usually done by keeping references to the data.
+
+ If the target understands the \c LinkAction action, it should
+ store its own reference to the original information; the source
+ does not need to perform any further processing on the data. The
+ most common use of drag and drop actions is when performing a
+ Move within the same widget; see the section on \l{Drop Actions}
+ for more information about this feature.
+
+ The other major use of drag actions is when using a reference type
+ such as text/uri-list, where the dragged data are actually references
+ to files or objects.
+
+ \section1 Adding New Drag and Drop Types
+
+ Drag and drop is not limited to text and images. Any type of information
+ can be transferred in a drag and drop operation. To drag information
+ between applications, the applications must be able to indicate to each
+ other which data formats they can accept and which they can produce.
+ This is achieved using
+ \l{http://www.rfc-editor.org/rfc/rfc1341.txt}{MIME types}. The QDrag
+ object constructed by the source contains a list of MIME types that it
+ uses to represent the data (ordered from most appropriate to least
+ appropriate), and the drop target uses one of these to access the data.
+ For common data types, the convenience functions handle the MIME types
+ used transparently but, for custom data types, it is necessary to
+ state them explicitly.
+
+ To implement drag and drop actions for a type of information that is
+ not covered by the QDrag convenience functions, the first and most
+ important step is to look for existing formats that are appropriate:
+ The Internet Assigned Numbers Authority (\l{http://www.iana.org}{IANA})
+ provides a
+ \l{http://www.iana.org/assignments/media-types/}{hierarchical
+ list of MIME media types} at the Information Sciences Institute
+ (\l{http://www.isi.edu}{ISI}).
+ Using standard MIME types maximizes the interoperability of
+ your application with other software now and in the future.
+
+ To support an additional media type, simply set the data in the QMimeData
+ object with the \l{QMimeData::setData()}{setData()} function, supplying
+ the full MIME type and a QByteArray containing the data in the appropriate
+ format. The following code takes a pixmap from a label and stores it
+ as a Portable Network Graphics (PNG) file in a QMimeData object:
+
+ \snippet doc/src/snippets/separations/finalwidget.cpp 0
+
+ Of course, for this case we could have simply used
+ \l{QMimeData::setImageData()}{setImageData()} instead to supply image data
+ in a variety of formats:
+
+ \snippet doc/src/snippets/separations/finalwidget.cpp 1
+
+ The QByteArray approach is still useful in this case because it provides
+ greater control over the amount of data stored in the QMimeData object.
+
+ Note that custom datatypes used in item views must be declared as
+ \l{QMetaObject}{meta objects} and that stream operators for them
+ must be implemented.
+
+ \section1 Drop Actions
+
+ In the clipboard model, the user can \e cut or \e copy the source
+ information, then later paste it. Similarly in the drag and drop
+ model, the user can drag a \e copy of the information or they can drag
+ the information itself to a new place (\e moving it). The
+ drag and drop model has an additional complication for the programmer:
+ The program doesn't know whether the user wants to cut or copy the
+ information until the operation is complete. This often makes no
+ difference when dragging information between applications, but within
+ an application it is important to check which drop action was used.
+
+ We can reimplement the mouseMoveEvent() for a widget, and start a drag
+ and drop operation with a combination of possible drop actions. For
+ example, we may want to ensure that dragging always moves objects in
+ the widget:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
+ \dots
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
+
+ The action returned by the exec() function may default to a
+ \c CopyAction if the information is dropped into another application
+ but, if it is dropped in another widget in the same application, we
+ may obtain a different drop action.
+
+ The proposed drop actions can be filtered in a widget's dragMoveEvent()
+ function. However, it is possible to accept all proposed actions in
+ the dragEnterEvent() and let the user decide which they want to accept
+ later:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 0
+
+ When a drop occurs in the widget, the dropEvent() handler function is
+ called, and we can deal with each possible action in turn. First, we
+ deal with drag and drop operations within the same widget:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 1
+
+ In this case, we refuse to deal with move operations. Each type of drop
+ action that we accept is checked and dealt with accordingly:
+
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 2
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 3
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 4
+ \dots
+ \snippet doc/src/snippets/draganddrop/dragwidget.cpp 5
+
+ Note that we checked for individual drop actions in the above code.
+ As mentioned above in the section on
+ \l{#Overriding Proposed Actions}{Overriding Proposed Actions}, it is
+ sometimes necessary to override the proposed drop action and choose a
+ different one from the selection of possible drop actions.
+ To do this, you need to check for the presence of each action in the value
+ supplied by the event's \l{QDropEvent::}{possibleActions()}, set the drop
+ action with \l{QDropEvent::}{setDropAction()}, and call
+ \l{QEvent::}{accept()}.
+
+ \section1 Drop Rectangles
+
+ The widget's dragMoveEvent() can be used to restrict drops to certain parts
+ of the widget by only accepting the proposed drop actions when the cursor
+ is within those areas. For example, the following code accepts any proposed
+ drop actions when the cursor is over a child widget (\c dropFrame):
+
+ \snippet doc/src/snippets/droprectangle/window.cpp 0
+
+ The dragMoveEvent() can also be used if you need to give visual
+ feedback during a drag and drop operation, to scroll the window, or
+ whatever is appropriate.
+
+ \section1 The Clipboard
+
+ Applications can also communicate with each other by putting data on
+ the clipboard. To access this, you need to obtain a QClipboard object
+ from the QApplication object:
+
+ \snippet examples/widgets/charactermap/mainwindow.cpp 3
+
+ The QMimeData class is used to represent data that is transferred to and
+ from the clipboard. To put data on the clipboard, you can use the
+ setText(), setImage(), and setPixmap() convenience functions for common
+ data types. These functions are similar to those found in the QMimeData
+ class, except that they also take an additional argument that controls
+ where the data is stored: If \l{QClipboard::Mode}{Clipboard} is
+ specified, the data is placed on the clipboard; if
+ \l{QClipboard::Mode}{Selection} is specified, the data is placed in the
+ mouse selection (on X11 only). By default, data is put on the clipboard.
+
+ For example, we can copy the contents of a QLineEdit to the clipboard
+ with the following code:
+
+ \snippet examples/widgets/charactermap/mainwindow.cpp 11
+
+ Data with different MIME types can also be put on the clipboard.
+ Construct a QMimeData object and set data with setData() function in
+ the way described in the previous section; this object can then be
+ put on the clipboard with the
+ \l{QClipboard::setMimeData()}{setMimeData()} function.
+
+ The QClipboard class can notify the application about changes to the
+ data it contains via its \l{QClipboard::dataChanged()}{dataChanged()}
+ signal. For example, we can monitor the clipboard by connecting this
+ signal to a slot in a widget:
+
+ \snippet doc/src/snippets/clipboard/clipwindow.cpp 0
+
+ The slot connected to this signal can read the data on the clipboard
+ using one of the MIME types that can be used to represent it:
+
+ \snippet doc/src/snippets/clipboard/clipwindow.cpp 1
+ \dots
+ \snippet doc/src/snippets/clipboard/clipwindow.cpp 2
+
+ The \l{QClipboard::selectionChanged()}{selectionChanged()} signal can
+ be used on X11 to monitor the mouse selection.
+
+ \section1 Examples
+
+ \list
+ \o \l{draganddrop/draggableicons}{Draggable Icons}
+ \o \l{draganddrop/draggabletext}{Draggable Text}
+ \o \l{draganddrop/dropsite}{Drop Site}
+ \o \l{draganddrop/fridgemagnets}{Fridge Magnets}
+ \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
+ \endlist
+
+ \section1 Interoperating with Other Applications
+
+ On X11, the public \l{http://www.newplanetsoftware.com/xdnd/}{XDND
+ protocol} is used, while on Windows Qt uses the OLE standard, and
+ Qt for Mac OS X uses the Carbon Drag Manager. On X11, XDND uses MIME,
+ so no translation is necessary. The Qt API is the same regardless of
+ the platform. On Windows, MIME-aware applications can communicate by
+ using clipboard format names that are MIME types. Already some
+ Windows applications use MIME naming conventions for their
+ clipboard formats. Internally, Qt uses QWindowsMime and
+ QMacPasteboardMime for translating proprietary clipboard formats
+ to and from MIME types.
+
+ On X11, Qt also supports drops via the Motif Drag & Drop Protocol. The
+ implementation incorporates some code that was originally written by
+ Daniel Dardailler, and adapted for Qt by Matt Koss <koss@napri.sk>
+ and Trolltech. Here is the original copyright notice:
+
+ \legalese
+ Copyright 1996 Daniel Dardailler.
+
+ Permission to use, copy, modify, distribute, and sell this software
+ for any purpose is hereby granted without fee, provided that the above
+ copyright notice appear in all copies and that both that copyright
+ notice and this permission notice appear in supporting documentation,
+ and that the name of Daniel Dardailler not be used in advertising or
+ publicity pertaining to distribution of the software without specific,
+ written prior permission. Daniel Dardailler makes no representations
+ about the suitability of this software for any purpose. It is
+ provided "as is" without express or implied warranty.
+
+ Modifications Copyright 1999 Matt Koss, under the same license as
+ above.
+ \endlegalese
+ \omit NOTE: The copyright notice is from qmotifdnd_x11.cpp. \endomit
+
+ Note: The Motif Drag \& Drop Protocol only allows receivers to
+ request data in response to a QDropEvent. If you attempt to
+ request data in response to e.g. a QDragMoveEvent, an empty
+ QByteArray is returned.
+*/
+
+/*!
+ \page porting4-dnd.html
+ \title Porting to Qt 4 - Drag and Drop
+ \contentspage {Porting Guides}{Contents}
+ \previouspage Porting to Qt 4 - Virtual Functions
+ \nextpage Porting .ui Files to Qt 4
+ \ingroup porting
+ \brief An overview of the porting process for applications that use drag and drop.
+
+ Qt 4 introduces a new set of classes to handle drag and drop operations
+ that aim to be easier to use than their counterparts in Qt 3. As a result,
+ the way that drag and drop is performed is quite different to the way
+ developers of Qt 3 applications have come to expect. In this guide, we
+ show the differences between the old and new APIs and indicate where
+ applications need to be changed when they are ported to Qt 4.
+
+ \tableofcontents
+
+ \section1 Dragging
+
+ In Qt 3, drag operations are encapsulated by \c QDragObject (see Q3DragObject)
+ and its subclasses. These objects are typically constructed on the heap in
+ response to mouse click or mouse move events, and ownership of them is
+ transferred to Qt so that they can be deleted when the corresponding drag and
+ drop operations have been completed. The drag source has no control over how
+ the drag and drop operation is performed once the object's
+ \l{Q3DragObject::}{drag()} function is called, and it receives no information
+ about how the operation ended.
+
+ \snippet doc/src/snippets/code/doc_src_dnd.qdoc 0
+
+ Similarly, in Qt 4, drag operations are also initiated when a QDrag object
+ is constructed and its \l{QDrag::}{exec()} function is called. In contrast,
+ these objects are typically constructed on the stack rather than the heap
+ since each drag and drop operation is performed synchronously as far as the
+ drag source is concerned. One key benefit of this is that the drag source
+ can receive information about how the operation ended from the value returned
+ by \l{QDrag::}{exec()}.
+
+ \snippet doc/src/snippets/porting4-dropevents/window.cpp 2
+ \snippet doc/src/snippets/porting4-dropevents/window.cpp 3
+ \dots 8
+ \snippet doc/src/snippets/porting4-dropevents/window.cpp 4
+ \snippet doc/src/snippets/porting4-dropevents/window.cpp 5
+
+ A key difference in the above code is the use of the QMimeData class to hold
+ information about the data that is transferred. Qt 3 relies on subclasses
+ of \c QDragObject to provide support for specific MIME types; in Qt 4, the
+ use of QMimeData as a generic container for data makes the relationship
+ between MIME type and data more tranparent. QMimeData is described in more
+ detail later in this document.
+
+ \section1 Dropping
+
+ In both Qt 3 and Qt 4, it is possible to prepare a custom widget to accept
+ dropped data by enabling the \l{QWidget::}{acceptDrops} property of a widget,
+ usually in the widget's constructor. As a result, the widget will receive
+ drag enter events that can be handled by its \l{QWidget::}{dragEnterEvent()}
+ function.
+ As in Qt 3, custom widgets in Qt 4 handle these events by determining
+ whether the data supplied by the drag and drop operation can be dropped onto
+ the widget. Since the classes used to encapsulate MIME data are different in
+ Qt 3 and Qt 4, the exact implementations differ.
+
+ In Qt 3, the drag enter event is handled by checking whether each of the
+ standard \c QDragObject subclasses can decode the data supplied, and
+ indicating success or failure of these checks via the event's
+ \l{QDragEnterEvent::}{accept()} function, as shown in this simple example:
+
+ \snippet doc/src/snippets/code/doc_src_dnd.qdoc 1
+
+ In Qt 4, you can examine the MIME type describing the data to determine
+ whether the widget should accept the event or, for common data types, you
+ can use convenience functions:
+
+ \snippet doc/src/snippets/porting4-dropevents/window.cpp 0
+
+ The widget has some control over the type of drag and drop operation to be
+ performed. In the above code, the action proposed by the drag source is
+ accepted, but
+ \l{Drag and Drop#Overriding Proposed Actions}{this can be overridden} if
+ required.
+
+ In both Qt 3 and Qt 4, it is necessary to accept a given drag event in order
+ to receive the corresponding drop event. A custom widget in Qt 3 that can
+ accept dropped data in the form of text or images might provide an
+ implementation of \l{QWidget::}{dropEvent()} that looks like the following:
+
+ \snippet doc/src/snippets/code/doc_src_dnd.qdoc 2
+
+ In Qt 4, the event is handled in a similar way:
+
+ \snippet doc/src/snippets/porting4-dropevents/window.cpp 1
+
+ It is also possible to extract data stored for a particular MIME type if it
+ was specified by the drag source.
+
+ \section1 MIME Types and Data
+
+ In Qt 3, data to be transferred in drag and drop operations is encapsulated
+ in instances of \c QDragObject and its subclasses, representing specific
+ data formats related to common MIME type and subtypes.
+
+ In Qt 4, only the QMimeData class is used to represent data, providing a
+ container for data stored in multiple formats, each associated with
+ a relevant MIME type. Since arbitrary MIME types can be specified, there is
+ no need for an extensive class hierarchy to represent different kinds of
+ information. Additionally, QMimeData it provides some convenience functions
+ to allow the most common data formats to be stored and retrieved with less
+ effort than for arbitrary MIME types.
+*/
diff --git a/doc/src/ecmascript.qdoc b/doc/src/ecmascript.qdoc
new file mode 100644
index 0000000..303b752
--- /dev/null
+++ b/doc/src/ecmascript.qdoc
@@ -0,0 +1,313 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page ecmascript.html
+ \title ECMAScript Reference
+ \ingroup scripting
+ \brief A list of objects, functions and properties supported by QtScript.
+
+ This reference contains a list of objects, functions and
+ properties supported by QtScript.
+
+ \tableofcontents
+
+ \section1 The Global Object
+
+ \section2 Value Properties
+
+ \list
+ \o NaN
+ \o Infinity
+ \o undefined
+ \o Math
+ \endlist
+
+ \section2 Function Properties
+
+ \list
+ \o eval(x)
+ \o parseInt(string, radix)
+ \o parseFloat(string)
+ \o isNaN(number)
+ \o isFinite(number)
+ \o decodeURI(encodedURI)
+ \o decodeURIComponent(encodedURIComponent)
+ \o encodeURI(uri)
+ \o encodeURIComponent(uriComponent)
+ \endlist
+
+ \section2 Constructor Properties
+
+ \list
+ \o Object
+ \o Function
+ \o Array
+ \o String
+ \o Boolean
+ \o Number
+ \o Date
+ \o RegExp
+ \o Error
+ \o EvalError
+ \o RangeError
+ \o ReferenceError
+ \o SyntaxError
+ \o TypeError
+ \o URIError
+ \endlist
+
+ \section1 Object Objects
+
+ \section2 Object Prototype Object
+
+ \list
+ \o toString()
+ \o toLocaleString()
+ \o valueOf()
+ \o hasOwnProperty(V)
+ \o isPrototypeOf(V)
+ \o propertyIsEnumerable(V)
+ \endlist
+
+ \section1 Function Objects
+
+ \section2 Function Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o toString()
+ \o apply(thisArg, argArray)
+ \o call(thisArg [, arg1 [, arg2, ...]])
+ \endlist
+
+ \section1 Array Objects
+
+ \section2 Array Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o toString()
+ \o toLocaleString()
+ \o concat([item1 [, item2 [, ...]]])
+ \o join(separator)
+ \o pop()
+ \o push([item1 [, item2 [, ...]]])
+ \o reverse()
+ \o shift()
+ \o slice(start, end)
+ \o sort(comparefn)
+ \o splice(start, deleteCount[, item1 [, item2 [, ...]]])
+ \o unshift([item1 [, item2 [, ...]]])
+ \endlist
+
+ \section1 String Objects
+
+ \section2 String Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o toString()
+ \o valueOf()
+ \o charAt(pos)
+ \o charCodeAt(pos)
+ \o concat([string1 [, string2 [, ...]]])
+ \o indexOf(searchString ,position)
+ \o lastIndexOf(searchString, position)
+ \o localeCompare(that)
+ \o match(regexp)
+ \o replace(searchValue, replaceValue)
+ \o search(regexp)
+ \o slice(start, end)
+ \o split(separator, limit)
+ \o substring(start, end)
+ \o toLowerCase()
+ \o toLocaleLowerCase()
+ \o toUpperCase()
+ \o toLocaleUpperCase()
+ \endlist
+
+ \section1 Boolean Objects
+
+ \section2 Boolean Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o toString()
+ \o valueOf()
+ \endlist
+
+ \section1 Number Objects
+
+ \section2 Number Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o toString(radix)
+ \o toLocaleString()
+ \o toFixed(fractionDigits)
+ \o toExponential(fractionDigits)
+ \o toPrecision(precision)
+ \endlist
+
+ \section1 The Math Object
+
+ \section2 Value Properties
+
+ \list
+ \o E
+ \o LN10
+ \o LN2
+ \o LOG2E
+ \o LOG10E
+ \o PI
+ \o SQRT1_2
+ \o SQRT2
+ \endlist
+
+ \section2 Function Properties
+
+ \list
+ \o abs(x)
+ \o acos(x)
+ \o asin(x)
+ \o atan(x)
+ \o atan2(y, x)
+ \o ceil(x)
+ \o cos(x)
+ \o exp(x)
+ \o floor(x)
+ \o log(x)
+ \o max([value1 [, value2 [, ...]]])
+ \o min([value1 [, value2 [, ...]]])
+ \o pow(x, y)
+ \o random()
+ \o round(x)
+ \o sin(x)
+ \o sqrt(x)
+ \o tan(x)
+ \endlist
+
+ \section1 Date Objects
+
+ \section2 Date Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o toString()
+ \o toDateString()
+ \o toTimeString()
+ \o toLocaleString()
+ \o toLocaleDateString()
+ \o toLocaleTimeString()
+ \o valueOf()
+ \o getTime()
+ \o getFullYear()
+ \o getUTCFullYear()
+ \o getMonth()
+ \o getUTCMonth()
+ \o getDate()
+ \o getUTCDate()
+ \o getDay()
+ \o getUTCDay()
+ \o getHours()
+ \o getUTCHours()
+ \o getMinutes()
+ \o getUTCMinutes()
+ \o getSeconds()
+ \o getUTCSeconds()
+ \o getMilliseconds()
+ \o getUTCMilliseconds()
+ \o getTimeZoneOffset()
+ \o setTime(time)
+ \o setMilliseconds(ms)
+ \o setUTCMilliseconds(ms)
+ \o setSeconds(sec [, ms])
+ \o setUTCSeconds(sec [, ms])
+ \o setMinutes(min [, sec [, ms]])
+ \o setUTCMinutes(min [, sec [, ms]])
+ \o setHours(hour [, min [, sec [, ms]]])
+ \o setUTCHours(hour [, min [, sec [, ms]]])
+ \o setDate(date)
+ \o setUTCDate(date)
+ \o setMonth(month [, date])
+ \o setUTCMonth(month [, date])
+ \o setFullYear(year [, month [, date]])
+ \o setUTCFullYear(year [, month [, date]])
+ \o toUTCString()
+ \endlist
+
+ \section1 RegExp Objects
+
+ \section2 RegExp Prototype Object
+
+ \section3 Function Properties
+
+ \list
+ \o exec(string)
+ \o test(string)
+ \o toString()
+ \endlist
+
+ \section1 Error Objects
+
+ \section2 Error Prototype Object
+
+ \section3 Value Properties
+
+ \list
+ \o name
+ \o message
+ \endlist
+
+ \section3 Function Properties
+
+ \list
+ \o toString()
+ \endlist
+
+*/
diff --git a/doc/src/editions.qdoc b/doc/src/editions.qdoc
new file mode 100644
index 0000000..5d3b35c
--- /dev/null
+++ b/doc/src/editions.qdoc
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Documentation of Qt editions.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page editions.html
+ \title Qt Editions
+ \ingroup licensing
+ \brief Information about the different editions of Qt.
+
+ Qt can be used to create both commercial and non-commercial
+ software for a wide range of different deployment environments,
+ and is supplied in a number of different forms to suit the needs
+ of different kinds of developers.
+
+ In terms of license conditions, there are two main forms of Qt:
+
+ \list
+ \o The \l{Qt Commercial Editions} are the commercial
+ versions of \l{About Qt}{Qt}.
+ \o The \l{Open Source Versions of Qt} are freely available for download.
+ \endlist
+
+ On the Qt web site, you can find a
+ \l{Qt Licensing Overview} and information on \l{Qt License Pricing}
+ for commercial editions of Qt and other Qt-related products.
+*/
diff --git a/doc/src/emb-accel.qdoc b/doc/src/emb-accel.qdoc
new file mode 100644
index 0000000..67fe8e6
--- /dev/null
+++ b/doc/src/emb-accel.qdoc
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-accel.html
+
+ \target add your graphics driver to Qt for Embedded Linux
+
+ \title Adding an Accelerated Graphics Driver to Qt for Embedded Linux
+ \ingroup qt-embedded-linux
+
+ In \l{Qt for Embedded Linux}, painting is a pure software implementation
+ normally performed in two steps. First, each window is rendered
+ onto a QWSWindowSurface using QPaintEngine. Second, the server
+ composes the surface images and copies the composition to the
+ screen (see \l{Qt for Embedded Linux Architecture} for details).
+ \l{Qt for Embedded Linux} uses QRasterPaintEngine (a raster-based implementation of
+ QPaintEngine) to implement painting operations, and uses QScreen
+ to implement window composition.
+
+ It is possible to add an accelerated graphics driver to take
+ advantage of available hardware resources. This is described in
+ detail in the \l {Accelerated Graphics Driver Example} which uses
+ the following approach:
+
+ \tableofcontents
+
+ \warning This feature is under development and is subject to
+ change.
+
+ \section1 Step 1: Create a Custom Screen
+
+ Create a custom screen by deriving from the QScreen class.
+
+ The \l {QScreen::}{connect()}, \l {QScreen::}{disconnect()}, \l
+ {QScreen::}{initDevice()} and \l {QScreen::}{shutdownDevice()}
+ functions are declared as pure virtual functions in QScreen and
+ must be implemented. These functions are used to configure the
+ hardware, or query its configuration. The \l
+ {QScreen::}{connect()} and \l {QScreen::}{disconnect()} are called
+ by both the server and client processes, while the \l
+ {QScreen::}{initDevice()} and \l {QScreen::}{shutdownDevice()}
+ functions are only called by the server process.
+
+ You might want to accelerate the final copying to the screen by
+ reimplementing the \l {QScreen::}{blit()} and \l
+ {QScreen::}{solidFill()} functions.
+
+ \section1 Step 2: Implement a Custom Raster Paint Engine
+
+ Implement the painting operations by subclassing the
+ QRasterPaintEngine class.
+
+ To accelerate a graphics primitive, simply reimplement the
+ corresponding function in your custom paint engine. If there is
+ functionality you do not want to reimplement (such as certain
+ pens, brushes, modes, etc.), you can just call the corresponding
+ base class implementation.
+
+ \section1 Step 3: Make the Paint Device Aware of Your Paint Engine
+
+ To activate your paint engine you must create a subclass of the
+ QCustomRasterPaintDevice class and reimplement its \l
+ {QCustomRasterPaintDevice::}{paintEngine()} function. Let this
+ function return a pointer to your paint engine. In addition, the
+ QCustomRasterPaintDevice::memory() function must be reimplemented
+ to return a pointer to the buffer where the painting should be
+ done.
+
+ \table
+ \header \o Acceleration Without a Memory Buffer
+ \row
+ \o
+
+ By default the QRasterPaintEngine draws into a memory buffer (this can
+ be local memory, shared memory or graphics memory mapped into
+ application memory).
+ In some cases you might want to avoid using a memory buffer directly,
+ e.g if you want to use an accelerated graphic controller to handle all
+ the buffer manipulation. This can be implemented by reimplementing
+ the QCustomRasterPaintDevice::memory() function to return 0 (meaning
+ no buffer available). Then, whenever a color or image buffer normally
+ would be written into paint engine buffer, the paint engine will call the
+ QRasterPaintEngine::drawColorSpans() and
+ QRasterPaintEngine::drawBufferSpan() functions instead.
+
+ Note that the default implementations of these functions only
+ calls qFatal() with an error message; reimplement the functions
+ and let them do the appropriate communication with the accelerated
+ graphics controller.
+
+ \endtable
+
+ \section1 Step 4: Make the Window Surface Aware of Your Paint Device
+
+ Derive from the QWSWindowSurface class and reimplement its \l
+ {QWSWindowSurface::}{paintDevice()} function. Make this function
+ return a pointer to your custom raster paint device.
+
+ \section1 Step 5: Enable Creation of an Instance of Your Window Surface
+
+ Finally, reimplement QScreen's \l {QScreen::}{createSurface()}
+ function and make this function able to create an instance of your
+ QWSWindowSurface subclass.
+*/
diff --git a/doc/src/emb-charinput.qdoc b/doc/src/emb-charinput.qdoc
new file mode 100644
index 0000000..e38ebe3
--- /dev/null
+++ b/doc/src/emb-charinput.qdoc
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-charinput.html
+
+ \title Qt for Embedded Linux Character Input
+ \ingroup qt-embedded-linux
+
+ When running a \l {Qt for Embedded Linux} application, it either runs as a
+ server or connects to an existing server. The keyboard driver is
+ loaded by the server application when it starts running, using
+ Qt's \l {How to Create Qt Plugins}{plugin system}.
+
+ Internally in the client/server protocol, all system generated
+ events, including key events, are passed to the server application
+ which then propagates the event to the appropriate client. Note
+ that key events do not always come from a keyboard device, they
+ can can also be generated by the server process using input
+ widgets.
+
+ \table
+ \header \o Input Widgets
+ \row
+ \o
+
+ The server process may call the static QWSServer::sendKeyEvent()
+ function at any time. Typically, this is done by popping up a
+ widget that enables the user specify characters with the pointer
+ device.
+
+ Note that the key input widget should not take focus since the
+ server would then just send the key events back to the input
+ widget. One way to make sure that the input widget never takes
+ focus is to set the Qt::Tool widget flag in the QWidget
+ constructor.
+
+ The \l{Qt Extended} environment contains various input widgets such as
+ Handwriting Recognition and Virtual Keyboard.
+
+ \endtable
+
+ \tableofcontents
+
+ \section1 Available Keyboard Drivers
+
+ \l {Qt for Embedded Linux} provides ready-made drivers for the SL5000, Yopy,
+ Vr41XX, console (TTY) and USB protocols. Run the \c configure
+ script to list the available drivers:
+
+ \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 0
+
+ Note that the console keyboard driver also handles console
+ switching (\bold{Ctrl+Alt+F1}, ..., \bold{Ctrl+Alt+F10}) and
+ termination (\bold{Ctrl+Alt+Backspace}).
+
+ In the default Qt configuration, only the "TTY" driver is
+ enabled. The various drivers can be enabled and disabled using the
+ \c configure script. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 1
+
+ Custom keyboard drivers can be implemented by subclassing the
+ QWSKeyboardHandler class and creating a keyboard driver plugin
+ (derived from the QKbdDriverPlugin class). The default
+ implementation of the QKbdDriverFactory class will automatically
+ detect the plugin, loading the driver into the server application
+ at run-time.
+
+ \section1 Specifying a Keyboard Driver
+
+ To specify which driver to use, set the QWS_KEYBOARD environment
+ variable. For example (if the current shell is bash, ksh, zsh or
+ sh):
+
+ \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 2
+
+ The \c <driver> argument are \c SL5000, \c Yopy, \c VR41xx, \c
+ TTY, \c USB and \l {QKbdDriverPlugin::keys()}{keys} identifying
+ custom drivers, and the driver specific options are typically a
+ device, e.g., \c /dev/tty0.
+
+ Multiple keyboard drivers can be specified in one go:
+
+ \snippet doc/src/snippets/code/doc_src_emb-charinput.qdoc 3
+
+ Input will be read from all specified drivers.
+*/
diff --git a/doc/src/emb-crosscompiling.qdoc b/doc/src/emb-crosscompiling.qdoc
new file mode 100644
index 0000000..54e65c5
--- /dev/null
+++ b/doc/src/emb-crosscompiling.qdoc
@@ -0,0 +1,191 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-crosscompiling.html
+
+ \title Cross-Compiling Qt for Embedded Linux Applications
+ \ingroup qt-embedded-linux
+
+ Cross-compiling is the process of compiling an application on one
+ machine, producing executable code for a different machine or
+ device. To cross-compile a \l{Qt for Embedded Linux} application,
+ use the following approach:
+
+ \tableofcontents
+
+ \note The cross-compiling procedure has the configuration
+ process in common with the installation procedure; i.e., you might
+ not necessarily have to perform all the mentioned actions
+ depending on your current configuration.
+
+ \section1 Step 1: Set the Cross-Compiler's Path
+
+ Specify which cross-compiler to use by setting the \c PATH
+ environment variable. For example, if the current shell is bash,
+ ksh, zsh or sh:
+
+ \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 0
+
+ \section1 Step 2: Create a Target Specific qmake Specification
+
+ The qmake tool requires a platform and compiler specific \c
+ qmake.conf file describing the various default values, to generate
+ the appropriate Makefiles. The standard \l{Qt for Embedded Linux}
+ distribution provides such files for several combinations of
+ platforms and compilers. These files are located in the
+ distribution's \c mkspecs/qws subdirectory.
+
+ Each platform has a default specification. \l{Qt for Embedded Linux} will
+ use the default specification for the current platform unless told
+ otherwise. To override this behavior, you can use the \c configure
+ script's \c -platform option to change the specification for the host
+ platform (where compilation will take place).
+
+ The \c configure script's \c -xplatform option is used to provide a
+ specification for the target architecture (where the library will be
+ deployed).
+
+ For example, to cross-compile an application to run on a device with
+ an ARM architecture, using the GCC toolchain, run the configure
+ script at the command line in the following way:
+
+ \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 1
+
+ If neither of the provided specifications fits your target device,
+ you can create your own. To create a custom \c qmake.conf file,
+ just copy and customize an already existing file. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 2
+
+ \note When defining a mkspec for a Linux target, the directory must
+ be prefixed with "linux-". We recommend that you copy the entire
+ directory.
+
+ Note also that when providing you own qmake specifcation, you must
+ use the \c configure script's \c -xplatform option to make
+ \l{Qt for Embedded Linux} aware of the custom \c qmake.conf file.
+
+ \section1 Step 3: Provide Architecture Specific Files
+
+ Starting with Qt 4, all of Qt's implicitly shared classes can
+ safely be copied across threads like any other value classes,
+ i.e., they are fully reentrant. This is accomplished by
+ implementing reference counting operations using atomic hardware
+ instructions on all the different platforms supported by Qt.
+
+ To support a new architecture, it is important to ensure that
+ these platform-specific atomic operations are implemented in a
+ corresponding header file (\c qatomic_ARCH.h), and that this file
+ is located in Qt's \c src/corelib/arch directory. For example, the
+ Intel 80386 implementation is located in \c
+ src/corelib/arch/qatomic_i386.h.
+
+ See the \l {Implementing Atomic Operations} documentation for
+ details.
+
+ \section1 Step 4: Provide Hardware Drivers
+
+ Without the proper mouse and keyboard drivers, you will not be
+ able to give any input to your application when it is installed on
+ the target device. You must also ensure that the appropriate
+ screen driver is present to make the server process able to put
+ the application's widgets on screen.
+
+ \l{Qt for Embedded Linux} provides several ready-made mouse, keyboard and
+ screen drivers, see the \l{Qt for Embedded Linux Pointer Handling}{pointer
+ handling}, \l{Qt for Embedded Linux Character Input}{character input} and
+ \l{Qt for Embedded Linux Display Management}{display management}
+ documentation for details.
+
+ In addition, custom drivers can be added by deriving from the
+ QWSMouseHandler, QWSKeyboardHandler and QScreen classes
+ respectively, and by creating corresponding plugins to make use of
+ Qt's plugin mechanism (dynamically loading the drivers into the
+ server application at runtime). Note that the plugins must be
+ located in a location where Qt will look for plugins, e.g., the
+ standard \c plugin directory.
+
+ See the \l {How to Create Qt Plugins} documentation and the \l
+ {tools/plugandpaint}{Plug & Paint} example for details.
+
+ \section1 Step 5: Build the Target Specific Executable
+
+ Before building the executable, you must specify the target
+ architecture as well as the target specific hardware drivers by
+ running the \c configure script:
+
+ \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 3
+
+ It is also important to make sure that all the third party
+ libraries that the application and the Qt libraries require, are
+ present in the tool chain. In particular, if the zlib and jpeg
+ libraries are not available, they must be included by running the
+ \c configure script with the \c -L and \c -I options. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 4
+
+ The JPEG source can be downloaded from \l http://www.ijg.org/. The
+ \l{Qt for Embedded Linux} distribution includes a version of the zlib source
+ that can be compiled into the Qt for Embedded Linux library. If integrators
+ wish to use a later version of the zlib library, it can be
+ downloaded from the \l http://www.gzip.org/zlib/ website.
+
+ Then build the executable:
+
+ \snippet doc/src/snippets/code/doc_src_emb-crosscompiling.qdoc 5
+
+ That's all. Your target specific executable is ready for deployment.
+
+ \table 100%
+ \row
+ \o \bold {See also:}
+
+ \l{Qt for Embedded Linux Architecture} and \l{Deploying Qt for Embedded Linux
+ Applications}.
+
+ \row
+ \o \bold{Third party resources:}
+
+ \l{http://silmor.de/29}{Cross compiling Qt/Win Apps on Linux} covers the
+ process of cross-compiling Windows applications on Linux.
+ \endtable
+*/
diff --git a/doc/src/emb-deployment.qdoc b/doc/src/emb-deployment.qdoc
new file mode 100644
index 0000000..2c1ff00
--- /dev/null
+++ b/doc/src/emb-deployment.qdoc
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-deployment.html
+
+ \title Deploying Qt for Embedded Linux Applications
+ \ingroup qt-embedded-linux
+
+ The procedure of deploying an Qt application on \l{Qt for Embedded Linux}
+ is essentially the same as the deployment procedure on X11 platforms
+ which is described in detail in the \l {Deploying an Application
+ on X11 Platforms} documentation. See also the \l {Deploying Qt
+ applications}{general remarks} about deploying Qt applications.
+
+ In addition, there is a couple of Qt for Embedded Linux specific issues to
+ keep in mind:
+
+ \tableofcontents
+
+ \section1 Fonts
+
+ When Qt for Embedded Linux applications run, they look for a file called
+ \c fontdir in Qt's \c /lib/fonts/ directory defining the
+ fonts that are available to the application (i.e. the fonts
+ located in the mentioned directory).
+
+ For that reason, the preferred fonts must be copied to the \c
+ /lib/fonts/ directory, and the \c fontdir file must be customized
+ accordingly. See the \l {Qt for Embedded Linux Fonts}{fonts} documentation
+ for more details about the supported font formats.
+
+ Note that the application will look for the \c /lib/fonts/
+ directory relative to the path set using the \c -prefix parameter
+ when running the \c configure script; ensure that this is a
+ sensible path in the target device environment. See the \l
+ {Installing Qt for Embedded Linux#Step 3: Building the
+ Library}{installation} documentation for more details.
+
+ \section1 Environment Variables
+
+ In general, any variable value that differs from the provided
+ default values must be set explicitly in the target device
+ environment. Typically, these include the QWS_MOUSE_PROTO,
+ QWS_KEYBOARD and QWS_DISPLAY variables specifying the drivers for
+ pointer handling, character input and display management,
+ respectively.
+
+ For example, without the proper mouse and keyboard drivers, there
+ is no way to give any input to the application when it is
+ installed on the target device. By running the \c configure script
+ using the \c -qt-kbd-<keyboarddriver> and \c
+ -qt-mouse-<mousedriver> options, the drivers are enabled, but in
+ addition the drivers and the preferred devices must be specified
+ as the ones to use in the target environment, by setting the
+ environment variables.
+
+ See the \l{Qt for Embedded Linux Pointer Handling}{pointer handling},
+ \l{Qt for Embedded Linux Character Input}{character input} and
+ \l{Qt for Embedded Linux Display Management}{display management}
+ documentation for more information.
+
+ \section1 Framebuffer Support
+
+ No particular actions are required to enable the framebuffer on
+ target devices: The Linux framebuffer is enabled by default on all
+ modern Linux distributions. For information on older versions, see
+ \l http://en.tldp.org/HOWTO/Framebuffer-HOWTO.html.
+
+ To test that the Linux framebuffer is set up correctly, and that
+ the device permissions are correct, use the program provided by
+ the \l {Testing the Linux Framebuffer} document.
+*/
diff --git a/doc/src/emb-differences.qdoc b/doc/src/emb-differences.qdoc
new file mode 100644
index 0000000..b6fb631
--- /dev/null
+++ b/doc/src/emb-differences.qdoc
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-differences.html
+
+ \title Porting Qt Applications to Qt for Embedded Linux
+ \ingroup porting
+ \ingroup qt-embedded-linux
+
+ Existing Qt applications should require no porting provided there is no
+ platform dependent code.
+
+ \table 100%
+ \header \o Platform Dependent Code
+
+ \row
+ \o
+ Platform dependent code includes system calls, calls to the
+ underlying window system (Windows or X11), and Qt platform
+ specific methods such as QApplication::x11EventFilter().
+
+ For cases where it is necessary to use platform dependent code
+ there are macros defined that can be used to enable and disable
+ code for each platform using \c #ifdef directives:
+
+ \list
+ \o Qt for Embedded Linux: Q_WS_QWS
+ \o Qt for Mac OS X: Q_WS_MAC
+ \o Qt for Windows: Q_WS_WIN
+ \o Qt for X11: Q_WS_X11
+ \endlist
+ \endtable
+*/
diff --git a/doc/src/emb-envvars.qdoc b/doc/src/emb-envvars.qdoc
new file mode 100644
index 0000000..b06c132
--- /dev/null
+++ b/doc/src/emb-envvars.qdoc
@@ -0,0 +1,168 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-envvars.html
+
+ \title Qt for Embedded Linux Environment Variables
+ \ingroup qt-embedded-linux
+
+ These environment variables are relevant to \l{Qt for Embedded Linux}
+ users.
+
+ \table
+ \header \o Variable \o Description
+
+ \row
+ \o \bold POINTERCAL_FILE \target POINTERCAL_FILE
+
+ \o Specifies the file containing the data used to calibrate the
+ pointer device.
+
+ See also QWSCalibratedMouseHandler and \l{Qt for Embedded Linux Pointer
+ Handling}.
+
+ \row
+ \o \bold QT_ONSCREEN_PAINT \target QT_ONSCREEN_PAINT
+
+ \o If defined, the application will render its widgets directly on
+ screen. The affected regions of the screen will not be modified by
+ the screen driver unless another window with a higher focus
+ requests (parts of) the same region.
+
+ Setting this environment variable is equivalent to setting the
+ Qt::WA_PaintOnScreen attribute for all the widgets in the
+ application.
+
+ See also the Qt for Embedded Linux \l{Qt for Embedded Linux Architecture#Graphics
+ Rendering}{graphics rendering} documentation.
+
+ \row
+ \o \bold QWS_SW_CURSOR \target QWS_SW_CURSOR
+ \o If defined, the software mouse cursor is always used (even when using an
+ accelerated driver that supports a hardware cursor).
+
+ \row
+ \o \bold QWS_DISPLAY \target QWS_DISPLAY
+ \o
+
+ Specifies the display type and framebuffer. For example, if the
+ current shell is bash, ksh, zsh or sh:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 0
+
+ The valid values for the \c <driver> argument are \c LinuxFb, \c
+ QVFb, \c VNC, \c Transformed, \c Multi and \l
+ {QScreenDriverPlugin::keys()}{keys} identifying custom drivers,
+ and the \c {<display num>} argument is used to separate screens
+ that are using the same screen driver and to enable multiple
+ displays (see the \l {Running Qt for Embedded Linux Applications}
+ documentation for more details).
+
+ The driver specific options are described in the \l{Qt for Embedded Linux
+ Display Management}{display management} documentation.
+
+ \row
+ \o \bold QWS_SIZE \target QWS_SIZE
+ \o
+
+ Specifies the size of the \l{Qt for Embedded Linux} window which is centered
+ within the screen. For example, if the current shell is bash, ksh,
+ zsh or sh:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 1
+
+ \row
+ \o \bold QWS_MOUSE_PROTO \target QWS_MOUSE_PROTO
+ \o
+
+ Specifies the driver for pointer handling. For example, if the
+ current shell is bash, ksh, zsh or sh:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 2
+
+ The valid values for the \c <driver> argument are \c MouseMan, \c
+ IntelliMouse, \c Microsoft, \c VR41xx, \c LinuxTP, \c Yopy. \c
+ Tslib and \l {QMouseDriverPlugin::keys()}{keys} identifying
+ custom drivers, and the driver specific options are typically a
+ device, e.g., \c /dev/mouse for mouse devices and \c /dev/ts for
+ touch panels.
+
+ Multiple keyboard drivers can be specified in one go:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 3
+
+ Input will be read from all specified drivers.
+ Note that the \c Vr41xx driver also accepts two optional
+ arguments: \c press=<value> defining a mouseclick (the default
+ value is 750) and \c filter=<value> specifying the length of the
+ filter used to eliminate noise (the default length is 3). For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 4
+
+ See also \l {Qt for Embedded Linux Pointer Handling}.
+
+ \row
+ \o \bold QWS_KEYBOARD \target QWS_KEYBOARD
+ \o
+
+ Specifies the driver and device for character input. For example, if the
+ current shell is bash, ksh, zsh or sh:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 5
+
+ The valid values for the \c <driver> argument are \c SL5000, \c
+ Yopy, \c VR41xx, \c TTY, \c USB and \l
+ {QKbdDriverPlugin::keys()}{keys} identifying custom drivers,
+ and the driver specific options are typically a device, e.g., \c
+ /dev/tty0.
+
+ Multiple keyboard drivers can be specified in one go:
+
+ \snippet doc/src/snippets/code/doc_src_emb-envvars.qdoc 6
+
+ Input will be read from all specified drivers.
+
+ See also \l {Qt for Embedded Linux Character Input}.
+
+ \endtable
+*/
diff --git a/doc/src/emb-features.qdoc b/doc/src/emb-features.qdoc
new file mode 100644
index 0000000..67f92a5
--- /dev/null
+++ b/doc/src/emb-features.qdoc
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page fine-tuning-features.html
+ \title Fine-Tuning Features in Qt
+ \ingroup qtce
+ \ingroup qt-embedded-linux
+ \brief Describes how to reduce the size of Qt libraries by selecting only
+ the features that are needed.
+
+ In many cases, only a fixed set of applications are deployed on an
+ embedded device, making it possible to save resources by minimizing
+ the size of the associated libraries. The Qt installation can easily
+ be optimized by avoiding to compile in the features that are not
+ required.
+
+ \tableofcontents
+
+ A wide range of features are defined, covering classes and technologies
+ provided by several of Qt's modules.
+ You can look up the different feature definitions in the
+ \c{src/corelib/global/qfeatures.txt} file within the Qt source
+ distribution.
+
+ \section1 Simple Customization
+
+ \section2 Embedded Linux
+
+ To disable a particular feature, just run the \c configure script
+ for Qt for Embedded Linux with the \c -no-feature-<feature> option.
+ For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-features.qdoc 1
+
+ The feature can easily be enabled again by running \c configure
+ with the \c -feature-<feature> option.
+
+ See also \l{Qt Performance Tuning}.
+
+ \section2 Windows CE
+
+ To disable a particular feature, just run the \c configure script
+ with the set of required \c -D<feature> options. For example,
+ you can use the \c -D option to define \c{QT_NO_THREAD}:
+
+ \snippet doc/src/snippets/code/doc_src_emb-features.qdoc 0
+
+ The \c -D option only creates a Qt internal define. If you get linker
+ errors you have to define \c QT_NO_THREAD also for your project.
+ You can do this by adding \c DEFINES += \c QT_NO_THREAD to your
+ \c .pro file.
+
+ See also \l{Qt Performance Tuning}.
+
+ \section1 Managing Large Numbers of Features
+
+ If you want to disable a lot of features, it is more comfortable
+ to use the \c qconfig tool.
+ You can disable a \e set of features by creating a custom
+ configuration file that defines the preferred subset of Qt's
+ functionality. Such a file uses macros to disable the unwanted
+ features, and can be created manually or by using the \c qconfig
+ tool located in the \c{tools/qconfig} directory of the Qt source
+ distribution.
+
+ \note The \c qconfig tool is intended to be built against Qt on
+ desktop platforms.
+
+ \bold{Windows CE:} The Qt for Windows CE package contains a \c qconfig
+ executable that you can run on a Windows desktop to configure the build.
+
+ \image qt-embedded-qconfigtool.png
+
+ The \c qconfig tool's interface displays all of Qt's
+ functionality, and allows the user to both disable and enable
+ features. The user can open and edit any custom configuration file
+ located in the \c{src/corelib/global} directory. When creating a
+ custom configuration file manually, a description of the currently
+ available Qt features can be found in the
+ \c{src/corelib/global/qfeatures.txt} file.
+
+ Note that some features depend on others; disabling any feature
+ will automatically disable all features depending on it. The
+ feature dependencies can be explored using the \c qconfig tool,
+ but they are also described in the \c{src/corelib/global/qfeatures.h}
+ file.
+
+ To be able to apply the custom configuration, it must be saved in
+ a file called \c qconfig-myfile.h in the \c{src/corelib/global}
+ directory. Then use the \c configure tool's \c -qconfig option
+ and pass the configuration's file name without the \c qconfig-
+ prefix and \c .h extension, as argument.
+ The following examples show how this is invoked on each of the
+ embedded platforms for a file called \c{qconfig-myfile.h}:
+
+ \bold{Embedded Linux:}
+
+ \snippet doc/src/snippets/code/doc_src_emb-features.qdoc 3
+
+ \bold{Windows CE:}
+
+ \snippet doc/src/snippets/code/doc_src_emb-features.qdoc 2
+
+ Qt provides several ready-made custom configuration files,
+ defining minimal, small, medium and large installations,
+ respectively. These files are located in the
+ \c{/src/corelib/global} directory in the Qt source distribution.
+*/
diff --git a/doc/src/emb-fonts.qdoc b/doc/src/emb-fonts.qdoc
new file mode 100644
index 0000000..3ed23c3
--- /dev/null
+++ b/doc/src/emb-fonts.qdoc
@@ -0,0 +1,201 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-fonts.html
+
+ \title Qt for Embedded Linux Fonts
+ \ingroup qt-embedded-linux
+
+ \l {Qt for Embedded Linux} uses the
+ \l{http://freetype.sourceforge.net/freetype2/index.html}{FreeType 2}
+ font engine to produce font output. The formats supported depends on
+ the locally installed version of the FreeType library. In addition,
+ \l{Qt for Embedded Linux} supports the Qt Prerendered Font formats (\l QPF and \l QPF2):
+ light-weight non-scalable font formats specific to \l {Qt for Embedded Linux}.
+ QPF2 is the native format of \l{Qt for Embedded Linux}. QPF is the legacy
+ format used by Qt/Embedded 2.x and 3.x. Several of the formats may be rendered
+ using anti-aliasing for improved readability.
+
+ When \l{Qt for Embedded Linux} applications run, they look for fonts in
+ Qt's \c lib/fonts/ directory. \l {Qt for Embedded Linux} will automatically detect
+ prerendered fonts and TrueType fonts. For compatibility, it will also read the
+ legacy \c lib/fonts/fontdir file.
+
+ Support for other font formats can be added, contact
+ \l{mailto:qt-info@nokia.com}{qt-info@nokia.com} for more
+ information.
+
+ \tableofcontents
+
+ \table 100%
+ \row
+ \o
+ \bold {Optimization}
+
+ The \l FreeType, \l QPF2 and \l QPF formats are features that can be
+ disabled using the
+ \l{Fine-Tuning Features in Qt}{feature definition system},
+ reducing the size of Qt and saving resources.
+
+ Note that at least one font format must be defined.
+
+ See the \l {Fine-Tuning Features in Qt} documentation for
+ details.
+
+ \o
+ \inlineimage qt-embedded-fontfeatures.png
+ \endtable
+
+ All supported fonts use the Unicode character encoding. Most fonts
+ available today do, but they usually don't contain \e all the
+ Unicode characters. A complete 16-point Unicode font uses over 1
+ MB of memory.
+
+ \target FreeType
+ \section1 FreeType Formats
+
+ The \l {http://freetype.sourceforge.net/freetype2/index.html}{FreeType 2}
+ library (and therefore \l{Qt for Embedded Linux}) can support the following font formats:
+
+ \list
+ \o TrueType (TTF)
+ \o PostScript Type1 (PFA/PFB)
+ \o Bitmap Distribution Format (BDF)
+ \o CID-keyed Type1
+ \o Compact Font Format (CFF)
+ \o OpenType fonts
+ \o SFNT-based bitmap fonts
+ \o Portable Compiled Format (PCF)
+ \o Microsoft Windows Font File Format (Windows FNT)
+ \o Portable Font Resource (PFR)
+ \o Type 42 (limited support)
+ \endlist
+
+ It is possible to add modules to the \l
+ {http://freetype.sourceforge.net/freetype2/index.html}{FreeType 2}
+ font engine to support other types of font files. For more
+ information, see the font engine's own website: \l
+ http://freetype.sourceforge.net/freetype2/index.html.
+
+ Glyphs rendered using FreeType are shared efficiently between applications,
+ reducing memory requirements and speeding up text rendering.
+
+ \omit
+ \l {Qt for Embedded Linux} will by default use the system FreeType library if it exists.
+ Otherwise it will use a copy of the FreeType library in Qt, which by default only
+ supports TrueType fonts to reduce footprint.
+ \endomit
+
+ \target QPF2
+ \section1 Qt Prerendered Font (QPF2)
+
+ The Qt Prerendered Font (QPF2) is an architecture-independent,
+ light-weight and non-scalable font format specific to \l{Qt for Embedded Linux}.
+
+ Nokia provides the cross-platform \c makeqpf tool, included in the
+ \c tools directory of both \l {Qt} and \l{Qt for Embedded Linux}, which allows
+ generation of QPF2 files from system fonts.
+
+ QPF2 supports anti-aliasing and complex writing systems, using information
+ from the corresponding TrueType font, if present on the system. The format
+ is designed to be mapped directly to memory. The same format is used to
+ share glyphs from non-prerendered fonts between applications.
+
+ \target QPF
+ \section1 Legacy Qt Prerendered Font (QPF)
+
+ Nokia provides support for the legacy QPF format for compatibility
+ reasons. QPF is based on the internal font engine data structure of Qt/Embedded
+ versions 2 and 3.
+
+ Note that the file name describes the font, for example \c helvetica_120_50.qpf
+ is 12 point Helvetica while \c helvetica_120_50i.qpf is 12 point Helvetica \e italic.
+
+ \omit
+ \section1 Memory Requirements
+
+ Taking advantage of the way the QPF format is structured, Qt for
+ Embedded Linux memory-maps the data rather than reading and parsing it.
+ This reduces RAM consumption even further.
+
+ Scalable fonts use a larger amount of memory per font, but
+ these fonts provide a memory saving if many different sizes of each
+ font are needed.
+ \endomit
+
+ \section1 The Legacy \c fontdir File
+
+ For compatibility reasons \l{Qt for Embedded Linux} supports the \c fontdir
+ file, if present. The file defines additional fonts available to the
+ application, and has the following format:
+
+ \snippet doc/src/snippets/code/doc_src_emb-fonts.qdoc 0
+
+ \table 100%
+ \header \o Field \o Description
+ \row \o \bold name
+ \o The name of the font format, e.g.,\c Helvetica, \c Times, etc.
+ \row \o \bold file
+ \o The name of the file containing the font, e.g., \c
+ helvR0810.bdf, \c verdana.ttf, etc.
+ \row \o \bold renderer
+ \o Specifies the font engine that should be used to render the
+ font, currently only the FreeType font engine (\c FT) is
+ supported.
+ \row \o \bold italic
+ \o Specifies whether the font is italic or not; the accepted
+ values are \c y or \c n.
+ \row \o \bold weight
+ \o Specifies the font's weight: \c 50 is normal, \c 75 is bold,
+ etc.
+ \row \o \bold size
+ \o Specifies the font size, i.e., point size * 10. For example, a
+ value of 120 means 12pt. A value of 0 means that the font is
+ scalable.
+ \row \o \bold flags
+ \o The following flag is supported:
+ \list
+ \o \c s: smooth (anti-aliased)
+ \endlist
+ All other flags are ignored.
+ \endtable
+*/
diff --git a/doc/src/emb-framebuffer-howto.qdoc b/doc/src/emb-framebuffer-howto.qdoc
new file mode 100644
index 0000000..fc86dd9
--- /dev/null
+++ b/doc/src/emb-framebuffer-howto.qdoc
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-testingframebuffer.html
+
+ \title Testing the Linux Framebuffer
+ \subtitle for Qt for Embedded Linux
+ \ingroup qt-embedded-linux
+
+ To test that the Linux framebuffer is set up correctly, and that
+ the device permissions are correct, use the program found in
+ \c examples/qws/framebuffer which opens the frame buffer and draws
+ three squares of different colors.
+*/
diff --git a/doc/src/emb-install.qdoc b/doc/src/emb-install.qdoc
new file mode 100644
index 0000000..11b3f03
--- /dev/null
+++ b/doc/src/emb-install.qdoc
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-install.html
+
+ \title Installing Qt for Embedded Linux
+ \ingroup qt-embedded-linux
+ \ingroup installation
+ \brief How to install Qt for Embedded Linux.
+
+ This document describes how to install \l{Qt for Embedded Linux} in your
+ development environment:
+
+ \tableofcontents
+
+ Please see the \l{Cross-Compiling Qt for Embedded Linux Applications}{cross
+ compiling} and \l{Deploying Qt for Embedded Linux Applications}{deployment}
+ documentation for details on how to install \l{Qt for Embedded Linux} on
+ your target device.
+
+ Note also that this installation procedure is written for Linux,
+ and that it may need to be modified for other platforms.
+
+ \section1 Step 1: Installing the License File (commercial editions only)
+
+ If you have the commercial edition of \l{Qt for Embedded Linux}, the first step
+ is to install your license file as \c $HOME/.qt-license.
+
+ For the open source version you do not need a license file.
+
+ \section1 Step 2: Unpacking the Archive
+
+ First uncompress the archive in the preferred location, then
+ unpack it:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 0
+
+ This document assumes that the archive is unpacked in the
+ following directory:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 1
+
+ \section1 Step 3: Building the Library
+
+ Before building the \l{Qt for Embedded Linux} library, run the \c
+ ./configure script to configure the library for your development
+ architecture. You can list all of the configuration system's
+ options by typing \c {./configure -help}.
+
+ Note that by default, \l{Qt for Embedded Linux} is configured for
+ installation in the \c{/usr/local/Trolltech/QtEmbedded-%VERSION%}
+ directory, but this can be changed by using the \c{-prefix}
+ option. Alternatively, the \c{-prefix-install} option can be used
+ to specify a "local" installation within the source directory.
+
+ The configuration system is also designed to allow you to specify
+ your platform architecture:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 2
+
+ In general, all Linux systems which have framebuffer support can
+ use the \c generic architecture. Other typical architectures are
+ \c x86, \c arm and \c mips.
+
+ \note If you want to build Qt for Embedded Linux for use with a virtual
+ framebuffer, pass the \c{-qvfb} option to the \c configure
+ script.
+
+ To create the library and compile all the demos, examples, tools,
+ and tutorials, type:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 3
+
+ On some systems the \c make utility is named differently, e.g. \c
+ gmake. The \c configure script tells you which \c make utility to
+ use.
+
+ If you did not configure \l{Qt for Embedded Linux} using the \c{-prefix-install}
+ option, you need to install the library, demos, examples, tools,
+ and tutorials in the appropriate place. To do this, type:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 4
+
+ and enter the root password.
+
+ \note You can use the \c INSTALL_ROOT environment variable to specify
+ the location of the installed files when invoking \c{make install}.
+
+ \section1 Step 4: Adjusting the Environment Variables
+
+ In order to use \l{Qt for Embedded Linux}, the \c PATH variable must be extended
+ to locate \c qmake, \c moc and other \l{Qt for Embedded Linux} tools, and the \c
+ LD_LIBRARY_PATH must be extended for compilers that do not support
+ \c rpath.
+
+ To set the \c PATH variable, add the following lines to your \c
+ .profile file if your shell is bash, ksh, zsh or sh:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 5
+
+ In case your shell is csh or tcsh, add the following line to the
+ \c .login file instead:
+
+ \snippet doc/src/snippets/code/doc_src_emb-install.qdoc 6
+
+ If you use a different shell, please modify your environment
+ variables accordingly.
+
+ For compilers that do not support \c rpath you must also extend
+ the \c LD_LIBRARY_PATH environment variable to include
+ \c /usr/local/Trolltech/QtEmbedded-%VERSION%/lib. Note that on Linux
+ with GCC, this step is not needed.
+
+ \section1 Step 5: Building the Virtual Framebuffer
+
+ For development and debugging, \l{Qt for Embedded Linux} provides a virtual
+ framebuffer as well as the option of running \l{Qt for Embedded Linux} as a VNC
+ server. For a description of how to install the virtual
+ framebuffer and how to use the VNC protocol, please consult the
+ documentation at:
+
+ \list
+ \o \l {The Virtual Framebuffer}
+ \o \l {The VNC Protocol and Qt for Embedded Linux}
+ \endlist
+
+ Note that the virtual framebuffer requires a Qt for X11
+ installation. See \l {Installing Qt on X11 Platforms} for details.
+
+ The Linux framebuffer, on the other hand, is enabled by default on
+ all modern Linux distributions. For information on older versions,
+ see \l http://en.tldp.org/HOWTO/Framebuffer-HOWTO.html. To test
+ that the Linux framebuffer is set up correctly, use the program
+ provided by the \l {Testing the Linux Framebuffer} document.
+
+ That's all. \l{Qt for Embedded Linux} is now installed.
+
+ \table 100%
+ \row
+ \o
+ \bold {Customizing the Qt for Embedded Linux Library}
+
+ When building embedded applications on low-powered devices,
+ reducing the memory and CPU requirements is important.
+
+ A number of options tuning the library's performance are
+ available. But the most direct way of saving resources is to
+ fine-tune the set of Qt features that is compiled. It is also
+ possible to make use of accelerated graphics hardware.
+
+ \list
+ \o \l {Fine-Tuning Features in Qt}
+ \o \l {Qt Performance Tuning}
+ \o \l {Adding an Accelerated Graphics Driver to Qt for Embedded Linux}
+ \endlist
+
+ \endtable
+*/
diff --git a/doc/src/emb-makeqpf.qdoc b/doc/src/emb-makeqpf.qdoc
new file mode 100644
index 0000000..ca33eda
--- /dev/null
+++ b/doc/src/emb-makeqpf.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-makeqpf.html
+ \title makeqpf
+ \ingroup qt-embedded-linux
+
+ \c makeqpf is not part of Qt 4. However, Qt 4 can still read QPF
+ files generated by Qt 2 or 3. To generate QPF files, use makeqpf from Qt 2
+ or 3.
+*/
diff --git a/doc/src/emb-performance.qdoc b/doc/src/emb-performance.qdoc
new file mode 100644
index 0000000..79edf34
--- /dev/null
+++ b/doc/src/emb-performance.qdoc
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-performance.html
+ \title Qt Performance Tuning
+ \ingroup qtce
+ \ingroup qt-embedded-linux
+ \brief Ways to improve performance on embedded platforms.
+
+ When building embedded applications on low-powered devices,
+ \l{Qt for Windows CE} and \l{Qt for Embedded Linux} provide
+ a number of options that reduce the memory and/or CPU requirements
+ by making various trade-offs. These options range from variations
+ in programming style, to linking and memory allocation.
+
+ Note that the most direct way of saving resources, is to avoid compiling
+ in features that are not required. See the \l{Fine-Tuning Features in Qt}
+ {fine tuning features} documentation for details.
+
+ \tableofcontents
+
+ \section1 Programming Style
+
+ Rather than creating dialogs and widgets every time they are
+ needed, and delete them when they are no longer required, create
+ them once and use the QWidget::hide() and QWidget::show()
+ functions whenever appropriate. To avoid a slow startup of the
+ application, delay the creation of dialogs and widgets until they
+ are requested. All this will improve the CPU performance, it
+ requires a little more memory, but will be much faster.
+
+ \section1 Static vs. Dynamic Linking
+
+ A lot of CPU and memory is used by the ELF (Executable and Linking
+ Format) linking process. Significant savings can be achieved by
+ using a static build of the application suite; rather than having
+ a collection of executables which link dynamically to Qt's
+ libraries, all the applications is built into into a single
+ executable which is statically linked to Qt's libraries.
+
+ This improves the start-up time and reduces memory usage at the
+ expense of flexibility (to add a new application, you must
+ recompile the single executable) and robustness (if one
+ application has a bug, it might harm other applications).
+
+ \table 100%
+ \row
+ \o \bold {Creating a Static Build}
+
+ To compile Qt as a static library, use the \c -static option when
+ running configure:
+
+ \snippet doc/src/snippets/code/doc_src_emb-performance.qdoc 0
+
+ To build the application suite as an all-in-one application,
+ design each application as a stand-alone widget (or set of
+ widgets) with only minimal code in the \c main() function. Then,
+ write an application that provides a means of switching between
+ the applications. The \l Qt Extended platform is an example using this
+ approach: It can be built either as a set of dynamically linked
+ executables, or as a single static application.
+
+ Note that the application still should link dynamically against
+ the standard C library and any other libraries which might be used
+ by other applications on the target device.
+
+ \endtable
+
+ When installing end-user applications, this approach may not be an
+ option, but when building a single application suite for a device
+ with limited CPU power and memory, this option could be very
+ beneficial.
+
+ \section1 Alternative Memory Allocation
+
+ The libraries shipped with some C++ compilers on some platforms
+ have poor performance in the built-in "new" and "delete"
+ operators. Improved memory allocation and performance may be
+ gained by re-implementing these functions:
+
+ \snippet doc/src/snippets/code/doc_src_emb-performance.qdoc 1
+
+ The example above shows the necessary code to switch to the plain
+ C memory allocators.
+
+ \section1 Bypassing the Backing Store
+
+ When rendering, Qt uses the concept of a backing store; i.e., a
+ paint buffer, to reduce flicker and to support graphics operations
+ such as blending.
+
+ The default behavior is for each client to render
+ its widgets into memory while the server is responsible for
+ putting the contents of the memory onto the screen. But when the
+ hardware is known and well defined, as is often the case with
+ software for embedded devices, it might be useful to bypass the
+ backing store, allowing the clients to manipulate the underlying
+ hardware directly.
+ \if defined(qtce)
+ This is achieved by setting the Qt::WA_PaintOnScreen window attribute
+ for each widget.
+ \else
+
+ There are two approaches to direct painting: The first approach is
+ to set the Qt::WA_PaintOnScreen window attribute for each widget,
+ the other is to use the QDirectPainter class to reserve a region
+ of the framebuffer.
+ For more information, see the
+ \l{Qt for Embedded Linux Architecture#Direct Painting}{direct painting}
+ section of the \l{Qt for Embedded Linux Architecture}{architecture}
+ documentation.
+ \endif
+*/
diff --git a/doc/src/emb-pointer.qdoc b/doc/src/emb-pointer.qdoc
new file mode 100644
index 0000000..d52abfb
--- /dev/null
+++ b/doc/src/emb-pointer.qdoc
@@ -0,0 +1,216 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-pointer.html
+
+ \title Qt for Embedded Linux Pointer Handling
+ \ingroup qt-embedded-linux
+
+ When running a \l{Qt for Embedded Linux} application, it either runs as a
+ server or connects to an existing server. The mouse driver is
+ loaded by the server application when it starts running, using
+ Qt's \l {How to Create Qt Plugins}{plugin system}.
+
+ Internally in the client/server protocol, all system generated
+ events, including pointer events, are passed to the server
+ application which then propagates the event to the appropriate
+ client. Note that pointer handling in \l{Qt for Embedded Linux} works for
+ both mouse and mouse-like devices such as touch panels and
+ trackballs.
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Available Drivers
+
+ \l{Qt for Embedded Linux} provides ready-made drivers for the MouseMan,
+ IntelliMouse, Microsoft, NEC Vr41XX, Linux Touch Panel and Yopy
+ protocols as well as the universal touch screen library,
+ tslib. Run the \c configure script to list the available drivers:
+
+ \if defined(QTOPIA_PHONE)
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 0
+
+ \bold{Note:} By default only the PC mouse driver is enabled.
+
+ The various drivers can be enabled and disabled using the \c
+ configure script. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 1
+
+ \else
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 2
+
+ In the default Qt configuration, only the "pc" mouse driver is
+ enabled. The various drivers can be enabled and disabled using
+ the \c configure script. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 3
+ \endif
+
+ Custom mouse drivers can be implemented by subclassing the
+ QWSMouseHandler class and creating a mouse driver plugin (derived
+ from the QMouseDriverPlugin class). The default implementation of the
+ QMouseDriverFactory class will automatically detect the plugin,
+ loading the driver into the server application at run-time.
+
+ If you are creating a driver for a device that needs calibration
+ or noise reduction, such as a touchscreen, derive from the
+ QWSCalibratedMouseHandler subclass instead to take advantage of
+ its calibration functionality.
+
+ \if defined(QTOPIA_PHONE)
+ For a tutorial on how to add a new keyboard driver plug-in
+ see: \l {Tutorial: Implementing a Device Plug-in}.
+ \endif
+
+ \section1 Specifying a Driver
+
+ Provided that the "pc" mouse driver is enabled, \l{Qt for Embedded Linux} will
+ try to auto-detect the mouse device if it is one of the supported
+ types on \c /dev/psaux or one of the \c /dev/ttyS? serial
+ lines. If multiple mice are detected, all may be used
+ simultaneously.
+
+ Note that \l{Qt for Embedded Linux} does not support auto-detection of \e
+ {touch panels} in which case the driver must be specified
+ explicitly to determine which device to use.
+
+ To manually specify which driver to use, set the QWS_MOUSE_PROTO
+ environment variable. For example (if the current shell is bash,
+ ksh, zsh or sh):
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 4
+
+ The valid values for the \c <driver> argument are \c MouseMan, \c
+ IntelliMouse, \c Microsoft, \c VR41xx, \c LinuxTP, \c Yopy, \c
+ Tslib and \l {QMouseDriverPlugin::keys()}{keys} identifying custom
+ drivers, and the driver specific options are typically a device,
+ e.g., \c /dev/mouse for mouse devices and \c /dev/ts for touch
+ panels.
+
+ Multiple mouse drivers can be specified in one go:
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 5
+
+ Input will be read from all specified drivers.
+
+ Note that the \c Vr41xx driver also accepts two optional
+ arguments: \c press=<value> defining a mouse click (the default
+ value is 750) and \c filter=<value> specifying the length of the
+ filter used to eliminate noise (the default length is 3). For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 6
+
+ \table
+ \header \o The Tslib Mouse Driver
+ \row
+ \o
+
+ The tslib mouse driver inherits the QWSCalibratedMouseHandler
+ class, providing calibration and noise reduction functionality in
+ addition to generating mouse events for devices using the
+ Universal Touch Screen Library.
+
+ To be able to compile this mouse handler, \l{Qt for Embedded Linux} must be
+ configured with the \c -qt-mouse-tslib option as described
+ above. In addition, the tslib headers and library must be present
+ in the build environment.
+
+ The tslib sources can be downloaded from \l
+ http://tslib.berlios.de. Use the \c configure script's -L and
+ -I options to explicitly specify the location of the library and
+ its headers:
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 7
+
+ In order to use this mouse driver, tslib must also be correctly
+ installed on the target machine. This includes providing a \c
+ ts.conf configuration file and setting the neccessary environment
+ variables (see the README file provided with tslib for details).
+
+ The \c ts.conf file will usually contain the following two lines:
+
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 8
+
+ To make \l{Qt for Embedded Linux} explicitly choose the tslib mouse
+ handler, set the QWS_MOUSE_PROTO environment variable as explained
+ above.
+
+ \endtable
+
+ \section1 Troubleshooting
+
+ \section2 Device Files
+
+ Make sure you are using the correct device file.
+
+ As a first step, you can test whether the device file actually gives any
+ output. For instance, if you have specified the mouse driver with
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 9
+ then try examining
+ the output from the device by entering the following command in a console:
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 10
+
+ If you see output from the device printed on the console when you move
+ the mouse, you are probably using the correct device file; otherwise, you
+ will need to experiment to find the correct device file.
+
+ \section2 File Permissions
+
+ Make sure you have sufficient permissions to access the device file.
+
+ The Qt for Embedded Linux server process needs at least read permission for the
+ device file. Some drivers also require write access to the device file.
+ For instance, if you have specified the mouse driver with
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 11
+ then examine the permissions of the device file by entering the following
+ command in a console:
+ \snippet doc/src/snippets/code/doc_src_emb-pointer.qdoc 12
+
+ If the device file is actually a symbolic link to another file, you must
+ change the permissions of the actual file instead.
+*/
diff --git a/doc/src/emb-porting.qdoc b/doc/src/emb-porting.qdoc
new file mode 100644
index 0000000..9d6fad6
--- /dev/null
+++ b/doc/src/emb-porting.qdoc
@@ -0,0 +1,193 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-porting-operatingsystem.html
+
+ \title Porting Qt for Embedded Linux to Another Operating System
+ \ingroup qt-embedded-linux
+
+ \l{Qt for Embedded Linux} is reasonably platform-independent, making use of
+ the standard C library and some POSIX functions, but only a Linux
+ implementation is publically available. If you are looking for a
+ non-Linux commercial implementation, it is worth contacting \l
+ {mailto:sales@trolltech.com}{sales@trolltech.com} to see if we can
+ help.
+
+ There are several issues to be aware of if you plan to do your own
+ port to another operating system. In particular you must resolve
+ \l{Qt for Embedded Linux}'s shared memory and semaphores (used to share
+ window regions), and you must provide something similar to
+ Unix-domain sockets for inter-application communication. You must
+ also provide a screen driver, and if you want to implement sound
+ you must provide your own sound server. Finally you must modify
+ the event dispatcher used by \l{Qt for Embedded Linux}.
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Shared Memory and Semaphores
+
+ \l{Qt for Embedded Linux} uses System V IPC (shared memory and semaphores)
+ to share window regions between client and server. When porting,
+ something similar must be provided; otherwise it will not be
+ possible to run multiple applications.
+
+ System V semaphores are also used for synchronizing access to the
+ framebuffer.
+
+ \list
+ \o Modify \c qsharedmemory_p.cpp
+ \o Modify \c qlock_qws.cpp
+ \o Modify \c qwslock.cpp
+ \endlist
+
+ \section1 Inter-Application Communication
+
+ To communicate between applications, \l{Qt for Embedded Linux} uses the
+ Unix-domain sockets. When porting, something similar must be
+ provided; otherwise it will not be possible to run multiple
+ applications.
+
+ It should be possible to use message queues or similar mechanisms
+ to achieve this. With the exception of QCOP messages, individual
+ messages should be no more than a few bytes in length (QCOP
+ messages are generated by the client applications and not Qt for
+ Embedded Linux).
+
+ \list
+ \o Modify \c qwssocket_qws.cpp
+ \endlist
+
+ \section1 Screen Management
+
+ When rendering, the default behavior in \l{Qt for Embedded Linux} is
+ for each client to render its widgets into memory while the server is
+ responsible for putting the contents of the memory onto the screen
+ using the screen driver.
+
+ When porting, a new screen driver must be implemented, providing a
+ byte pointer to a memory-mapped framebuffer and information about
+ width, height and bit depth (the latter information can most
+ likely be hard-coded).
+
+ \list
+ \o Reimplement \c qscreen_qws.cpp
+ \endlist
+
+ \section1 Sound Management
+
+ To implement sound, \l{Qt for Embedded Linux} uses a Linux style device (\c
+ /dev/dsp). If you want to use the \l{Qt for Embedded Linux} sound server on
+ another platform you must reimplement it.
+
+ \list
+ \o Reimplement \c qsoundqss_qws.cpp
+ \endlist
+
+ \section1 Event Dispatching
+
+ \l{Qt for Embedded Linux} uses an event dispatcher to pass events to and
+ from the \l{Qt for Embedded Linux} server application. Reimplement the \c
+ select() function to enable \l{Qt for Embedded Linux} to dispatch events on
+ your platform.
+
+ \list
+ \o Modify \c qeventdispatcher_qws.cpp
+ \endlist
+*/
+
+/*!
+ \page qt-embedded-porting-device.html
+
+ \title Porting Qt for Embedded Linux to a New Architecture
+ \ingroup qt-embedded-linux
+
+ When porting \l{Qt for Embedded Linux} to a new architecture there are
+ several issues to be aware of: You must provide suitable hardware
+ drivers, and you must ensure to implement platform dependent
+ atomic operations to enable multithreading on the new
+ architecture.
+
+ \section1 Hardware Drivers
+
+ When running a \l{Qt for Embedded Linux} application, it either runs as a
+ server or connects to an existing server. All system generated
+ events, including keyboard and mouse events, are passed to the
+ server application which then propagates the event to the
+ appropriate client. When rendering, the default behavior is for
+ each client to render its widgets into memory while the server is
+ responsible for putting the contents of the memory onto the
+ screen.
+
+ The various hardware drivers are loaded by the server
+ application when it starts running, using Qt's \l {How to Create
+ Qt Plugins}{plugin system}.
+
+ Derive from the QWSMouseHandler, QWSKeyboardHandler and QScreen
+ classes to create a custom mouse, keyboard and screen driver
+ respectively. To load the drivers into the server application at
+ runtime, you must also create corresponding plugins. See the
+ following documentation for more details:
+
+ \list
+ \o \l{Qt for Embedded Linux Pointer Handling}{Pointer Handling}
+ \o \l{Qt for Embedded Linux Character Input}{Character Input}
+ \o \l{Qt for Embedded Linux Display Management}{Display Management}
+ \endlist
+
+ \section1 Atomic Operations
+
+ Qt uses an optimization called \l {Implicitly Shared Classes}{implicit sharing}
+ for many of its value classes; implicitly shared classes can safely be
+ copied across threads. This technology is implemented using atomic
+ operations; i.e., \l{Qt for Embedded Linux} requires that platform-specific
+ atomic operations are implemented to support Linux.
+
+ When porting \l{Qt for Embedded Linux} to a new architecture, it is
+ important to ensure that the platform-specific atomic operations
+ are implemented in a corresponding header file, and that this file
+ is located in Qt's \c src/corelib/arch directory.
+
+ See the \l {Implementing Atomic Operations}{atomic operations}
+ documentation for more details.
+*/
diff --git a/doc/src/emb-qvfb.qdoc b/doc/src/emb-qvfb.qdoc
new file mode 100644
index 0000000..8b819b6
--- /dev/null
+++ b/doc/src/emb-qvfb.qdoc
@@ -0,0 +1,296 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qvfb.html
+
+ \title The Virtual Framebuffer
+ \ingroup qt-embedded-linux
+
+ \l{Qt for Embedded Linux} applications write directly to the
+ framebuffer, eliminating the need for the X Window System and
+ saving memory. For development and debugging purposes, a virtual
+ framebuffer can be used, allowing \l{Qt for Embedded Linux}
+ programs to be developed on a desktop machine, without switching
+ between consoles and X11.
+
+ QVFb is an X11 application supplied with Qt for X11 that provides
+ a virtual framebuffer for Qt for Embedded Linux to use. To use it,
+ you need to \l{Installing Qt on X11 Platforms}{configure and
+ install Qt on X11 platforms} appropriately. Further requirements
+ can be found in the \l{Qt for Embedded Linux Requirements}
+ document.
+
+ \image qt-embedded-virtualframebuffer.png
+
+ The virtual framebuffer emulates a framebuffer using a shared
+ memory region and the \c qvfb tool to display the framebuffer in a
+ window. The \c qvfb tool also supports a feature known as a skin
+ which can be used to change the look and feel of the display. The
+ tool is located in Qt's \c tools/qvfb directory, and provides
+ several additional features accessible through its \gui File and
+ \gui View menus.
+
+ Please note that the virtual framebuffer is a development tool
+ only. No security issues have been considered in the virtual
+ framebuffer design. It should be avoided in a production
+ environment; i.e. do not configure production libraries with the
+ \c -qvfb option.
+
+ \tableofcontents
+
+ \section1 Displaying the Virtual Framebuffer
+
+ To run the \c qvfb tool displaying the virtual framebuffer, the
+ \l{Qt for Embedded Linux} library must be configured and compiled
+ with the \c -qvfb option:
+
+ \snippet doc/src/snippets/code/doc_src_emb-qvfb.qdoc 0
+
+ Ensure that you have all the
+ \l{Qt for Embedded Linux Requirements#Additional X11 Libraries for QVFb}
+ {necessary libraries} needed to build the tool, then compile and run the
+ \c qvfb tool as a normal Qt for X11 application (i.e., do \e not compile
+ it as a \l{Qt for Embedded Linux} application):
+
+ \snippet doc/src/snippets/code/doc_src_emb-qvfb.qdoc 1
+
+ The \c qvfb application supports the following command line
+ options:
+
+ \table
+ \header \o Option \o Description
+ \row
+ \o \c {-width <value>}
+ \o The width of the virtual framebuffer (default: 240).
+ \row
+ \o \c {-height <value>}
+ \o The height of the virtual framebuffer (default: 320).
+ \row
+ \o \c {-depth <value>}
+ \o The depth of the virtual framebuffer (1, 8 or 32; default: 8).
+ \row
+ \o \c -nocursor
+ \o Do not display the X11 cursor in the framebuffer window.
+ \row
+ \o \c {-qwsdisplay <:id>}
+ \o The \l{Qt for Embedded Linux} display ID (default: 0).
+ \row
+ \o \c {-skin <name>.skin}
+ \o The preferred skin. Note that the skin must be located in Qt's
+ \c /tools/qvfb/ directory.
+ \row
+ \o \c {-zoom <factor>}
+ \o Scales the application view with the given factor.
+
+ \endtable
+
+ \section2 Skins
+
+ A skin is a set of XML and pixmap files that tells the vitual
+ framebuffer what it should look like and how it should behave; a
+ skin can change the unrealistic default display into a display
+ that is similar to the target device. To access the \c qvfb tool's
+ menus when a skin is activated, right-click over the display.
+
+ Note that a skin can have buttons which (when clicked) send
+ signals to the Qt Extended application running inside the virtual
+ framebuffer, just as would happen on a real device.
+
+ \table 100%
+ \row
+ \o
+ \bold {Target Device Environment}
+
+ The \c qvfb tool provides various skins by default, allowing
+ the user to view their application in an environment similar
+ to their target device. The provided skins are:
+
+ \list
+ \o ClamshellPhone
+ \o pda
+ \o PDAPhone
+ \o Qt ExtendedPDA
+ \o Qt ExtendedPhone-Advanced
+ \o Qt ExtendedPhone-Simple
+ \o SmartPhone
+ \o SmartPhone2
+ \o SmartPhoneWithButtons
+ \o TouchscreenPhone
+ \o Trolltech-Keypad
+ \o Trolltech-Touchscreen
+ \endlist
+
+ In addition, it is possible to create custom skins.
+
+ \o \image qt-embedded-phone.png
+ \o \image qt-embedded-pda.png
+ \endtable
+
+ \bold {Creating Custom Skins}
+
+ The XML and pixmap files specifying a custom skin must be located
+ in subdirectory of the Qt's \c /tools/qvfb directory, called \c
+ /customskin.skin. See the ClamshellPhone skin for an example of the
+ file structure:
+
+ \snippet doc/src/snippets/code/doc_src_emb-qvfb.qdoc 2
+
+ The \c /ClamshellPhone.skin directory contains the following files:
+
+ \list
+ \o \c ClamshellPhone.skin
+ \o \c ClamshellPhone1-5.png
+ \o \c ClamshellPhone1-5-pressed.png
+ \o \c ClamshellPhone1-5-closed.png
+ \o \c defaultbuttons.conf (only necessary for \l Qt Extended)
+ \endlist
+
+ Note that the \c defaultbuttons.conf file is only necessary if the
+ skin is supposed to be used with \l Qt Extended (The file customizes
+ the launch screen applications, orders the soft keys and provides
+ input method hints). See the \l Qt Extended documentation for more
+ information.
+
+ \table 100%
+ \header
+ \o {3,1} The ClamshellPhone Skin
+ \row
+ \o {3,1}
+
+ \snippet doc/src/snippets/code/doc_src_emb-qvfb.qdoc 3
+
+ The \c ClamShellPhone.skin file quoted above, specifies three
+ pixmaps: One for the normal skin (\c Up), one for the activated
+ skin (\c Down) and one for the closed skin (\c Closed). In
+ addition, it is possible to specify a pixmap for the cursor (using
+ a \c Cursor variable).
+
+ The file also specifies the screen size (\c Screen) and the number
+ of available buttons (\c Areas). Then it describes the buttons
+ themselves; each button is specified by its name, keycode and
+ coordinates.
+
+ The coordinates are a list of at least 2 points in clockwise order
+ that define a shape for the button; a click inside this shape will
+ be treated as a click on that button. While pressed, the pixels
+ for the button are redrawn from the activated skin.
+
+ \row
+ \row
+ \o
+ \image qt-embedded-clamshellphone-closed.png The ClamshellPhone Skin (closed)
+ \o
+ \image qt-embedded-clamshellphone.png The ClamshellPhone Skin
+ \o
+ \image qt-embedded-clamshellphone-pressed.png The ClamshellPhone Skin (pressed)
+ \row
+ \o \c ClamshellPhone1-5-closed.png
+ \o \c ClamshellPhone1-5.png
+ \o \c ClamshellPhone1-5-pressed.png
+ \endtable
+
+ \section2 The File Menu
+
+ \image qt-embedded-qvfbfilemenu.png
+
+ The \gui File menu allows the user to configure the virtual
+ framebuffer display (\gui File|Configure...), save a snapshot of
+ the framebuffer contents (\gui {File|Save Image...}) and record
+ the movements in the framebuffer (\gui File|Animation...).
+
+ When choosing the \gui File|Configure menu item, the \c qvfb tool
+ provides a configuration dialog allowing the user to customize the
+ display of the virtual framebuffer. The user can modify the size
+ and depth as well as the Gamma values, and also select the
+ preferred skin (i.e. making the virtual framebuffer simulate the
+ target device environment). In addition, it is possible to emulate
+ a touch screen and a LCD screen.
+
+ Note that when configuring (except when changing the Gamma values
+ only), any applications using the virtual framebuffer will be
+ terminated.
+
+ \section2 The View Menu
+
+ \image qt-embedded-qvfbviewmenu.png
+
+ The \gui View menu allows the user to modify the target's refresh
+ rate (\gui {View|Refresh Rate...}), making \c qvfb check for
+ updated regions more or less frequently.
+
+ The regions of the display that have changed are updated
+ periodically, i.e. the virtual framebuffer is displaying discrete
+ snapshots of the framebuffer rather than each individual drawing
+ operation. For this reason drawing problems such as flickering may
+ not be apparent until the program is run using a real framebuffer.
+ If little drawing is being done, the framebuffer will not show any
+ updates between drawing events. If an application is displaying an
+ animation, the updates will be frequent, and the application and
+ \c qvfb will compete for processor time.
+
+ The \gui View menu also allows the user to zoom the view of the
+ application (\gui {View|Zoom *}).
+
+ \section1 Running Applications Using the Virtual Framebuffer
+
+ Once the virtual framebuffer (the \c qvfb application) is running,
+ it is ready for use: Start a server application (i.e. construct a
+ QApplication object with the QApplication::GuiServer flag or use
+ the \c -qws command line parameter. See the
+ \l {Running Qt for Embedded Linux Applications}{running applications}
+ documentation for details). For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-qvfb.qdoc 4
+
+ Note that as long as the virtual framebuffer is running and the
+ current \l{Qt for Embedded Linux} configuration supports \c qvfb,
+ \l{Qt for Embedded Linux} will automatically detect it and use it by
+ default. Alternatively, the \c -display option can be used to
+ specify the virtual framebuffer driver. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-qvfb.qdoc 5
+
+ \warning If \c qvfb is not running (or the current
+ \l{Qt for Embedded Linux} configuration doesn't support it) and the
+ driver is not explicitly specified, \l{Qt for Embedded Linux} will
+ write to the real framebuffer and the X11 display will be corrupted.
+*/
diff --git a/doc/src/emb-running.qdoc b/doc/src/emb-running.qdoc
new file mode 100644
index 0000000..9cdf414
--- /dev/null
+++ b/doc/src/emb-running.qdoc
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-running.html
+
+ \title Running Qt for Embedded Linux Applications
+ \ingroup qt-embedded-linux
+
+ A \l{Qt for Embedded Linux} application requires a server application to be
+ running, or to be the server application itself. Any \l{Qt for Embedded Linux}
+ application can be the server application by constructing the QApplication
+ object with the QApplication::GuiServer type, or by running the application
+ with the \c -qws command line option.
+
+ Applications can run using both single and multiple displays, and
+ various command line options are available.
+
+ Note that this document assumes that you either are using the
+ \l{The Virtual Framebuffer} or that you are running \l{Qt for Embedded Linux}
+ using the \l {The VNC Protocol and Qt for Embedded Linux}{VNC} protocol,
+ \e or that you have the Linux framebuffer configured
+ correctly and that no server process is running. (To test that the
+ Linux framebuffer is set up correctly, use the program provided by
+ the \l {Testing the Linux Framebuffer} document.)
+
+ \tableofcontents
+
+ \section1 Using a Single Display
+
+ To run the application using a single display, change to a Linux
+ console and select an application to run, e.g. \l {Text
+ Edit}{demos/textedit}. Run the application with the \c -qws
+ option:
+
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 0
+
+ \table 100%
+ \row
+ \o
+ Provided that the environment variables are adjusted properly
+ during the \l {Installing Qt for Embedded Linux}{installation process}, you
+ should see the \l {Text Edit} demo appear.
+
+ It might be that the hardware drivers must be specified explicitly
+ to make everything work properly. For more information, please
+ consult the following documentation:
+
+ \list
+ \o \l{Qt for Embedded Linux Pointer Handling}{Pointer Handling}
+ \o \l{Qt for Embedded Linux Character Input}{Character Input}
+ \o \l{Qt for Embedded Linux Display Management}{Display Management}
+ \endlist
+
+ \o
+ \inlineimage qt-embedded-runningapplication.png
+ \endtable
+
+ Additional applications can be run as clients, i.e., by running
+ these applications \e without the \c -qws option they will connect
+ to the existing server as clients. You can exit the server
+ application at any time using \gui{Ctrl+Alt+Backspace}.
+
+ \section1 Using Multiple Displays
+
+ Qt for Embedded Linux also allows multiple displays to be used
+ simultaneously. There are two ways of achieving this: Either run
+ multiple Qt for Embedded Linux server processes, or use the
+ ready-made \c Multi screen driver.
+
+ When running multiple server processes, the screen driver (and
+ display number) must be specified for each process using the \c
+ -display command line option or by setting the QWS_DISPLAY
+ environment variable. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 1
+
+ See the \l {Qt for Embedded Linux Display Management}{display management}
+ documentation for more details on how to specify a screen
+ driver. Note that you must also specify the display (i.e., server
+ process) when starting client applications:
+
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 2
+
+ There is no way of moving a client from one display to another
+ when running multiple server processes. Using the \c Multi screen
+ driver, on the other hand, applications can easiliy be moved
+ between the various screens.
+
+ The \c Multi screen driver can be specified just like any other
+ screen driver by using the \c -display command line option or by
+ setting the QWS_DISPLAY environment variable. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 3
+
+ See the \l {Qt for Embedded Linux Display Management}{display management}
+ documentation for details regarding arguments.
+
+ \section1 Command Line Options
+
+ \table 100%
+ \header
+ \o Option \o Description
+ \row
+ \o \bold -fn <font>
+ \o
+ Defines the application font. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 4
+ The font should be specified using an X logical font description.
+ \row
+ \o \bold -bg <color>
+ \o
+ Sets the default application background color. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 5
+ The color-name must be one of the names recognized by the QColor constructor.
+ \row
+ \o \bold -btn <color> \o
+ Sets the default button color. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 6
+ The color-name must be one of the names recognized by the QColor constructor.
+ \row
+ \o \bold -fg <color> \o
+ Sets the default application foreground color. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 7
+ The color-name must be one of the names recognized by the QColor constructor.
+ \row
+ \o \bold -name <objectname> \o
+ Sets the application name, i.e. the application object's object name. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 8
+ \row
+ \o \bold -title <title> \o
+ Sets the application's title. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 9
+ \row
+ \o \bold -geometry <width>x<height>+<Xoffset>+<Yoffset> \o
+ Sets the client geometry of the first window that is shown. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 10
+ \row
+ \o \bold -keyboard \o
+ Enables the keyboard.
+
+ See also: \l {Qt for Embedded Linux Character Input}.
+ \row
+ \o \bold -nokeyboard \o
+ Disables the keyboard.
+ \row
+ \o \bold -mouse \o
+ Enables the mouse cursor.
+
+ See also: \l {Qt for Embedded Linux Pointer Handling}.
+ \row
+ \o \bold -nomouse \o
+ Disables the mouse cursor.
+ \row
+ \o \bold -qws \o
+ Runs the application as a server application, i.e. constructs a
+ QApplication object of the QApplication::GuiServer type.
+ \row
+ \o \bold -display \o
+ Specifies the screen driver.
+
+ See also: \l {Qt for Embedded Linux Display Management}.
+ \row
+ \o \bold -decoration <style>\o
+ Sets the application decoration. For example:
+ \snippet doc/src/snippets/code/doc_src_emb-running.qdoc 11
+ The supported styles are \c windows, \c default and \c styled.
+
+ See also QDecoration.
+
+ \endtable
+*/
diff --git a/doc/src/emb-vnc.qdoc b/doc/src/emb-vnc.qdoc
new file mode 100644
index 0000000..283193c
--- /dev/null
+++ b/doc/src/emb-vnc.qdoc
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qt-embedded-vnc.html
+ \brief A guide to using Qt for Embedded Linux applications as VNC servers
+ and clients.
+
+ \title The VNC Protocol and Qt for Embedded Linux
+ \ingroup qt-embedded-linux
+
+ VNC (Virtual Network Computing) software makes it possible to view
+ and interact with one computer (the "server") from any other
+ computer or mobile device (the "viewer") anywhere on a network.
+
+ \image qt-embedded-vnc-screen.png
+
+ VNC clients are available for a vast array of display systems, including
+ X11, Mac OS X and Windows.
+
+ \section1 Configuring Qt with VNC Capabilities
+
+ To run a \l{Qt for Embedded Linux} application using the VNC protocol, the
+ \l{Qt for Embedded Linux} library must be configured and compiled with the
+ \c -qt-gfx-vnc option:
+
+ \snippet doc/src/snippets/code/doc_src_emb-vnc.qdoc 0
+
+ \section1 Running a Server Application
+
+ Start a server application by specifying the \c -qws command
+ line option when running the application. (This can also be
+ specified in the application's source code.)
+ Use the \c -display command line option to specify the VNC server's
+ driver and the virtual screen to use. For example:
+
+ \snippet doc/src/snippets/code/doc_src_emb-vnc.qdoc 1
+
+ The application will act as a VNC server which can be accessed using
+ an ordinary VNC client, either on the development machine or from a
+ different machine on a network.
+
+ For example, using the X11 VNC client to view the application from the
+ same machine:
+
+ \snippet doc/src/snippets/code/doc_src_emb-vnc.qdoc 2
+
+ To interact with the application from another machine on the network,
+ run a VNC client pointing to the machine that is running the server
+ application.
+
+ \l{Qt for Embedded Linux} will create a 640 by 480 pixel display by
+ default. Alternatively, the \c QWS_SIZE environment variable can be
+ used to set another size; e.g., \c{QWS_SIZE=240x320}.
+
+ \section1 Running Client Applications
+
+ If you want to run more than one application on the same display, you
+ only need to start the first one as a server application, using the
+ \c -qws command line option to indicate that it will manage other
+ windows.
+
+ \snippet doc/src/snippets/code/doc_src_emb-vnc.qdoc Starting server
+
+ Subsequent client applications can be started \e without the \c -qws
+ option, but will each require the same \c -display option and argument
+ as those used for the server.
+
+ \snippet doc/src/snippets/code/doc_src_emb-vnc.qdoc Starting clients
+
+ However, for the clients, this option will not cause a new VNC server
+ to be started, but only indicates that their windows will appear on the
+ virtual screen managed by the server application.
+
+ \section1 Related Resources
+
+ It is not always necessary to specify the \c -qws command line option
+ when running a server application as long as the QApplication object
+ used by the application has been constructed with the
+ QApplication::GuiServer flag.
+
+ See the \l{Running Qt for Embedded Linux Applications}{running applications}
+ documentation for more details about server and client applications.
+
+ \table
+ \row
+ \o \bold {The Virtual Framebuffer}
+
+ The \l{The Virtual Framebuffer}{virtual framebuffer} is
+ an alternative technique recommended for development and debugging
+ purposes.
+
+ The virtual framebuffer emulates a framebuffer using a shared
+ memory region and the \c qvfb tool to display the framebuffer in a
+ window.
+
+ Its use of shared memory makes the virtual framebuffer much faster
+ and smoother than using the VNC protocol, but it does not operate
+ over a network.
+
+ \o \inlineimage qt-embedded-virtualframebuffer.png
+ \endtable
+*/
diff --git a/doc/src/eventsandfilters.qdoc b/doc/src/eventsandfilters.qdoc
new file mode 100644
index 0000000..06ca08c
--- /dev/null
+++ b/doc/src/eventsandfilters.qdoc
@@ -0,0 +1,221 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page eventsandfilters.html
+ \title Events and Event Filters
+ \ingroup architecture
+ \brief A guide to event handling in Qt.
+
+ In Qt, events are objects, derived from the abstract QEvent class,
+ that represent things that have happened either within an application
+ or as a result of outside activity that the application needs to know
+ about. Events can be received and handled by any instance of a
+ QObject subclass, but they are especially relevant to widgets. This
+ document describes how events are delivered and handled in a typical
+ application.
+
+ \tableofcontents
+
+ \section1 How Events are Delivered
+
+ When an event occurs, Qt creates an event object to represent it by
+ constructing an instance of the appropriate QEvent subclass, and
+ delivers it to a particular instance of QObject (or one of its
+ subclasses) by calling its \l{QObject::}{event()} function.
+
+ This function does not handle the event itself; based on the type
+ of event delivered, it calls an event handler for that specific
+ type of event, and sends a response based on whether the event
+ was accepted or ignored.
+
+ \omit
+ Event delivery means that an
+ event has occurred, the QEvent indicates precisely what, and the
+ QObject needs to respond. Most events are specific to QWidget and its
+ subclasses, but there are important events that aren't related to
+ graphics (e.g., \l{QTimer}{timer events}).
+ \endomit
+
+ Some events, such as QMouseEvent and QKeyEvent, come from the
+ window system; some, such as QTimerEvent, come from other sources;
+ some come from the application itself.
+
+ \section1 Event Types
+
+ Most events types have special classes, notably QResizeEvent,
+ QPaintEvent, QMouseEvent, QKeyEvent, and QCloseEvent. Each class
+ subclasses QEvent and adds event-specific functions. For example,
+ QResizeEvent adds \l{QResizeEvent::}{size()} and
+ \l{QResizeEvent::}{oldSize()} to enable widgets to discover how
+ their dimensions have been changed.
+
+ Some classes support more than one actual event type. QMouseEvent
+ supports mouse button presses, double-clicks, moves, and other
+ related operations.
+
+ Each event has an associated type, defined in QEvent::Type, and this
+ can be used as a convenient source of run-time type information to
+ quickly determine which subclass a given event object was constructed
+ from.
+
+ Since programs need to react in varied and complex ways, Qt's
+ event delivery mechanisms are flexible. The documentation for
+ QCoreApplication::notify() concisely tells the whole story; the
+ \e{Qt Quarterly} article
+ \l{http://doc.trolltech.com/qq/qq11-events.html}{Another Look at Events}
+ rehashes it less concisely. Here we will explain enough for 95%
+ of applications.
+
+ \section1 Event Handlers
+
+ The normal way for an event to be delivered is by calling a virtual
+ function. For example, QPaintEvent is delivered by calling
+ QWidget::paintEvent(). This virtual function is responsible for
+ reacting appropriately, normally by repainting the widget. If you
+ do not perform all the necessary work in your implementation of the
+ virtual function, you may need to call the base class's implementation.
+
+ For example, the following code handles left mouse button clicks on
+ a custom checkbox widget while passing all other button clicks to the
+ base QCheckBox class:
+
+ \snippet doc/src/snippets/events/events.cpp 0
+
+ If you want to replace the base class's function, you must
+ implement everything yourself. However, if you only want to extend
+ the base class's functionality, then you implement what you want and
+ call the base class to obtain the default behavior for any cases you
+ do not want to handle.
+
+ Occasionally, there isn't such an event-specific function, or the
+ event-specific function isn't sufficient. The most common example
+ involves \key Tab key presses. Normally, QWidget intercepts these to
+ move the keyboard focus, but a few widgets need the \key{Tab} key for
+ themselves.
+
+ These objects can reimplement QObject::event(), the general event
+ handler, and either do their event handling before or after the usual
+ handling, or they can replace the function completely. A very unusual
+ widget that both interprets \key Tab and has an application-specific
+ custom event might contain the following \l{QObject::event()}{event()}
+ function:
+
+ \snippet doc/src/snippets/events/events.cpp 1
+
+ Note that QWidget::event() is still called for all of the cases not
+ handled, and that the return value indicates whether an event was
+ dealt with; a \c true value prevents the event from being sent on
+ to other objects.
+
+ \section1 Event Filters
+
+ Sometimes an object needs to look at, and possibly intercept, the
+ events that are delivered to another object. For example, dialogs
+ commonly want to filter key presses for some widgets; for example,
+ to modify \key{Return}-key handling.
+
+ The QObject::installEventFilter() function enables this by setting
+ up an \e{event filter}, causing a nominated filter object to receive
+ the events for a target object in its QObject::eventFilter()
+ function. An event filter gets to process events before the target
+ object does, allowing it to inspect and discard the events as
+ required. An existing event filter can be removed using the
+ QObject::removeEventFilter() function.
+
+ When the filter object's \l{QObject::}{eventFilter()} implementation
+ is called, it can accept or reject the event, and allow or deny
+ further processing of the event. If all the event filters allow
+ further processing of an event (by each returning \c false), the event
+ is sent to the target object itself. If one of them stops processing
+ (by returning \c true), the target and any later event filters do not
+ get to see the event at all.
+
+ \snippet doc/src/snippets/eventfilters/filterobject.cpp 0
+
+ The above code shows another way to intercept \key{Tab} key press
+ events sent to a particular target widget. In this case, the filter
+ handles the relevant events and returns \c true to stop them from
+ being processed any further. All other events are ignored, and the
+ filter returns \c false to allow them to be sent on to the target
+ widget, via any other event filters that are installed on it.
+
+ It is also possible to filter \e all events for the entire application,
+ by installing an event filter on the QApplication or QCoreApplication
+ object. Such global event filters are called before the object-specific
+ filters. This is very powerful, but it also slows down event delivery
+ of every single event in the entire application; the other techniques
+ discussed should generally be used instead.
+
+ \section1 Sending Events
+
+ Many applications want to create and send their own events. You can
+ send events in exactly the same ways as Qt's own event loop by
+ constructing suitable event objects and sending them with
+ QCoreApplication::sendEvent() and QCoreApplication::postEvent().
+
+ \l{QCoreApplication::}{sendEvent()} processes the event immediately.
+ When it returns, the event filters and/or the object itself have
+ already processed the event. For many event classes there is a function
+ called isAccepted() that tells you whether the event was accepted
+ or rejected by the last handler that was called.
+
+ \l{QCoreApplication::}{postEvent()} posts the event on a queue for
+ later dispatch. The next time Qt's main event loop runs, it dispatches
+ all posted events, with some optimization. For example, if there are
+ several resize events, they are are compressed into one. The same
+ applies to paint events: QWidget::update() calls
+ \l{QCoreApplication::}{postEvent()}, which eliminates flickering and
+ increases speed by avoiding multiple repaints.
+
+ \l{QCoreApplication::}{postEvent()} is also used during object
+ initialization, since the posted event will typically be dispatched
+ very soon after the initialization of the object is complete.
+ When implementing a widget, it is important to realise that events
+ can be delivered very early in its lifetime so, in its constructor,
+ be sure to initialize member variables early on, before there's any
+ chance that it might receive an event.
+
+ To create events of a custom type, you need to define an event
+ number, which must be greater than QEvent::User, and you may need to
+ subclass QEvent in order to pass specific information about your
+ custom event. See the QEvent documentation for further details.
+*/
diff --git a/doc/src/examples-overview.qdoc b/doc/src/examples-overview.qdoc
new file mode 100644
index 0000000..549574d
--- /dev/null
+++ b/doc/src/examples-overview.qdoc
@@ -0,0 +1,348 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page examples-overview.html
+ \title An Overview of Qt's Examples
+ \brief A short guide to the different categories of examples included with Qt.
+ \ingroup howto
+
+ Qt is supplied with a variety of examples that cover almost every aspect
+ of development. These examples are ordered by functional area, but many
+ examples often use features from many parts of Qt to highlight one area
+ in particular.
+
+ This document provides a brief overview of each example category and
+ provides links to the more formal \l{Qt Examples}{list of examples}.
+
+ \section1 \l{Qt Examples#Widgets}{Widgets}
+
+ \l{Qt Examples#Widgets}{\inlineimage widget-examples.png
+ }
+
+ Qt comes with a large range of standard widgets that users of modern
+ applications have come to expect.
+
+ You can also develop your own custom widgets and controls, and use them
+ alongside standard widgets.
+
+ It is even possible to provide custom styles and themes for widgets that can
+ be used to change the appearance of standard widgets and appropriately
+ written custom widgets.
+
+ \section1 \l{Qt Examples#Dialogs}{Dialogs}
+
+ \l{Qt Examples#Dialogs}{\inlineimage dialog-examples.png
+ }
+
+ Qt includes standard dialogs for many common operations, such as file
+ selection, printing, and color selection.
+
+ Custom dialogs can also be created for specialized modal or modeless
+ interactions with users.
+
+ \section1 \l{Qt Examples#Main Windows}{Main Windows}
+
+ \l{Qt Examples#Main Windows}{\inlineimage mainwindow-examples.png
+ }
+
+ All the standard features of application main windows are provided by Qt.
+
+ Main windows can have pull down menus, tool bars, and dock windows. These
+ separate forms of user input are unified in an integrated action system that
+ also supports keyboard shortcuts and accelerator keys in menu items.
+
+ \section1 \l{Qt Examples#Layouts}{Layouts}
+
+ \l{Qt Examples#Layouts}{\inlineimage layout-examples.png
+ }
+
+ Qt uses a layout-based approach to widget management. Widgets are arranged in
+ the optimal positions in windows based on simple layout rules, leading to a
+ consistent look and feel.
+
+ Custom layouts can be used to provide more control over the positions and
+ sizes of child widgets.
+
+ \section1 \l{Qt Examples#Painting}{Painting}
+
+ \l{Qt Examples#Painting}{\inlineimage painting-examples.png
+ }
+
+ Qt's painting system is able to render vector graphics, images, and outline
+ font-based text with sub-pixel accuracy accuracy using anti-aliasing to
+ improve rendering quality.
+
+ These examples show the most common techniques that are used when painting
+ with Qt, from basic concepts such as drawing simple primitives to the use of
+ transformations.
+
+ \section1 \l{Qt Examples#Item Views}{Item Views}
+
+ \l{Qt Examples#Item Views}{\inlineimage itemview-examples.png
+ }
+
+ Item views are widgets that typically display data sets. Qt 4's model/view
+ framework lets you handle large data sets by separating the underlying data
+ from the way it is represented to the user, and provides support for
+ customized rendering through the use of delegates.
+
+ \section1 \l{Qt Examples#Graphics View}{Graphics View}
+
+ \l{Qt Examples#Graphics View}{\inlineimage graphicsview-examples.png
+ }
+
+ Qt is provided with a comprehensive canvas through the GraphicsView
+ classes.
+
+ These examples demonstrate the fundamental aspects of canvas programming
+ with Qt.
+
+ \section1 \l{Qt Examples#Rich Text}{Rich Text}
+
+ \l{Qt Examples#Rich Text}{\inlineimage richtext-examples.png
+ }
+
+ Qt provides powerful document-oriented rich text engine that supports Unicode
+ and right-to-left scripts. Documents can be manipulated using a cursor-based
+ API, and their contents can be imported and exported as both HTML and in a
+ custom XML format.
+
+ \section1 \l{Qt Examples#Tools}{Tools}
+
+ \l{Qt Examples#Tools}{\inlineimage tool-examples.png
+ }
+
+ Qt is equipped with a range of capable tool classes, from containers and
+ iterators to classes for string handling and manipulation.
+
+ Other classes provide application infrastructure support, handling plugin
+ loading and managing configuration files.
+
+ \section1 \l{Qt Examples#Desktop}{Desktop}
+
+ \l{Qt Examples#Desktop}{\inlineimage desktop-examples.png
+ }
+
+ Qt provides features to enable applications to integrate with the user's
+ preferred desktop environment.
+
+ Features such as system tray icons, access to the desktop widget, and
+ support for desktop services can be used to improve the appearance of
+ applications and take advantage of underlying desktop facilities.
+
+ \section1 \l{Qt Examples#Drag and Drop}{Drag and Drop}
+
+ \l{Qt Examples#Drag and Drop}{\inlineimage draganddrop-examples.png
+ }
+
+ Qt supports native drag and drop on all platforms via an extensible
+ MIME-based system that enables applications to send data to each other in the
+ most appropriate formats.
+
+ Drag and drop can also be implemented for internal use by applications.
+
+ \section1 \l{Qt Examples#Threads}{Threads}
+
+ \l{Qt Examples#Threads}{\inlineimage thread-examples.png
+ }
+
+ Qt 4 makes it easier than ever to write multithreaded applications. More
+ classes have been made usable from non-GUI threads, and the signals and slots
+ mechanism can now be used to communicate between threads.
+
+ Additionally, it is now possible to move objects between threads.
+
+ \section1 \l{Qt Examples#Concurrent Programming}{Concurrent Programming}
+
+ The QtConcurrent namespace includes a collection of classes and functions
+ for straightforward concurrent programming.
+
+ These examples show how to apply the basic techniques of concurrent
+ programming to simple problems.
+
+ \section1 \l{Qt Examples#Network}{Network}
+
+ \l{Qt Examples#Network}{\inlineimage network-examples.png
+ }
+
+ Qt is provided with an extensive set of network classes to support both
+ client-based and server side network programming.
+
+ These examples demonstrate the fundamental aspects of network programming
+ with Qt.
+
+ \section1 \l{Qt Examples#XML}{XML}
+
+ \l{Qt Examples#XML}{\inlineimage xml-examples.png
+ }
+
+ XML parsing and handling is supported through SAX and DOM compliant APIs.
+
+ Qt's SAX compliant classes allow you to parse XML incrementally; the DOM
+ classes enable more complex document-level operations to be performed on
+ XML files.
+
+ \section1 \l{Qt Examples#XQuery, XPath}{XQuery, XPath}
+
+ Qt provides an XQuery/XPath engine, QtXmlPatterns, for querying XML
+ files and custom data models, similar to the model/view framework.
+
+ \section1 \l{Qt Examples#OpenGL}{OpenGL}
+
+ \l{Qt Examples#OpenGL}{\inlineimage opengl-examples.png
+ }
+
+ Qt provides support for integration with OpenGL implementations on all
+ platforms, giving developers the opportunity to display hardware accelerated
+ 3D graphics alongside a more conventional user interface.
+
+ These examples demonstrate the basic techniques used to take advantage of
+ OpenGL in Qt applications.
+
+ \section1 \l{Qt Examples#SQL}{SQL}
+
+ \l{Qt Examples#SQL}{\inlineimage sql-examples.png
+ }
+
+ Qt provides extensive database interoperability, with support for products
+ from both open source and proprietary vendors.
+
+ SQL support is integrated with Qt's model/view architecture, making it easier
+ to provide GUI integration for your database applications.
+
+ \section1 \l{Qt Examples#Help System}{Help System}
+
+ \l{Qt Examples#Help System}{\inlineimage assistant-examples.png
+ }
+
+ Support for interactive help is provided by the Qt Assistant application.
+ Developers can take advantages of the facilities it offers to display
+ specially-prepared documentation to users of their applications.
+
+ \section1 \l{Qt Examples#Qt Designer}{Qt Designer}
+
+ \l{Qt Examples#Qt Designer}{\inlineimage designer-examples.png
+ }
+
+ Qt Designer is a capable graphical user interface designer that lets you
+ create and configure forms without writing code. GUIs created with
+ Qt Designer can be compiled into an application or created at run-time.
+
+ \section1 \l{Qt Examples#UiTools}{UiTools}
+
+ \l{Qt Examples#UiTools}{\inlineimage uitools-examples.png
+ }
+
+ Qt is equipped with a range of capable tool classes, from containers and
+ iterators to classes for string handling and manipulation.
+
+ Other classes provide application infrastructure support, handling plugin
+ loading and managing configuration files.
+
+ \section1 \l{Qt Examples#Qt Linguist}{Qt Linguist}
+
+ \l{Qt Examples#Qt Linguist}{\inlineimage linguist-examples.png
+ }
+
+ Internationalization is a core feature of Qt. These examples show how to
+ access translation and localization facilities at run-time.
+
+ \section1 \l{Qt Examples#Qt Script}{Qt Script}
+
+ \l{Qt Examples#Qt Script}{\inlineimage qtscript-examples.png
+ }
+
+ Qt is provided with a powerful embedded scripting environment through the QtScript
+ classes.
+
+ These examples demonstrate the fundamental aspects of scripting applications
+ with Qt.
+
+ \section1 \l{Qt Examples#Phonon Multimedia Framework}{Phonon Multimedia Framework}
+
+ \l{Qt Examples#Phonon Multimedia Framework}{\inlineimage phonon-examples.png
+ }
+
+ The Phonon Multimedia Framework brings multimedia support to Qt applications.
+
+ The examples and demonstrations provided show how to play music and movies
+ using the Phonon API.
+
+ \section1 \l{Qt Examples#WebKit}{WebKit}
+
+ \l{Qt Examples#WebKit}{\inlineimage webkit-examples.png
+ }
+
+ Qt provides an integrated Web browser component based on WebKit, the popular
+ open source browser engine.
+
+ These examples and demonstrations show a range of different uses for WebKit,
+ from displaying Web pages within a Qt user interface to an implementation of
+ a basic function Web browser.
+
+ \section1 \l{Qt Examples#Qt for Embedded Linux}{Qt for Embedded Linux}
+
+ \l{Qt Examples#Qt for Embedded Linux}{\inlineimage qt-embedded-examples.png
+ }
+
+ These examples show how to take advantage of features specifically designed
+ for use on systems with limited resources, specialized hardware, and small
+ screens.
+
+ \section1 \l{Qt Examples#ActiveQt}{ActiveQt}
+
+ Qt is supplied with a number of example applications and demonstrations that
+ have been written to provide developers with examples of the Qt API in use,
+ highlight good programming practice, and showcase features found in each of
+ Qt's core technologies.
+
+ The example and demo launcher can be used to explore the different categories
+ available. It provides an overview of each example, lets you view the
+ documentation in Qt Assistant, and is able to launch examples and demos.
+
+ \section1 \l{http://doc.trolltech.com/qq}{Another Source of Examples}
+
+ One more valuable source for examples and explanations of Qt
+ features is the archive of the \l {http://doc.trolltech.com/qq}
+ {Qt Quarterly}.
+
+*/
diff --git a/doc/src/examples.qdoc b/doc/src/examples.qdoc
new file mode 100644
index 0000000..c9cb049
--- /dev/null
+++ b/doc/src/examples.qdoc
@@ -0,0 +1,402 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page examples.html
+ \title Qt Examples
+ \brief Information about the example programs provided with Qt.
+ \ingroup howto
+
+ This is the list of examples in Qt's \c examples directory. The
+ examples demonstrate Qt features in small, self-contained
+ programs. They are not all designed to be impressive when you run
+ them, but their source code is carefully written to show good Qt
+ programming practices. You can launch any of these programs from the
+ \l{Examples and Demos Launcher} application.
+
+ If you are new to Qt, you should probably start by going through
+ the \l{Tutorials} before you have a look at the
+ \l{mainwindows/application}{Application} example.
+
+ In addition to the examples and the tutorial, Qt includes a
+ \l{Qt Demonstrations}{selection of demos} that deliberately show off
+ Qt's features. You might want to look at these as well.
+
+ One more valuable source for examples and explanations of Qt
+ features is the archive of the \l {Qt Quarterly}.
+
+ In the list below, examples marked with an asterisk (*) are fully
+ documented. Eventually, all the examples will be fully documented,
+ but sometimes we include an example before we have time to write
+ about it, because someone might need it right now.
+
+ Categories:
+
+ \tableofcontents
+
+ \section1 ActiveQt
+
+ \list
+ \o \l{activeqt/comapp}{COM App}\raisedaster
+ \o \l{Dot Net Example (ActiveQt)}{Dot Net}\raisedaster
+ \o \l{activeqt/hierarchy}{Hierarchy}\raisedaster
+ \o \l{activeqt/menus}{Menus}\raisedaster
+ \o \l{activeqt/multiple}{Multiple}\raisedaster
+ \o \l{activeqt/opengl}{OpenGL}\raisedaster
+ \o \l{activeqt/qutlook}{Qutlook}\raisedaster
+ \o \l{activeqt/simple}{Simple}\raisedaster
+ \o \l{activeqt/webbrowser}{Web Browser}\raisedaster
+ \o \l{activeqt/wrapper}{Wrapper}\raisedaster
+ \endlist
+
+ \section1 Concurrent Programming
+
+ \list
+ \o \l{qtconcurrent/imagescaling}{QtConcurrent Asynchronous Image Scaling}
+ \o \l{qtconcurrent/map}{QtConcurrent Map}
+ \o \l{qtconcurrent/progressdialog}{QtConcurrent Progress Dialog}
+ \o \l{qtconcurrent/runfunction}{QtConcurrent Run Function}
+ \o \l{qtconcurrent/wordcount}{QtConcurrent Word Count}
+ \endlist
+
+ \section1 D-Bus
+ \list
+ \o \l{dbus/dbus-chat}{Chat}
+ \o \l{dbus/complexpingpong}{Complex Ping Pong}
+ \o \l{dbus/listnames}{List Names}
+ \o \l{dbus/pingpong}{Ping Pong}
+ \o \l{dbus/remotecontrolledcar}{Remote Controlled Car}
+ \endlist
+
+ \section1 Desktop
+
+ \list
+ \o \l{desktop/screenshot}{Screenshot}\raisedaster
+ \o \l{desktop/systray}{System Tray}\raisedaster
+ \endlist
+
+ \section1 Dialogs
+
+ \list
+ \o \l{dialogs/classwizard}{Class Wizard}\raisedaster
+ \o \l{dialogs/configdialog}{Config Dialog}
+ \o \l{dialogs/extension}{Extension}\raisedaster
+ \o \l{dialogs/findfiles}{Find Files}\raisedaster
+ \o \l{dialogs/licensewizard}{License Wizard}\raisedaster
+ \o \l{dialogs/standarddialogs}{Standard Dialogs}
+ \o \l{dialogs/tabdialog}{Tab Dialog}\raisedaster
+ \o \l{dialogs/trivialwizard}{Trivial Wizard}
+ \endlist
+
+ \section1 Drag and Drop
+
+ \list
+ \o \l{draganddrop/delayedencoding}{Delayed Encoding}\raisedaster
+ \o \l{draganddrop/draggableicons}{Draggable Icons}
+ \o \l{draganddrop/draggabletext}{Draggable Text}
+ \o \l{draganddrop/dropsite}{Drop Site}
+ \o \l{draganddrop/fridgemagnets}{Fridge Magnets}\raisedaster
+ \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
+ \endlist
+
+ \section1 Graphics View
+
+ \list
+ \o \l{graphicsview/collidingmice}{Colliding Mice}\raisedaster
+ \o \l{graphicsview/diagramscene}{Diagram Scene}\raisedaster
+ \o \l{graphicsview/dragdroprobot}{Drag and Drop Robot}
+ \o \l{graphicsview/elasticnodes}{Elastic Nodes}
+ \o \l{graphicsview/portedasteroids}{Ported Asteroids}
+ \o \l{graphicsview/portedcanvas}{Ported Canvas}
+ \endlist
+
+ \section1 Help System
+
+ \list
+ \o \l{help/simpletextviewer}{Simple Text Viewer}\raisedaster
+ \endlist
+
+ \section1 Item Views
+
+ \list
+ \o \l{itemviews/addressbook}{Address Book}\raisedaster
+ \o \l{itemviews/basicsortfiltermodel}{Basic Sort/Filter Model}
+ \o \l{itemviews/chart}{Chart}
+ \o \l{itemviews/coloreditorfactory}{Color Editor Factory}\raisedaster
+ \o \l{itemviews/combowidgetmapper}{Combo Widget Mapper}\raisedaster
+ \o \l{itemviews/customsortfiltermodel}{Custom Sort/Filter Model}\raisedaster
+ \o \l{itemviews/dirview}{Dir View}
+ \o \l{itemviews/editabletreemodel}{Editable Tree Model}\raisedaster
+ \o \l{itemviews/fetchmore}{Fetch More}\raisedaster
+ \o \l{itemviews/pixelator}{Pixelator}\raisedaster
+ \o \l{itemviews/puzzle}{Puzzle}
+ \o \l{itemviews/simpledommodel}{Simple DOM Model}\raisedaster
+ \o \l{itemviews/simpletreemodel}{Simple Tree Model}\raisedaster
+ \o \l{itemviews/simplewidgetmapper}{Simple Widget Mapper}\raisedaster
+ \o \l{itemviews/spinboxdelegate}{Spin Box Delegate}\raisedaster
+ \o \l{itemviews/stardelegate}{Star Delegate}\raisedaster
+ \endlist
+
+ \section1 Layouts
+
+ \list
+ \o \l{layouts/basiclayouts}{Basic Layouts}\raisedaster
+ \o \l{layouts/borderlayout}{Border Layout}
+ \o \l{layouts/dynamiclayouts}{Dynamic Layouts}
+ \o \l{layouts/flowlayout}{Flow Layout}
+ \endlist
+
+ \section1 Main Windows
+
+ \list
+ \o \l{mainwindows/application}{Application}\raisedaster
+ \o \l{mainwindows/dockwidgets}{Dock Widgets}\raisedaster
+ \o \l{mainwindows/mdi}{MDI}
+ \o \l{mainwindows/menus}{Menus}\raisedaster
+ \o \l{mainwindows/recentfiles}{Recent Files}
+ \o \l{mainwindows/sdi}{SDI}
+ \endlist
+
+ \section1 Network
+
+ \list
+ \o \l{network/blockingfortuneclient}{Blocking Fortune Client}\raisedaster
+ \o \l{network/broadcastreceiver}{Broadcast Receiver}
+ \o \l{network/broadcastsender}{Broadcast Sender}
+ \o \l{network/network-chat}{Network Chat}
+ \o \l{network/fortuneclient}{Fortune Client}\raisedaster
+ \o \l{network/fortuneserver}{Fortune Server}\raisedaster
+ \o \l{network/ftp}{FTP}\raisedaster
+ \o \l{network/http}{HTTP}
+ \o \l{network/loopback}{Loopback}
+ \o \l{network/threadedfortuneserver}{Threaded Fortune Server}\raisedaster
+ \o \l{network/torrent}{Torrent}
+ \endlist
+
+ \section1 OpenGL
+
+ \list
+ \o \l{opengl/2dpainting}{2D Painting}\raisedaster
+ \o \l{opengl/framebufferobject}{Framebuffer Object}
+ \o \l{opengl/framebufferobject2}{Framebuffer Object 2}
+ \o \l{opengl/grabber}{Grabber}
+ \o \l{opengl/hellogl}{Hello GL}\raisedaster
+ \o \l{opengl/overpainting}{Overpainting}\raisedaster
+ \o \l{opengl/pbuffers}{Pixel Buffers}
+ \o \l{opengl/pbuffers2}{Pixel Buffers 2}
+ \o \l{opengl/samplebuffers}{Sample Buffers}
+ \o \l{opengl/textures}{Textures}
+ \endlist
+
+ \section1 Painting
+
+ \list
+ \o \l{painting/basicdrawing}{Basic Drawing}\raisedaster
+ \o \l{painting/concentriccircles}{Concentric Circles}\raisedaster
+ \o \l{painting/fontsampler}{Font Sampler}
+ \o \l{painting/imagecomposition}{Image Composition}\raisedaster
+ \o \l{painting/painterpaths}{Painter Paths}\raisedaster
+ \o \l{painting/svgviewer}{SVG Viewer}
+ \o \l{painting/transformations}{Transformations}\raisedaster
+ \endlist
+
+ \section1 Phonon Multimedia Framework
+
+ \list
+ \o \l{phonon/capabilities}{Capabilities}\raisedaster
+ \o \l{phonon/musicplayer}{Music Player}\raisedaster
+ \endlist
+
+ \section1 Qt Designer
+
+ \list
+ \o \l{designer/calculatorbuilder}{Calculator Builder}\raisedaster
+ \o \l{designer/calculatorform}{Calculator Form}\raisedaster
+ \o \l{designer/customwidgetplugin}{Custom Widget Plugin}\raisedaster
+ \o \l{designer/taskmenuextension}{Task Menu Extension}\raisedaster
+ \o \l{designer/containerextension}{Container Extension}\raisedaster
+ \o \l{designer/worldtimeclockbuilder}{World Time Clock Builder}\raisedaster
+ \o \l{designer/worldtimeclockplugin}{World Time Clock Plugin}\raisedaster
+ \endlist
+
+ \section1 Qt Linguist
+
+ \list
+ \o \l{linguist/hellotr}{Hello tr()}\raisedaster
+ \o \l{linguist/arrowpad}{Arrow Pad}\raisedaster
+ \o \l{linguist/trollprint}{Troll Print}\raisedaster
+ \endlist
+
+ \section1 Qt for Embedded Linux
+
+ \list
+ \o \l{qws/svgalib}{Accelerated Graphics Driver}\raisedaster
+ \o \l{qws/dbscreen}{Double Buffered Graphics Driver}\raisedaster
+ \o \l{qws/mousecalibration}{Mouse Calibration}\raisedaster
+ \o \l{qws/ahigl}{OpenGL for Embedded Systems}\raisedaster
+ \o \l{qws/simpledecoration}{Simple Decoration}\raisedaster
+ \endlist
+
+ \section1 Qt Script
+
+ \list
+ \o \l{script/calculator}{Calculator}\raisedaster
+ \o \l{script/context2d}{Context2D}\raisedaster
+ \o \l{script/defaultprototypes}{Default Prototypes}\raisedaster
+ \o \l{script/helloscript}{Hello Script}\raisedaster
+ \o \l{script/qstetrix}{Qt Script Tetrix}\raisedaster
+ \o \l{script/customclass}{Custom Script Class}\raisedaster
+ \endlist
+
+ \section1 Rich Text
+
+ \list
+ \o \l{richtext/calendar}{Calendar}\raisedaster
+ \o \l{richtext/orderform}{Order Form}\raisedaster
+ \o \l{richtext/syntaxhighlighter}{Syntax Highlighter}\raisedaster
+ \o \l{richtext/textobject}{Text Object}\raisedaster
+ \endlist
+
+ \section1 SQL
+
+ \list
+ \o \l{sql/cachedtable}{Cached Table}\raisedaster
+ \o \l{sql/drilldown}{Drill Down}\raisedaster
+ \o \l{sql/querymodel}{Query Model}
+ \o \l{sql/relationaltablemodel}{Relational Table Model}
+ \o \l{sql/tablemodel}{Table Model}
+ \o \l{sql/sqlwidgetmapper}{SQL Widget Mapper}\raisedaster
+ \endlist
+
+ \section1 Threads
+
+ \list
+ \o \l{threads/mandelbrot}{Mandelbrot}\raisedaster
+ \o \l{threads/semaphores}{Semaphores}\raisedaster
+ \o \l{threads/waitconditions}{Wait Conditions}\raisedaster
+ \endlist
+
+ \section1 Tools
+
+ \list
+ \o \l{tools/codecs}{Codecs}
+ \o \l{tools/completer}{Completer}\raisedaster
+ \o \l{tools/customcompleter}{Custom Completer}\raisedaster
+ \o \l{tools/echoplugin}{Echo Plugin}\raisedaster
+ \o \l{tools/i18n}{I18N}
+ \o \l{tools/plugandpaint}{Plug & Paint}\raisedaster
+ \o Plug & Paint Plugins: \l{tools/plugandpaintplugins/basictools}{Basic Tools}\raisedaster
+ and \l{tools/plugandpaintplugins/extrafilters}{Extra Filters}\raisedaster
+ \o \l{tools/regexp}{RegExp}
+ \o \l{tools/settingseditor}{Settings Editor}
+ \o \l{tools/styleplugin}{Style Plugin}\raisedaster
+ \o \l{tools/treemodelcompleter}{Tree Model Completer}\raisedaster
+ \o \l{tools/undoframework}{Undo Framework}\raisedaster
+ \endlist
+
+ \section1 UiTools
+
+ \list
+ \o \l{uitools/multipleinheritance}{Multiple Inheritance}\raisedaster
+ \o \l{uitools/textfinder}{Text Finder}\raisedaster
+ \endlist
+
+ \section1 WebKit
+
+ \list
+ \o \l{webkit/previewer}{Previewer}\raisedaster
+ \o \l{webkit/formextractor}{Form Extractor}
+ \endlist
+
+ \section1 Widgets
+
+ \list
+ \o \l{widgets/analogclock}{Analog Clock}\raisedaster
+ \o \l{widgets/calculator}{Calculator}\raisedaster
+ \o \l{widgets/calendarwidget}{Calendar Widget}\raisedaster
+ \o \l{widgets/charactermap}{Character Map}\raisedaster
+ \o \l{widgets/codeeditor}{Code Editor}\raisedaster
+ \o \l{widgets/digitalclock}{Digital Clock}\raisedaster
+ \o \l{widgets/groupbox}{Group Box}\raisedaster
+ \o \l{widgets/icons}{Icons}\raisedaster
+ \o \l{widgets/imageviewer}{Image Viewer}\raisedaster
+ \o \l{widgets/lineedits}{Line Edits}\raisedaster
+ \o \l{widgets/movie}{Movie}
+ \o \l{widgets/scribble}{Scribble}\raisedaster
+ \o \l{widgets/shapedclock}{Shaped Clock}\raisedaster
+ \o \l{widgets/sliders}{Sliders}\raisedaster
+ \o \l{widgets/spinboxes}{Spin Boxes}\raisedaster
+ \o \l{widgets/styles}{Styles}\raisedaster
+ \o \l{widgets/stylesheet}{Style Sheet}\raisedaster
+ \o \l{widgets/tablet}{Tablet}\raisedaster
+ \o \l{widgets/tetrix}{Tetrix}\raisedaster
+ \o \l{widgets/tooltips}{Tooltips}\raisedaster
+ \o \l{widgets/wiggly}{Wiggly}\raisedaster
+ \o \l{widgets/windowflags}{Window Flags}\raisedaster
+ \endlist
+
+ \section1 XML
+
+ \list
+ \o \l{xml/dombookmarks}{DOM Bookmarks}
+ \o \l{xml/saxbookmarks}{SAX Bookmarks}
+ \o \l{xml/streambookmarks}{QXmlStream Bookmarks}\raisedaster
+ \o \l{xml/rsslisting}{RSS-Listing}
+ \o \l{xml/xmlstreamlint}{XML Stream Lint Example}\raisedaster
+ \endlist
+
+ \section1 XQuery, XPath
+
+ \list
+ \o \l{xmlpatterns/recipes}{Recipes}
+ \o \l{xmlpatterns/filetree}{File System Example}
+ \o \l{xmlpatterns/qobjectxmlmodel}{QObject XML Model Example}
+ \o \l{xmlpatterns/xquery/globalVariables}{C++ Source Code Analyzer Example}
+ \o \l{xmlpatterns/trafficinfo}{Traffic Info}\raisedaster
+ \endlist
+
+ \section1 Inter-Process Communication
+ \list
+ \o \l{ipc/localfortuneclient}{Local Fortune Client}\raisedaster
+ \o \l{ipc/localfortuneserver}{Local Fortune Server}\raisedaster
+ \o \l{ipc/sharedmemory}{Shared Memory}\raisedaster
+ \endlist
+*/
diff --git a/doc/src/examples/2dpainting.qdoc b/doc/src/examples/2dpainting.qdoc
new file mode 100644
index 0000000..31aea59
--- /dev/null
+++ b/doc/src/examples/2dpainting.qdoc
@@ -0,0 +1,224 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/2dpainting
+ \title 2D Painting Example
+
+ The 2D Painting example shows how QPainter and QGLWidget can be used
+ together to display accelerated 2D graphics on supported hardware.
+
+ \image 2dpainting-example.png
+
+ The QPainter class is used to draw 2D graphics primitives onto
+ paint devices provided by QPaintDevice subclasses, such as QWidget
+ and QImage.
+
+ Since QGLWidget is a subclass of QWidget, it is possible
+ to reimplement its \l{QWidget::paintEvent()}{paintEvent()} and use
+ QPainter to draw on the device, just as you would with a QWidget.
+ The only difference is that the painting operations will be accelerated
+ in hardware if it is supported by your system's OpenGL drivers.
+
+ In this example, we perform the same painting operations on a
+ QWidget and a QGLWidget. The QWidget is shown with anti-aliasing
+ enabled, and the QGLWidget will also use anti-aliasing if the
+ required extensions are supported by your system's OpenGL driver.
+
+ \section1 Overview
+
+ To be able to compare the results of painting onto a QGLWidget subclass
+ with native drawing in a QWidget subclass, we want to show both kinds
+ of widget side by side. To do this, we derive subclasses of QWidget and
+ QGLWidget, using a separate \c Helper class to perform the same painting
+ operations for each, and lay them out in a top-level widget, itself
+ provided a the \c Window class.
+
+ \section1 Helper Class Definition
+
+ In this example, the painting operations are performed by a helper class.
+ We do this because we want the same painting operations to be performed
+ for both our QWidget subclass and the QGLWidget subclass.
+
+ The \c Helper class is minimal:
+
+ \snippet examples/opengl/2dpainting/helper.h 0
+
+ Apart from the constructor, it only provides a \c paint() function to paint
+ using a painter supplied by one of our widget subclasses.
+
+ \section1 Helper Class Implementation
+
+ The constructor of the class sets up the resources it needs to paint
+ content onto a widget:
+
+ \snippet examples/opengl/2dpainting/helper.cpp 0
+
+ The actual painting is performed in the \c paint() function. This takes
+ a QPainter that has already been set up to paint onto a paint device
+ (either a QWidget or a QGLWidget), a QPaintEvent that provides information
+ about the region to be painted, and a measure of the elapsed time (in
+ milliseconds) since the paint device was last updated.
+
+ \snippet examples/opengl/2dpainting/helper.cpp 1
+
+ We begin painting by filling in the region contained in the paint event
+ before translating the origin of the coordinate system so that the rest
+ of the painting operations will be displaced towards the center of the
+ paint device.
+
+ We draw a spiral pattern of circles, using the elapsed time specified to
+ animate them so that they appear to move outward and around the coordinate
+ system's origin:
+
+ \snippet examples/opengl/2dpainting/helper.cpp 2
+
+ Since the coordinate system is rotated many times during
+ this process, we \l{QPainter::save()}{save()} the QPainter's state
+ beforehand and \l{QPainter::restore()}{restore()} it afterwards.
+
+ \snippet examples/opengl/2dpainting/helper.cpp 3
+
+ We draw some text at the origin to complete the effect.
+
+ \section1 Widget Class Definition
+
+ The \c Widget class provides a basic custom widget that we use to
+ display the simple animation painted by the \c Helper class.
+
+ \snippet examples/opengl/2dpainting/widget.h 0
+
+ Apart from the constructor, it only contains a
+ \l{QWidget::paintEvent()}{paintEvent()} function, that lets us draw
+ customized content, and a slot that is used to animate its contents.
+ One member variable keeps track of the \c Helper that the widget uses
+ to paint its contents, and the other records the elapsed time since
+ it was last updated.
+
+ \section1 Widget Class Implementation
+
+ The constructor only initializes the member variables, storing the
+ \c Helper object supplied and calling the base class's constructor,
+ and enforces a fixed size for the widget:
+
+ \snippet examples/opengl/2dpainting/widget.cpp 0
+
+ The \c animate() slot is called whenever a timer, which we define later, times
+ out:
+
+ \snippet examples/opengl/2dpainting/widget.cpp 1
+
+ Here, we determine the interval that has elapsed since the timer last
+ timed out, and we add it to any existing value before repainting the
+ widget. Since the animation used in the \c Helper class loops every second,
+ we can use the modulo operator to ensure that the \c elapsed variable is
+ always less than 1000.
+
+ Since the \c Helper class does all of the actual painting, we only have
+ to implement a paint event that sets up a QPainter for the widget and calls
+ the helper's \c paint() function:
+
+ \snippet examples/opengl/2dpainting/widget.cpp 2
+
+ \section1 GLWidget Class Definition
+
+ The \c GLWidget class definition is basically the same as the \c Widget
+ class except that it is derived from QGLWidget.
+
+ \snippet examples/opengl/2dpainting/glwidget.h 0
+
+ Again, the member variables record the \c Helper used to paint the
+ widget and the elapsed time since the previous update.
+
+ \section1 GLWidget Class Implementation
+
+ The constructor differs a little from the \c Widget class's constructor:
+
+ \snippet examples/opengl/2dpainting/glwidget.cpp 0
+
+ As well as initializing the \c elapsed member variable and storing the
+ \c Helper object used to paint the widget, the base class's constructor
+ is called with the format that specifies the \l QGL::SampleBuffers flag.
+ This enables anti-aliasing if it is supported by your system's OpenGL
+ driver.
+
+ The \c animate() slot is exactly the same as that provided by the \c Widget
+ class:
+
+ \snippet examples/opengl/2dpainting/glwidget.cpp 1
+
+ The \c paintEvent() is almost the same as that found in the \c Widget class:
+
+ \snippet examples/opengl/2dpainting/glwidget.cpp 2
+
+ Since anti-aliasing will be enabled if available, we only need to set up
+ a QPainter on the widget and call the helper's \c paint() function to display
+ the widget's contents.
+
+ \section1 Window Class Definition
+
+ The \c Window class has a basic, minimal definition:
+
+ \snippet examples/opengl/2dpainting/window.h 0
+
+ It contains a single \c Helper object that will be shared between all
+ widgets.
+
+ \section1 Window Class Implementation
+
+ The constructor does all the work, creating a widget of each type and
+ inserting them with labels into a layout:
+
+ \snippet examples/opengl/2dpainting/window.cpp 0
+
+ A timer with a 50 millisecond time out is constructed for animation purposes,
+ and connected to the \c animate() slots of the \c Widget and \c GLWidget objects.
+ Once started, the widgets should be updated at around 20 frames per second.
+
+ \section1 Running the Example
+
+ The example shows the same painting operations performed at the same time
+ in a \c Widget and a \c GLWidget. The quality and speed of rendering in the
+ \c GLWidget depends on the level of support for multisampling and hardware
+ acceleration that your system's OpenGL driver provides. If support for either
+ of these is lacking, the driver may fall back on a software renderer that
+ may trade quality for speed.
+*/
diff --git a/doc/src/examples/activeqt/comapp.qdoc b/doc/src/examples/activeqt/comapp.qdoc
new file mode 100644
index 0000000..05f3fb5
--- /dev/null
+++ b/doc/src/examples/activeqt/comapp.qdoc
@@ -0,0 +1,124 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example activeqt/comapp
+ \title COM App Example (ActiveQt)
+
+ The COM App example shows how to use ActiveQt to develop a Qt
+ application that can be automated via COM. Different QObject
+ based classes are exposed as COM objects that communicate with the
+ GUI of the running Qt application. The APIs of those COM objects
+ has been designed to resemble the APIs of standard COM
+ applications; i.e. those from Microsoft Office.
+
+ \snippet examples/activeqt/comapp/main.cpp 2
+ The first class \c Application represents the application object. It
+ exposes read-only properties \c documents and \c id to get access to the
+ list of documents, and an identifier. A read/write property \c visible
+ controls whether the QTabWidget-based user interface of the application
+ should be visible, and a slot \c quit() terminates the application.
+
+ The \e RegisterObject attribute is set to make sure that instances of this
+ class are registered in COM's running object table (ROT) - this allows COM
+ clients to connect to an already instantiated COM object.
+
+ \snippet examples/activeqt/comapp/main.cpp 1
+ The \c DocumentList class stores a list of documents. It provides an API
+ to read the number of documents, to access each document by index and to
+ create a new document. The \c application property returns the root object.
+
+ \snippet examples/activeqt/comapp/main.cpp 0
+
+ The \c Document class finally represents a document in the application.
+ Each document is represented by a page in the application's tab widget, and
+ has a title that is readable and writable through the document's API.
+ The \c application property again returns the root object.
+
+ \snippet examples/activeqt/comapp/main.cpp 3
+ The implementation of the \c Document class creates a new page for the tab
+ widget, and uses the title of that page for the title property. The page
+ is deleted when the document is deleted.
+
+ \snippet examples/activeqt/comapp/main.cpp 4
+ The \c DocumentList implementation is straightforward.
+
+ \snippet examples/activeqt/comapp/main.cpp 5
+ The \c Application class initializes the user interface in the constructor,
+ and shows and hides it in the implementation of \c setVisible(). The object
+ name (accessible through the \c id property) is set to \c "From QAxFactory"
+ to indicate that this COM object has been created by COM. Note that there is
+ no destructor that would delete the QTabWidget - this is instead done in the
+ \c quit() slot, before calling QApplication::quit() through a single-shot-timer,
+ which is necessary ensure that the COM call to the slot is complete.
+
+ \snippet examples/activeqt/comapp/main.cpp 6
+ The classes are exported from the server using the QAxFactory macros. Only
+ \c Application objects can be instantiated from outside - the other APIs can
+ only be used after accessing the respective objects throught the \c Application
+ API.
+
+ \snippet examples/activeqt/comapp/main.cpp 7
+ The main() entry point function creates a QApplication, and just enters the
+ event loop if the application has been started by COM. If the application
+ has been started by the user, then the \c Application object is created and
+ the object name is set to "From Application". Then the COM server is started,
+ and the application object is registered with COM. It is now accessible to
+ COM clients through the client-specific APIs.
+
+ Application exiting is controlled explicitly - if COM started the application,
+ then the client code has to call quit(); if the user started the application,
+ then the application terminates when the last window has been closed.
+
+ Finally, the user interface is made visible, and the event loop is started.
+
+ A simple Visual Basic application could now access this Qt application. In VB,
+ start a new "Standard Exe" project and add a project reference to the comappLib
+ type library. Create a form with a listbox "DocumentList", a static label
+ "DocumentsCount" and a command button "NewDocument". Finally, implement the code
+ for the form like this:
+
+ \snippet doc/src/snippets/code/doc_src_examples_activeqt_comapp.qdoc 0
+
+ To build the example you must first build the QAxServer library.
+ Then run \c qmake and your make tool in
+ \c{examples\activeqt\comapp}.
+*/
diff --git a/doc/src/examples/activeqt/dotnet.qdoc b/doc/src/examples/activeqt/dotnet.qdoc
new file mode 100644
index 0000000..afe7034
--- /dev/null
+++ b/doc/src/examples/activeqt/dotnet.qdoc
@@ -0,0 +1,355 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page activeqt-dotnet.html
+ \title Dot Net Example (ActiveQt)
+
+ The Dot Net example demonstrates how Qt objects can be used in a
+ .NET environment, and how .NET objects can be used in a Qt
+ environment.
+
+ If you need to combine Qt and Win Forms widgets in the same
+ application, you might want to use the higher-level
+ \l{QtWinForms Solution} instead.
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Qt vs. .NET
+
+ Qt is a C++ library and is compiled into traditional, native
+ binaries that make full use of the performance provided by the
+ runtime environment.
+
+ One of the key concepts of .NET is the idea of "intermediate language
+ code" - the source code is compiled into a bytecode format, and at
+ runtime, that bytecode is executed in a virtual machine - the \e
+ {Common Language Runtime} (CLR).
+
+ Another key concept is that of \e {managed code}. This is essentially
+ intermediate language code written in such a way that the CLR can take
+ care of the memory management, i.e. the CLR will do automatic garbage
+ collection, so the application code does not need to explicitly free
+ the memory for unused objects.
+
+ The MS compilers for C# and VB.NET will only produce managed
+ code. Such programs cannot directly call normal, native functions
+ or classes. \footnote The .NET framework provides Platform Invocation
+ Services - P/Invoke - that enable managed code to call native C (not
+ C++) functions located in DLLs directly. The resulting application
+ then becomes partially unmanaged.\endfootnote
+
+ The MS C++ compiler for .NET on the other hand, can produce both
+ normal and managed code. To write a C++ class that can be compiled
+ into managed code, the developer must flag the class as managed using
+ the \c __gc keyword, and restrict the code to only use the subset of
+ C++ known as "Managed Extensions for C++", or MC++ for short. The
+ advantage is that MC++ code can freely call and use normal C++
+ functions and classes. And it also works the other way around: normal
+ C++ code can call managed functions and use managed classes (e.g. the
+ entire .NET framework class library), including managed functions and
+ classes implemented in C# or VB.NET. This feature of mixing managed
+ and normal C++ code immensely eases the interoperability with .NET,
+ and is by Microsoft referred to as the "It Just Works" (IJW) feature.
+
+ This document demonstrates two different ways of integrating normal
+ C++ code (that uses Qt) with managed .NET code. First, the manual way
+ is presented, which includes using a thin MC++ wrapper class around
+ the normal Qt/C++ class. Then, the automated way is presented, which
+ utilizes the ActiveQt framework as a generic bridge. The advantage of
+ the first method is that it gives the application developer full
+ control, while the second method requires less coding and relieves the
+ developer of dealing with the conversion between managed and normal
+ data objects.
+
+ The impatient reader, who right away wants to see a QPushButton
+ and a custom Qt widget (\l{activeqt/multiple}{QAxWidget2}) run in
+ a .NET GUI application is referred to the example directory of
+ ActiveQt. It contains the result of this walkthrough using both
+ C# and VB.NET, created with Visual Studio .NET (not 2003).
+ Load \c {examples/dotnet/walkthrough/csharp.csproj},
+ \c {examples/dotnet/walkthrough/vb.vbproj}
+ or \c {examples/dotnet/wrapper/wrapper.sln} into the IDE and run
+ the solution.
+
+ \bold{Remark:} You will notice that in the generated code the following line is
+ commented out:
+
+ \snippet doc/src/snippets/code/doc_src_examples_activeqt_dotnet.qdoc 0
+
+ This line is regenerated without comment whenever you change the
+ dialog, in which case you have to comment it out again to be able
+ to run the project. This is a bug in the original version of
+ Visual Studio.NET, and is fixed in the 2003 edition.
+
+ \section1 Walkthrough: .NET interop with MC++ and IJW
+
+ Normal C++ classes and functions can be used from managed .NET code by
+ providing thin wrapper classes written in MC++. The wrapper class will
+ take care of forwarding the calls to the normal C++ functions or
+ methods, and converting parameter data as necessary. Since the wrapper
+ class is a managed class, it can be used without further ado in any
+ managed .NET application, whether written in C#, VB.NET, MC++ or other
+ managed programming language.
+
+ \snippet examples/activeqt/dotnet/wrapper/lib/worker.h 0
+
+ The Qt class has nothing unusual for Qt users, and as even the Qt
+ specialities like \c Q_PROPERTY, \c slots and \c signals are
+ implemented with straight C++ they don't cause any trouble when
+ compiling this class with any C++ compiler.
+
+ \snippet examples/activeqt/dotnet/wrapper/lib/networker.h 0
+
+ The .NET wrapper class uses keywords that are part of MC++ to indicate
+ that the class is managed/garbage collected (\c {__gc}), and that \c
+ StatusString should be accessible as a property in languages that
+ support this concept (\c {__property}). We also declare an event
+ function \c statusStringChanged(String*) (\c {__event}), the
+ equivalent of the respective signal in the Qt class.
+
+ Before we can start implementing the wrapper class we need a way to
+ convert Qt's datatypes (and potentionally your own) into .NET
+ datatypes, e.g. \c QString objects need to be converted into objects
+ of type \c {String*}.
+
+ When operating on managed objects in normal C++ code, a little extra
+ care must be taken because of the CLR's garbage collection. A normal
+ pointer variable should not \footnote Indeed, the compiler will in
+ many cases disallow it. \endfootnote be used to refer to a managed
+ object. The reason is that the garbage collection can kick in at any
+ time and move the object to another place on the heap, leaving you
+ with an invalid pointer.
+
+ However, two methods are provided that solves this problem easily. The
+ first is to use a \e pinned pointer, i.e. declare the pointer variable
+ with the \c __pin keyword. This guarantees that the object pointed to
+ will not be moved by the garbage collector. It is recommended that
+ this method not be used to keep a references to managed objects for a
+ long time, since it will decrease the efficiency of the garbage
+ collector. The second way is to use the \c gcroot smartpointer
+ template type. This lets you create safe pointers to managed
+ objects. E.g. a variable of type \c gcroot<String> will always point
+ to the String object, even if it has been moved by the garbage
+ collector, and it can be used just like a normal pointer.
+
+ \snippet examples/activeqt/dotnet/wrapper/lib/tools.cpp 0
+ \codeline
+ \snippet examples/activeqt/dotnet/wrapper/lib/tools.cpp 1
+
+ The convertor functions can then be used in the wrapper class
+ implementation to call the functions in the native C++ class.
+
+ \snippet examples/activeqt/dotnet/wrapper/lib/networker.cpp 0
+ \codeline
+ \snippet examples/activeqt/dotnet/wrapper/lib/networker.cpp 1
+
+ The constructor and destructor simply create and destroy the Qt
+ object wrapped using the C++ operators \c new and \c delete.
+
+ \snippet examples/activeqt/dotnet/wrapper/lib/networker.cpp 2
+
+ The netWorker class delegates calls from the .NET code to the native
+ code. Although the transition between those two worlds implies a small
+ performance hit for each function call, and for the type conversion,
+ this should be negligible since we are anyway going to run within the
+ CLR.
+
+ \snippet examples/activeqt/dotnet/wrapper/lib/networker.cpp 3
+
+ The property setter calls the native Qt class before firing the
+ event using the \c __raise keyword.
+
+ This wrapper class can now be used in .NET code, e.g. using C++, C#,
+ Visual Basic or any other programming language available for .NET.
+
+ \snippet examples/activeqt/dotnet/wrapper/main.cs 0
+ \snippet examples/activeqt/dotnet/wrapper/main.cs 1
+ \snippet examples/activeqt/dotnet/wrapper/main.cs 2
+ \snippet examples/activeqt/dotnet/wrapper/main.cs 3
+
+ \section1 Walkthrough: .NET/COM Interop with ActiveQt
+
+ Fortunately .NET provides a generic wrapper for COM objects, the
+ \e {Runtime Callable Wrapper} (RCW). This RCW is a proxy for the
+ COM object and is generated by the CLR when a .NET Framework client
+ activates a COM object. This provides a generic way to reuse COM
+ objects in a .NET Framework project.
+
+ Making a QObject class into a COM object is easily achieved with
+ ActiveQt and demonstrated in the QAxServer examples (e.g., the
+ \l{activeqt/simple}{Simple} example). The walkthrough will use
+ the Qt classes implemented in those examples, so the first thing
+ to do is to make sure that those examples have been built
+ correctly, e.g. by opening the
+ \l{qaxserver-demo-multiple.html}{demonstration pages} in Internet
+ Explorer to verify that the controls are functional.
+
+ \section2 Starting a Project
+
+ Start Visual Studio.NET, and create a new C# project for writing a
+ Windows application. This will present you with an empty form in
+ Visual Studio's dialog editor. You should see the toolbox, which
+ presents you with a number of available controls and objects in
+ different categories. If you right-click on the toolbox it allows
+ you to add new tabs. We will add the tab "Qt".
+
+ \section2 Importing Qt Widgets
+
+ The category only has a pointer tool by default, and we have to add
+ the Qt objects we want to use in our form. Right-click on the empty
+ space, and select "Customize". This opens a dialog that has two
+ tabs, "COM Components" and ".NET Framework Components". We used
+ ActiveQt to wrap QWidgets into COM objects, so we select the "COM
+ Components" page, and look for the classes we want to use, e.g.
+ "QPushButton" and "QAxWidget2".
+
+ When we select those widgets and close the dialog the two widgets
+ will now be available from the toolbox as grey squares with their
+ name next to it \footnote Icons could be added by modifying the
+ way the controls register themselves. \endfootnote.
+
+ \section2 Using Qt Widgets
+
+ We can now add an instance of QAxWidget2 and a QPushButton to
+ the form. Visual Studio will automatically generate the RCW for the
+ object servers. The QAxWidget2 instance takes most of the upper
+ part of the form, with the QPushButton in the lower right corner.
+
+ In the property editor of Visual Studio we can modify the properties
+ of our controls - QPushButton exposes the \c QWidget API and has many
+ properties, while QAxWidget2 has only the Visual Studio standard
+ properties in addition to its own property "lineWidth" in the
+ "Miscellaneous" category. The objects are named "axQPushButton1" and
+ "axQAxWidget21", and since especially the last name is a bit
+ confusing we rename the objects to "resetButton" and "circleWidget".
+
+ We can also change the Qt properties, e.g. set the "text" property
+ of the \c resetButton to "Reset", and the "lineWidth" property of the
+ \c circleWidget to 5. We can also put those objects into the layout
+ system that Visual Studio's dialog editor provides, e.g. by setting
+ the anchors of the \c circleWidget to "Left, Top, Right, Bottom", and
+ the anchors of the \c resetButton to "Bottom, Right".
+
+ Now we can compile and start the project, which will open a user
+ interface with our two Qt widgets. If we can resize the dialog,
+ the widgets will resize appropriately.
+
+ \section2 Handling Qt Signals
+
+ We will now implement event handlers for the widgets. Select the
+ \c circleWidget and select the "Events" page in the property
+ editor. The widget exposes events because the QAxWidget2 class has
+ the "StockEvents" attribute set in its class definition. We implement
+ the event handler \c circleClicked for the \c ClickEvent to increase
+ the line width by one for every click:
+
+ \snippet examples/activeqt/dotnet/walkthrough/Form1.cs 0
+
+ In general we can implement a default event handler by double
+ clicking on the widget in the form, but the default events for
+ our widgets are right now not defined.
+
+ We will also implement an event handler for the \c clicked signal
+ emitted by QPushButton. Add the event handler \c resetLineWidth to
+ the \c clicked event, and implement the generated function:
+
+ \snippet examples/activeqt/dotnet/walkthrough/Form1.cs 1
+
+ We reset the property to 1, and also call the \c setFocus() slot
+ to simulate the user style on Windows, where a button grabs focus
+ when you click it (so that you can click it again with the spacebar).
+
+ If we now compile and run the project we can click on the circle
+ widget to increase its line width, and press the reset button to
+ set the line width back to 1.
+
+ \section1 Summary
+
+ Using ActiveQt as a universal interoperability bridge between the
+ .NET world and the native world of Qt is very easy, and makes it
+ often unnecessary to implement a lot of handwritten wrapper classes.
+ Instead, the QAxFactory implementation in the otherwise completely
+ cross-platform Qt project provides the glue that .NET needs to to
+ generate the RCW.
+
+ If this is not sufficient we can implement our own wrapper classes
+ thanks to the C++ extensions provided by Microsoft.
+
+ \section2 Limitations
+
+ All the limitations when using ActiveQt are implied when using this
+ technique to interoperate with .NET, e.g. the datatypes we can use
+ in the APIs can only be those supported by ActiveQt and COM. However,
+ since this includes subclasses of QObject and QWidget we can wrap
+ any of our datatypes into a QObject subclass to make its API
+ available to .NET. This has the positive side effect that the same
+ API is automatically available in
+ \l{http://qtsoftware.com/products/qsa/}{QSA}, the cross platform
+ scripting solution for Qt applications, and to COM clients in general.
+
+ When using the "IJW" method, in priciple the only limitation is the
+ time required to write the wrapper classes and data type conversion
+ functions.
+
+ \section2 Performance Considerations
+
+ Every call from CLR bytecode to native code implies a small
+ performance hit, and necessary type conversions introduce an
+ additional delay with every layer that exists between the two
+ frameworks. Consequently every approach to mix .NET and native
+ code should try to minimize the communication necessary between
+ the different worlds.
+
+ As ActiveQt introduces three layers at once - the RCW, COM and finally
+ ActiveQt itself - the performance penalty when using the generic
+ Qt/ActiveQt/COM/RCW/.NET bridge is larger than when using a
+ hand-crafted IJW-wrapper class. The execution speed however is still
+ sufficient for connecting to and modifying interactive elements in a
+ user interface, and as soon as the benefit of using Qt and C++ to
+ implement and compile performance critical algorithms into native code
+ kicks in, ActiveQt becomes a valid choice for making even non-visual
+ parts of your application accessible to .NET.
+
+ \sa {QtWinForms Solution}
+*/
diff --git a/doc/src/examples/activeqt/hierarchy-demo.qdocinc b/doc/src/examples/activeqt/hierarchy-demo.qdocinc
new file mode 100644
index 0000000..9d0cb5e
--- /dev/null
+++ b/doc/src/examples/activeqt/hierarchy-demo.qdocinc
@@ -0,0 +1,43 @@
+\raw HTML
+//! [0]
+<script language="javascript">
+function createSubWidget( form )
+{
+ ParentWidget.createSubWidget( form.nameEdit.value );
+}
+
+function renameSubWidget( form )
+{
+ var SubWidget = ParentWidget.subWidget( form.nameEdit.value );
+ if ( !SubWidget ) {
+ alert( "No such widget " + form.nameEdit.value + "!" );
+ return;
+ }
+ SubWidget.label = form.labelEdit.value;
+ form.nameEdit.value = SubWidget.label;
+}
+
+function setFont( form )
+{
+ ParentWidget.font = form.fontEdit.value;
+}
+</script>
+
+<p>
+This widget can have many children!
+</p>
+<object ID="ParentWidget" CLASSID="CLSID:d574a747-8016-46db-a07c-b2b4854ee75c"
+CODEBASE="http://qtsoftware.com/demos/hierarchy.cab">
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+<form>
+<input type="edit" ID="nameEdit" value="&lt;enter object name&gt;" />
+<input type="button" value="Create" onClick="createSubWidget(this.form)" />
+<input type="edit" ID="labelEdit" />
+<input type="button" value="Rename" onClick="renameSubWidget(this.form)" />
+<br />
+<input type="edit" ID="fontEdit" value="MS Sans Serif" />
+<input type="button" value = "Set Font" onClick="setFont(this.form)" />
+</form>
+//! [0]
+\endraw
diff --git a/doc/src/examples/activeqt/hierarchy.qdoc b/doc/src/examples/activeqt/hierarchy.qdoc
new file mode 100644
index 0000000..868d0ce
--- /dev/null
+++ b/doc/src/examples/activeqt/hierarchy.qdoc
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qaxserver-demo-hierarchy.html
+ \title Qt Widget Hierarchy
+
+ \input examples/activeqt/hierarchy-demo.qdocinc
+*/
+
+/*!
+ \example activeqt/hierarchy
+ \title Hierarchy Example (ActiveQt)
+
+ The Hierarchy example is shows how to write an in-process ActiveX
+ control. The control is a QWidget subclass with child widgets
+ that are accessible as sub-types.
+
+ \snippet examples/activeqt/hierarchy/objects.h 0
+ The \c QParentWidget class provides slots to create a widget
+ with a name, and to return a pointer to a named widget. The class
+ declaration uses \c Q_CLASSINFO() to provide the COM identifiers for
+ this class.
+
+ \snippet examples/activeqt/hierarchy/objects.cpp 0
+ The constructor of QParentWidget creates a vertical box layout.
+ New child widgets are automatically added to the layout.
+
+ \snippet examples/activeqt/hierarchy/objects.cpp 1
+ The \c createSubWidget slot creates a new \c QSubWidget with
+ the name provided in the parameter, and sets the label to that
+ name. The widget is also shown explicitly.
+
+ \snippet examples/activeqt/hierarchy/objects.cpp 2
+ The \c subWidget slot uses the \c QObject::child() function and
+ returns the first child of type \c QSubWidget that has the requested
+ name.
+
+ \snippet examples/activeqt/hierarchy/objects.h 1
+ The \c QSubWidget class has a single string-property \c label,
+ and implements the paintEvent to draw the label. The class uses
+ again \c Q_CLASSINFO to provide the COM identifiers, and also sets
+ the \e ToSuperClass attribute to \e QSubWidget, to ensure that only
+ no slots of any superclasses (i.e. QWidget) are exposed.
+
+ \snippet examples/activeqt/hierarchy/objects.cpp 3
+ \snippet examples/activeqt/hierarchy/objects.cpp 4
+ The implementation of the QSubWidget class is self-explanatory.
+
+ \snippet examples/activeqt/hierarchy/main.cpp 0
+ The classes are then exported using a QAxFactory. \c QParentWidget is
+ exported as a full class (which can be created ), while \c QSubWidget is
+ only exported as a type, which can only be created indirectly through
+ APIs of \c QParentWidget.
+
+ To build the example you must first build the QAxServer library.
+ Then run qmake and your make tool in \c examples/activeqt/hierarchy.
+
+ The \l{qaxserver-demo-hierarchy.html}{demonstration} requires
+ your WebBrowser to support ActiveX controls, and scripting to be
+ enabled.
+
+ \snippet examples/activeqt/hierarchy-demo.qdocinc 0
+*/
diff --git a/doc/src/examples/activeqt/menus.qdoc b/doc/src/examples/activeqt/menus.qdoc
new file mode 100644
index 0000000..6ce1625
--- /dev/null
+++ b/doc/src/examples/activeqt/menus.qdoc
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qaxserver-demo-menus.html
+ \preliminary
+
+ \title Menubar Merging
+
+ This example is not full functional at the moment.
+
+ \raw HTML
+ <object ID="QMenus" CLASSID="CLSID:4dc3f340-a6f7-44e4-a79b-3e9217695fbd"
+ CODEBASE="http://qtsoftware.com/demos/menusax.cab">
+ [Object not available! Did you forget to build and register the server?]
+ </object>
+ \endraw
+*/
+
+/*!
+ \example activeqt/menus
+ \title Menus Example (ActiveQt)
+
+ The Menus example demonstrates the use of QMenuBar and QStatusBar
+ in a QMainWindow to implement an in-place active control.
+
+ To build the example you must first build the QAxServer library.
+ Then run \c qmake and your make tool in \c
+ examples/activeqt/menus.
+
+ The \l{qaxserver-demo-menus.html}{demonstration} requires your
+ WebBrowser to support ActiveX controls, and scripting to be
+ enabled.
+
+ \snippet doc/src/snippets/code/doc_src_examples_activeqt_menus.qdoc 0
+*/
diff --git a/doc/src/examples/activeqt/multiple-demo.qdocinc b/doc/src/examples/activeqt/multiple-demo.qdocinc
new file mode 100644
index 0000000..ee174bf
--- /dev/null
+++ b/doc/src/examples/activeqt/multiple-demo.qdocinc
@@ -0,0 +1,39 @@
+\raw HTML
+//! [0]
+<script language="javascript">
+function setColor( form )
+{
+ Ax1.fillColor = form.colorEdit.value;
+}
+
+function setWidth( form )
+{
+ Ax2.lineWidth = form.widthEdit.value;
+}
+</script>
+
+<p />
+This is one QWidget subclass:<br />
+<object ID="Ax1" CLASSID="CLSID:1D9928BD-4453-4bdd-903D-E525ED17FDE5"
+CODEBASE="http://qtsoftware.com/demos/multipleax.cab">
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+<form>
+Fill Color: <input type="edit" ID="colorEdit" value = "red" />
+<input type="button" value = "Set" onClick="setColor(this.form)" />
+<input type="button" value = "Hide" onClick="Ax1.hide()" />
+<input type="button" value = "Show" onClick="Ax1.show()" />
+</form>
+
+<p />
+This is another QWidget subclass:<br />
+<object ID="Ax2" CLASSID="CLSID:58139D56-6BE9-4b17-937D-1B1EDEDD5B71"
+CODEBASE="http://qtsoftware.com/demos/multipleax.cab">
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+<form>
+Line width: <input type="edit" ID="widthEdit" value = "1" />
+<input type="button" value = "Set" onClick="setWidth(this.form)" />
+</form>
+//! [0]
+\endraw
diff --git a/doc/src/examples/activeqt/multiple.qdoc b/doc/src/examples/activeqt/multiple.qdoc
new file mode 100644
index 0000000..d15371b
--- /dev/null
+++ b/doc/src/examples/activeqt/multiple.qdoc
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qaxserver-demo-multiple.html
+ \title Two Simple Qt Widgets
+
+ \input examples/activeqt/multiple-demo.qdocinc
+*/
+
+/*!
+ \example activeqt/multiple
+ \title Multiple Example (ActiveQt)
+
+ The Multiple example demonstrates the implementation of a
+ QAxFactory to provide multiple ActiveX controls in a single in
+ process ActiveX server using the \c QAXFACTORY_EXPORT() macro.
+ The ActiveX controls in this example are simple QWidget
+ subclasses that reimplement QWidget::paintEvent().
+
+ \snippet examples/activeqt/multiple/ax1.h 0
+
+ The first control draws a filled rectangle. The fill color is exposed
+ as a property. \c Q_CLASSINFO() is used to specify the COM identifiers.
+
+ \snippet examples/activeqt/multiple/ax2.h 0
+
+ The second control draws a circle. The linewith is exposed as a property.
+ \c Q_CLASSINFO() is used to specify the COM identifiers, and to set the
+ attributes \e ToSuperClass and \e StockEvents to expose only the API of
+ the class itself, and to add COM stock events to the ActiveX control.
+
+ \snippet examples/activeqt/multiple/main.cpp 0
+
+ The classes are exported from the server using the QAxFactory macros.
+
+ To build the example you must first build the QAxServer library.
+ Then run \c qmake and your make tool in \c
+ examples/activeqt/multiple.
+
+ The \l{qaxserver-demo-multiple.html}{demonstration} requires your
+ WebBrowser to support ActiveX controls, and scripting to be
+ enabled.
+
+ \snippet examples/activeqt/multiple-demo.qdocinc 0
+*/
diff --git a/doc/src/examples/activeqt/opengl-demo.qdocinc b/doc/src/examples/activeqt/opengl-demo.qdocinc
new file mode 100644
index 0000000..44df0c4
--- /dev/null
+++ b/doc/src/examples/activeqt/opengl-demo.qdocinc
@@ -0,0 +1,27 @@
+\raw HTML
+//! [0]
+<SCRIPT LANGUAGE="JavaScript">
+function setRot( form )
+{
+ GLBox.setXRotation( form.XEdit.value );
+ GLBox.setYRotation( form.YEdit.value );
+ GLBox.setZRotation( form.ZEdit.value );
+}
+</SCRIPT>
+
+<p />
+An OpenGL scene:<br />
+<object ID="GLBox" CLASSID="CLSID:5fd9c22e-ed45-43fa-ba13-1530bb6b03e0"
+CODEBASE="http://qtsoftware.com/demos/openglax.cab">
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+
+<form>
+Rotate the scene:<br />
+X:<input type="edit" ID="XEdit" value="0" /><br />
+Y:<input type="edit" name="YEdit" value="0" /><br />
+Z:<input type="edit" name="ZEdit" value="0" /><br />
+<input type="button" value="Set" onClick="setRot(this.form)" />
+</form>
+//! [0]
+\endraw
diff --git a/doc/src/examples/activeqt/opengl.qdoc b/doc/src/examples/activeqt/opengl.qdoc
new file mode 100644
index 0000000..05c9d08
--- /dev/null
+++ b/doc/src/examples/activeqt/opengl.qdoc
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qaxserver-demo-opengl.html
+
+ \title OpenGL in an HTML page
+
+ \raw HTML
+ <SCRIPT LANGUAGE="JavaScript">
+ function setRot( form )
+ {
+ GLBox.setXRotation( form.XEdit.value );
+ GLBox.setYRotation( form.YEdit.value );
+ GLBox.setZRotation( form.ZEdit.value );
+ }
+ </SCRIPT>
+
+ <p />
+ An OpenGL scene:<br />
+ <object ID="GLBox" CLASSID="CLSID:5fd9c22e-ed45-43fa-ba13-1530bb6b03e0"
+ CODEBASE="http://qtsoftware.com/demos/openglax.cab">
+ [Object not available! Did you forget to build and register the server?]
+ </object><br />
+
+ <form>
+ Rotate the scene:<br />
+ X:<input type="edit" ID="XEdit" value="0" /><br />
+ Y:<input type="edit" name="YEdit" value="0" /><br />
+ Z:<input type="edit" name="ZEdit" value="0" /><br />
+ <input type="button" value="Set" onClick="setRot(this.form)" />
+ </form>
+ \endraw
+*/
+
+/*!
+ \example activeqt/opengl
+ \title OpenGL Example (ActiveQt)
+
+ The OpenGL example demonstrates the use of the default factory
+ and QAxFactory::isServer(), and the implementation of an
+ additional COM interface using QAxBindable and QAxAggregated.
+ The server executable can run both as an ActiveX server and as a
+ stand-alone application.
+
+ The ActiveX control in this example uses the QGlWidget class in
+ Qt to render an OpenGL scene in an ActiveX. The control exposes a few
+ methods to change the scene.
+
+ The application uses the default factory as provided by the
+ QAXFACTORY_DEFAULT macro to expose the \c GLBox widget as an ActiveX
+ control.
+ \snippet examples/activeqt/opengl/main.cpp 0
+ The implementation of \c main initializes the QApplication object,
+ and uses \c QAxFactory::isServer() to determine whether or not it is
+ appropriate to create and show the application interface.
+ \snippet examples/activeqt/opengl/main.cpp 1
+ \snippet examples/activeqt/opengl/main.cpp 2
+ \snippet examples/activeqt/opengl/main.cpp 3
+
+ The \c GLBox class inherits from both the \l QGLWidget class to be able
+ to render OpenGL, and from \l QAxBindable.
+ \snippet examples/activeqt/opengl/glbox.h 0
+ The class reimplements the \l QAxBindable::createAggregate() function from QAxBindable
+ to return the pointer to a \l QAxAggregated object.
+ \snippet examples/activeqt/opengl/glbox.h 1
+ The rest of the class declaration and the implementation of the OpenGL
+ rendering is identical to the original "box" example.
+
+ The implementation file of the \c GLBox class includes the \c objsafe.h
+ system header, in which the \c IObjectSafety COM interface is defined.
+ \snippet examples/activeqt/opengl/glbox.cpp 0
+ A class \c ObjectSafetyImpl is declared using multiple inheritance
+ to subclass the QAxAggregated class, and to implement the IObjectSafety
+ interface.
+ \snippet examples/activeqt/opengl/glbox.cpp 1
+ The class declares a default constructor, and implements the queryInterface
+ function to support the IObjectSafety interface.
+ \snippet examples/activeqt/opengl/glbox.cpp 2
+ Since every COM interface inherits \c IUnknown the \c QAXAGG_IUNKNOWN macro
+ is used to provide the default implementation of the \c IUnknown interface.
+ The macro is defined to delegate all calls to \c QueryInterface, \c AddRef
+ and \c Release to the interface returned by the controllingUnknown() function.
+ \snippet examples/activeqt/opengl/glbox.cpp 3
+ The implementation of the \c IObjectSafety interface provides the caller
+ with information about supported and enabled safety options, and returns
+ \c S_OK for all calls to indicate that the ActiveX control is safe.
+ \snippet examples/activeqt/opengl/glbox.cpp 4
+ The implementation of the \c createAggregate() function just returns a new
+ \c ObjectSafetyImpl object.
+ \snippet examples/activeqt/opengl/glbox.cpp 5
+
+ To build the example you must first build the QAxServer library.
+ Then run \c qmake and your make tool in \c
+ examples/activeqt/wrapper.
+
+ The \l{qaxserver-demo-opengl.html}{demonstration} requires your
+ WebBrowser to support ActiveX controls, and scripting to be
+ enabled.
+
+ In contrast to the other QAxServer examples Internet Explorer will not
+ open a dialog box to ask the user whether or not the scripting of the GLBox
+ control should be allowed (the exact browser behaviour depends on the security
+ settings in the Internet Options dialog).
+
+ \snippet doc/src/examples/activeqt/opengl-demo.qdocinc 0
+*/
diff --git a/doc/src/examples/activeqt/qutlook.qdoc b/doc/src/examples/activeqt/qutlook.qdoc
new file mode 100644
index 0000000..c29feeb
--- /dev/null
+++ b/doc/src/examples/activeqt/qutlook.qdoc
@@ -0,0 +1,116 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example activeqt/qutlook
+ \title Qutlook Example (ActiveQt)
+
+ The Qutlook example demonstrates the use of ActiveQt to automate
+ Outlook. The example makes use of the \l dumpcpp tool to generate
+ a C++ namespace for the type library describing the Outlook
+ Object Model.
+
+ The project file for the example looks like this:
+
+ \snippet examples/activeqt/qutlook/qutlook.pro 1
+ \snippet examples/activeqt/qutlook/qutlook.pro 2
+
+ The project file uses the \c dumpcpp tool to add an MS Outlook type library to the project.
+ If this fails, then the generated makefile will just print an error message, otherwise
+ the build step will now run the \e dumpcpp tool on the type library, and
+ generate a header and a cpp file (in this case, \c msoutl.h and \c msoutl.cpp) that
+ declares and implement an easy to use API to the Outlook objects.
+
+ \snippet examples/activeqt/qutlook/addressview.h 0
+
+ The AddressView class is a QWidget subclass for the user interface. The QTreeView widget
+ will display the contents of Outlook's Contact folder as provided by the \c{model}.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 0
+ The AddressBookModel class is a QAbstractListModel subclass that communicates directly with
+ Outlook, using a QHash for caching.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 1
+ The constructor initializes Outlook. The various signals Outlook provides to notify about
+ contents changes are connected to the \c updateOutlook() slot.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 2
+ The destructor logs off from the session.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 3
+ The \c rowCount() implementation returns the number of entries as reported by Outlook. \c columnCount
+ and \c headerData are implemented to show four columns in the tree view.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 4
+ The \c headerData() implementation returns hardcoded strings.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 5
+ The \c data() implementation is the core of the model. If the requested data is in the cache the
+ cached value is used, otherwise the data is acquired from Outlook.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 6
+ The \c changeItem() slot is called when the user changes the current entry using the user interface.
+ The Outlook item is accessed using the Outlook API, and is modified using the property setters.
+ Finally, the item is saved to Outlook, and removed from the cache. Note that the model does not
+ signal the view of the data change, as Outlook will emit a signal on its own.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 7
+ The \c addItem() slot calls the CreateItem method of Outlook to create a new contact item,
+ sets the properties of the new item to the values entered by the user and saves the item.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 8
+ The \c update() slot clears the cache, and emits the reset() signal to notify the view about the
+ data change requiring a redraw of the contents.
+
+ \snippet examples/activeqt/qutlook/addressview.cpp 9
+ \snippet examples/activeqt/qutlook/addressview.cpp 10
+ The rest of the file implements the user interface using only Qt APIs, i.e. without communicating
+ with Outlook directly.
+
+ \snippet examples/activeqt/qutlook/main.cpp 0
+
+ The \c main() entry point function finally instantiates the user interface and enters the
+ event loop.
+
+ To build the example you must first build the QAxContainer
+ library. Then run your make tool in \c examples/activeqt/qutlook
+ and run the resulting \c qutlook.exe.
+*/
diff --git a/doc/src/examples/activeqt/simple-demo.qdocinc b/doc/src/examples/activeqt/simple-demo.qdocinc
new file mode 100644
index 0000000..45a346c
--- /dev/null
+++ b/doc/src/examples/activeqt/simple-demo.qdocinc
@@ -0,0 +1,45 @@
+\raw HTML
+//! [0]
+<object ID="QSimpleAX" CLASSID="CLSID:DF16845C-92CD-4AAB-A982-EB9840E74669"
+CODEBASE="http://qtsoftware.com/demos/simpleax.cab">
+ <PARAM NAME="text" VALUE="A simple control" />
+ <PARAM NAME="value" VALUE="1" />
+[Object not available! Did you forget to build and register the server?]
+</object>
+//! [0] //! [1]
+
+<FORM>
+ <INPUT TYPE="BUTTON" VALUE="About..." onClick="QSimpleAX.about()" />
+</FORM>
+//! [1]
+
+//! [2]
+<object ID="Calendar" CLASSID="CLSID:8E27C92B-1264-101C-8A2F-040224009C02">
+[Standard Calendar control not available!]
+ <PARAM NAME="day" VALUE="1" />
+</object>
+//! [2]
+
+<FORM>
+ <INPUT TYPE="BUTTON" VALUE="Today" onClick="Calendar.Today()" />
+</FORM>
+
+//! [3]
+<SCRIPT LANGUAGE="VBScript">
+Sub Calendar_Click()
+ MsgBox( "Calendar Clicked!" )
+End Sub
+
+Sub QSimpleAX_TextChanged( str )
+ document.title = str
+End Sub
+</SCRIPT>
+
+<SCRIPT LANGUAGE="JavaScript">
+function QSimpleAX::ValueChanged( Newvalue )
+{
+ Calendar.Day = Newvalue;
+}
+</SCRIPT>
+//! [3]
+\endraw
diff --git a/doc/src/examples/activeqt/simple.qdoc b/doc/src/examples/activeqt/simple.qdoc
new file mode 100644
index 0000000..e79e542
--- /dev/null
+++ b/doc/src/examples/activeqt/simple.qdoc
@@ -0,0 +1,130 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qaxserver-demo-simple.html
+
+ \title A standard ActiveX and the "simple" ActiveQt widget
+
+ \raw HTML
+ <object ID="QSimpleAX" CLASSID="CLSID:DF16845C-92CD-4AAB-A982-EB9840E74669"
+ CODEBASE="http://qtsoftware.com/demos/simpleax.cab">
+ <PARAM NAME="text" VALUE="A simple control" />
+ <PARAM NAME="value" VALUE="1" />
+ [Object not available! Did you forget to build and register the server?]
+ </object>
+
+ <FORM>
+ <INPUT TYPE="BUTTON" VALUE="About..." onClick="QSimpleAX.about()" />
+ </FORM>
+
+ <object ID="Calendar" CLASSID="CLSID:8E27C92B-1264-101C-8A2F-040224009C02">
+ [Standard Calendar control not available!]
+ <PARAM NAME="day" VALUE="1" />
+ </object>
+
+ <FORM>
+ <INPUT TYPE="BUTTON" VALUE="Today" onClick="Calendar.Today()" />
+ </FORM>
+
+ <SCRIPT LANGUAGE="VBScript">
+ Sub Calendar_Click()
+ MsgBox( "Calendar Clicked!" )
+ End Sub
+
+ Sub QSimpleAX_TextChanged( str )
+ document.title = str
+ End Sub
+ </SCRIPT>
+
+ <SCRIPT LANGUAGE="JavaScript">
+ function QSimpleAX::ValueChanged( Newvalue )
+ {
+ Calendar.Day = Newvalue;
+ }
+ </SCRIPT>
+ \endraw
+*/
+
+/*!
+ \example activeqt/simple
+ \title Simple Example (ActiveQt)
+
+ The Simple example demonstrates the use of
+ QAxBindable::requestPropertyChange() and
+ QAxBindable::propertyChanged(), and the use of the default
+ QAxFactory through the \c QAXFACTORY_DEFAULT() macro.
+
+ The ActiveX control in this example is a laid out QWidget with a
+ QSlider, a QLCDNumber and a QLineEdit. It provides a
+ signal/slot/property interface to change the values of the slider
+ and the line edit, and to get notified of any property changes.
+
+
+ The Qt implementation of the ActiveX for this example is
+ \snippet examples/activeqt/simple/main.cpp 0
+
+ The control is exported using the default QAxFactory
+ \snippet examples/activeqt/simple/main.cpp 1
+
+ To build the example you must first build the QAxServer library.
+ Then run qmake and your make tool in \c examples/activeqt/simple.
+
+ The \l{qaxserver-demo-simple.html}{demonstration} requires your
+ WebBrowser to support ActiveX controls, and scripting to be enabled.
+
+ The simple ActiveX control is embedded using the \c <object> tag.
+
+ \snippet doc/src/examples/activeqt/simple-demo.qdocinc 0
+
+ A simple HTML button is connected to the ActiveQt's about() slot.
+
+ \snippet doc/src/examples/activeqt/simple-demo.qdocinc 1
+
+ A second ActiveX control - the standard Calendar Control - is instantiated
+
+ \snippet doc/src/examples/activeqt/simple-demo.qdocinc 2
+
+ Events from the ActiveX controls are handled using both Visual Basic Script
+ and JavaScript.
+
+ \snippet doc/src/examples/activeqt/simple-demo.qdocinc 3
+*/
diff --git a/doc/src/examples/activeqt/webbrowser.qdoc b/doc/src/examples/activeqt/webbrowser.qdoc
new file mode 100644
index 0000000..46b83f9
--- /dev/null
+++ b/doc/src/examples/activeqt/webbrowser.qdoc
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example activeqt/webbrowser
+ \title Web Browser Example (ActiveQt)
+
+ The Web Browser example uses the Microsoft Web Browser
+ ActiveX control to implement a fully functional Web Browser
+ application. The user interface has been developed using the Qt
+ Designer integration of the QAxWidget class.
+
+ The code demonstrates how the Qt application can communicate
+ with the embedded ActiveX controls using signals, slots and the
+ dynamicCall() function.
+
+ \snippet examples/activeqt/webbrowser/main.cpp 0
+
+ The \c MainWindow class declares a \c QMainWindow based user interface,
+ using the \c Ui::MainWindow class generated by Qt Designer. A number
+ of slots are implemented to handle events from the various user
+ interface elements, including the \c WebBrowser object, which is a
+ QAxWidget hosting the Microsoft Web Browser control.
+
+ \snippet examples/activeqt/webbrowser/main.cpp 1
+
+ The constructor initializes the user interface, installs a
+ progress bar on the status bar, and uses QAxBase::dynamicCall()
+ to invoke the \c GoHome() method of Internet Explorer to
+ navigate to the user's home page.
+
+ \snippet examples/activeqt/webbrowser/main.cpp 2
+ Different slots handle the signals emitted by the WebBrowser object.
+
+ Connections that don't require any coding, i.e. connecting the \c back
+ action to the \c GoBack() slot, have already been made in Qt Designer.
+
+ \snippet examples/activeqt/webbrowser/main.cpp 3
+ \snippet examples/activeqt/webbrowser/main.cpp 4
+
+ The rest of the implementation is not related to ActiveQt - the actions
+ are handled by different slots, and the entry point function starts the
+ application using standard Qt APIs.
+
+ To build the example you must first build the QAxContainer
+ library. Then run your make tool in \c
+ examples/activeqt/webbrowser and run the resulting \c
+ webbrowser.exe.
+*/
diff --git a/doc/src/examples/activeqt/wrapper-demo.qdocinc b/doc/src/examples/activeqt/wrapper-demo.qdocinc
new file mode 100644
index 0000000..1457119
--- /dev/null
+++ b/doc/src/examples/activeqt/wrapper-demo.qdocinc
@@ -0,0 +1,51 @@
+\raw HTML
+//! [0]
+<SCRIPT LANGUAGE="VBScript">
+Sub ToolButton_Clicked()
+ RadioButton.text = InputBox( "Enter something", "Wrapper Demo" )
+End Sub
+
+Sub PushButton_clicked()
+ MsgBox( "Thank you!" )
+End Sub
+
+Sub CheckBox_toggled( state )
+ if state = 0 then
+ CheckBox.text = "Check me!"
+ else
+ CheckBox.text = "Uncheck me!"
+ end if
+End Sub
+</SCRIPT>
+<p />
+A QPushButton:<br />
+<object ID="PushButton" CLASSID="CLSID:2B262458-A4B6-468B-B7D4-CF5FEE0A7092"
+CODEBASE="http://qtsoftware.com/demos/wrapperax.cab">
+ <PARAM NAME="text" VALUE="Click me!" />
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+
+<p />
+A QCheckBox:<br />
+<object ID="CheckBox" CLASSID="CLSID:6E795de9-872d-43cf-a831-496ef9d86c68"
+CODEBASE="http://qtsoftware.com/demos/wrapperax.cab">
+ <PARAM NAME="text" VALUE="Check me!" />
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+
+<p />
+A QToolButton:<br />
+<object ID="ToolButton" CLASSID="CLSID:7c0ffe7a-60c3-4666-bde2-5cf2b54390a1"
+CODEBASE="http://qtsoftware.com/demos/wrapperax.cab">
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+
+<p />
+A QRadioButton:<br />
+<object ID="RadioButton" CLASSID="CLSID:afcf78c8-446c-409a-93b3-ba2959039189"
+CODEBASE="http://qtsoftware.com/demos/wrapperax.cab">
+ <PARAM NAME="text" VALUE="Tune me!" />
+[Object not available! Did you forget to build and register the server?]
+</object><br />
+//! [0]
+\endraw
diff --git a/doc/src/examples/activeqt/wrapper.qdoc b/doc/src/examples/activeqt/wrapper.qdoc
new file mode 100644
index 0000000..017da30
--- /dev/null
+++ b/doc/src/examples/activeqt/wrapper.qdoc
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page qaxserver-demo-wrapper.html
+
+ \title Standard Qt widgets in an HTML page
+
+ \input examples/activeqt/wrapper-demo.qdocinc
+*/
+
+/*!
+ \example activeqt/wrapper
+ \title Wrapper Example (ActiveQt)
+
+ The Wrapper example demonstrates how to export existing QWidget
+ classes as ActiveX controls, and the use of QAxFactory together
+ with the \c QAXFACTORY_EXPORT() macro. ActiveX controls in this
+ example are the standard button classes QPushButton, QCheckBox
+ and QRadioButton as provided by Qt.
+
+ \snippet examples/activeqt/wrapper/main.cpp 0
+ The factory implementation returns the list of supported controls,
+ creates controls on request and provides information about the unique
+ IDs of the COM classes and interfaces for each control.
+
+ \snippet examples/activeqt/wrapper/main.cpp 1
+ The factory is exported using the QAXFACTORY_EXPORT macro.
+
+ To build the example you must first build the QAxServer library.
+ Then run \c qmake and your make tool in \c
+ examples/activeqt/wrapper.
+
+ The \l{qaxserver-demo-wrapper.html}{demonstration} requires a
+ web browser that supports ActiveX controls, and scripting to be
+ enabled.
+
+ \snippet examples/activeqt/wrapper-demo.qdocinc 0
+*/
diff --git a/doc/src/examples/addressbook.qdoc b/doc/src/examples/addressbook.qdoc
new file mode 100644
index 0000000..fb5c1ea
--- /dev/null
+++ b/doc/src/examples/addressbook.qdoc
@@ -0,0 +1,456 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/addressbook
+ \title Address Book Example
+
+ The address book example shows how to use proxy models to display
+ different views onto data from a single model.
+
+ \image addressbook-example.png Screenshot of the Address Book example
+
+ This example provides an address book that allows contacts to be
+ grouped alphabetically into 9 groups: ABC, DEF, GHI, ... , VW,
+ ..., XYZ. This is achieved by using multiple views on the same
+ model, each of which is filtered using an instance of the
+ QSortFilterProxyModel class.
+
+
+ \section1 Overview
+
+ The address book contains 5 classes: \c MainWindow,
+ \c AddressWidget, \c TableModel, \c NewAddressTab and
+ \c AddDialog. The \c MainWindow class uses \c AddressWidget as
+ its central widget and provides \gui File and \gui Tools menus.
+
+ \image addressbook-classes.png Diagram for Address Book Example
+
+ The \c AddressWidget class is a QTabWidget subclass that is used
+ to manipulate the 10 tabs displayed in the example: the 9
+ alphabet group tabs and an instance of \c NewAddressTab.
+ The \c NewAddressTab class is a subclass of QWidget that
+ is only used whenever the address book is empty, prompting the
+ user to add some contacts. \c AddressWidget also interacts with
+ an instance of \c TableModel to add, edit and remove entries to
+ the address book.
+
+ \c TableModel is a subclass of QAbstractTableModel that provides
+ the standard model/view API to access data. It also holds a
+ QList of \l{QPair}s corresponding to the contacts added.
+ However, this data is not all visible in a single tab. Instead,
+ QTableView is used to provide 9 different views of the same
+ data, according to the alphabet groups.
+
+ QSortFilterProxyModel is the class responsible for filtering
+ the contacts for each group of contacts. Each proxy model uses
+ a QRegExp to filter out contacts that do not belong in the
+ corresponding alphabetical group. The \c AddDialog class is
+ used to obtain information from the user for the address book.
+ This QDialog subclass is instantiated by \c NewAddressTab to
+ add contacts, and by \c AddressWidget to add and edit contacts.
+
+ We begin by looking at the \c TableModel implementation.
+
+
+ \section1 TableModel Class Definition
+
+ The \c TableModel class provides standard API to access data in
+ its QList of \l{QPair}s by subclassing QAbstractTableModel. The
+ basic functions that must be implemented in order to do so are:
+ \c rowCount(), \c columnCount(), \c data(), \c headerData().
+ For TableModel to be editable, it has to provide implementations
+ \c insertRows(), \c removeRows(), \c setData() and \c flags()
+ functions.
+
+ \snippet itemviews/addressbook/tablemodel.h 0
+
+ Two constructors are used, a default constructor which uses
+ \c TableModel's own \c {QList<QPair<QString, QString>>} and one
+ that takes \c {QList<QPair<QString, QString>} as an argument,
+ for convenience.
+
+
+ \section1 TableModel Class Implementation
+
+ We implement the two constructors as defined in the header file.
+ The second constructor initializes the list of pairs in the
+ model, with the parameter value.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 0
+
+ The \c rowCount() and \c columnCount() functions return the
+ dimensions of the model. Whereas, \c rowCount()'s value will vary
+ depending on the number of contacts added to the address book,
+ \c columnCount()'s value is always 2 because we only need space
+ for the \bold Name and \bold Address columns.
+
+ \note The \c Q_UNUSED() macro prevents the compiler from
+ generating warnings regarding unused parameters.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 1
+
+ The \c data() function returns either a \bold Name or
+ \bold {Address}, based on the contents of the model index
+ supplied. The row number stored in the model index is used to
+ reference an item in the list of pairs. Selection is handled
+ by the QItemSelectionModel, which will be explained with
+ \c AddressWidget.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 2
+
+ The \c headerData() function displays the table's header,
+ \bold Name and \bold Address. If you require numbered entries
+ for your address book, you can use a vertical header which we
+ have hidden in this example (see the \c AddressWidget
+ implementation).
+
+ \snippet itemviews/addressbook/tablemodel.cpp 3
+
+ The \c insertRows() function is called before new data is added,
+ otherwise the data will not be displayed. The
+ \c beginInsertRows() and \c endInsertRows() functions are called
+ to ensure all connected views are aware of the changes.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 4
+
+ The \c removeRows() function is called to remove data. Again,
+ \l{QAbstractItemModel::}{beginRemoveRows()} and
+ \l{QAbstractItemModel::}{endRemoveRows()} are called to ensure
+ all connected views are aware of the changes.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 5
+
+ The \c setData() function is the function that inserts data into
+ the table, item by item and not row by row. This means that to
+ fill a row in the address book, \c setData() must be called
+ twice, as each row has 2 columns. It is important to emit the
+ \l{QAbstractItemModel::}{dataChanged()} signal as it tells all
+ connected views to update their displays.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 6
+
+ The \c flags() function returns the item flags for the given
+ index.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 7
+
+ We set the Qt::ItemIsEditable flag because we want to allow the
+ \c TableModel to be edited. Although for this example we don't
+ use the editing features of the QTableView object, we enable
+ them here so that we can reuse the model in other programs.
+
+ The last function in \c {TableModel}, \c getList() returns the
+ QList<QPair<QString, QString>> object that holds all the
+ contacts in the address book. We use this function later to
+ obtain the list of contacts to check for existing entries, write
+ the contacts to a file and read them back. Further explanation is
+ given with \c AddressWidget.
+
+ \snippet itemviews/addressbook/tablemodel.cpp 8
+
+
+ \section1 AddressWidget Class Definition
+
+ The \c AddressWidget class is technically the main class
+ involved in this example as it provides functions to add, edit
+ and remove contacts, to save the contacts to a file and to load
+ them from a file.
+
+ \snippet itemviews/addressbook/addresswidget.h 0
+
+ \c AddressWidget extends QTabWidget in order to hold 10 tabs
+ (\c NewAddressTab and the 9 alphabet group tabs) and also
+ manipulates \c table, the \c TableModel object, \c proxyModel,
+ the QSortFilterProxyModel object that we use to filter the
+ entries, and \c tableView, the QTableView object.
+
+
+ \section1 AddressWidget Class Implementation
+
+ The \c AddressWidget constructor accepts a parent widget and
+ instantiates \c NewAddressTab, \c TableModel and
+ QSortFilterProxyModel. The \c NewAddressTab object, which is
+ used to indicate that the address book is empty, is added
+ and the rest of the 9 tabs are set up with \c setupTabs().
+
+ \snippet itemviews/addressbook/addresswidget.cpp 0
+
+ The \c setupTabs() function is used to set up the 9 alphabet
+ group tabs, table views and proxy models in
+ \c AddressWidget. Each proxy model in turn is set to filter
+ contact names according to the relevant alphabet group using a
+ \l{Qt::CaseInsensitive}{case-insensitive} QRegExp object. The
+ table views are also sorted in ascending order using the
+ corresponding proxy model's \l{QSortFilterProxyModel::}{sort()}
+ function.
+
+ Each table view's \l{QTableView::}{selectionMode} is set to
+ QAbstractItemView::SingleSelection and
+ \l{QTableView::}{selectionBehavior} is set to
+ QAbstractItemView::SelectRows, allowing the user to select
+ all the items in one row at the same time. Each QTableView object
+ is automatically given a QItemSelectionModel that keeps track
+ of the selected indexes.
+
+ \snippet itemviews/addressbook/addresswidget.cpp 1
+
+ The QItemSelectionModel class provides a
+ \l{QItemSelectionModel::selectionChanged()}{selectionChanged}
+ signal that is connected to \c{AddressWidget}'s
+ \c selectionChanged() signal. This signal to signal connection
+ is necessary to enable the \gui{Edit Entry...} and
+ \gui{Remove Entry} actions in \c MainWindow's Tools menu. This
+ connection is further explained in \c MainWindow's
+ implementation.
+
+ Each table view in the address book is added as a tab to the
+ QTabWidget with the relevant label, obtained from the QStringList
+ of groups.
+
+ \image addressbook-signals.png Signals and Slots Connections
+
+ We provide 2 \c addEntry() functions: 1 which is intended to be
+ used to accept user input, and the other which performs the actual
+ task of adding new entries to the address book. We divide the
+ responsibility of adding entries into two parts to allow
+ \c newAddressTab to insert data without having to popup a dialog.
+
+ The first \c addEntry() function is a slot connected to the
+ \c MainWindow's \gui{Add Entry...} action. This function creates an
+ \c AddDialog object and then calls the second \c addEntry()
+ function to actually add the contact to \c table.
+
+ \snippet itemviews/addressbook/addresswidget.cpp 2
+
+ Basic validation is done in the second \c addEntry() function to
+ prevent duplicate entries in the address book. As mentioned with
+ \c TableModel, this is part of the reason why we require the
+ getter method \c getList().
+
+ \snippet itemviews/addressbook/addresswidget.cpp 3
+
+ If the model does not already contain an entry with the same name,
+ we call \c setData() to insert the name and address into the
+ first and second columns. Otherwise, we display a QMessageBox
+ to inform the user.
+
+ \note The \c newAddressTab is removed once a contact is added
+ as the address book is no longer empty.
+
+ Editing an entry is a way to update the contact's address only,
+ as the example does not allow the user to change the name of an
+ existing contact.
+
+ Firstly, we obtain the active tab's QTableView object using
+ QTabWidget::currentWidget(). Then we extract the
+ \c selectionModel from the \c tableView to obtain the selected
+ indexes.
+
+ \snippet itemviews/addressbook/addresswidget.cpp 4a
+
+ Next we extract data from the row the user intends to
+ edit. This data is displayed in an instance of \c AddDialog
+ with a different window title. The \c table is only
+ updated if changes have been made to data in \c aDialog.
+
+ \snippet itemviews/addressbook/addresswidget.cpp 4b
+
+ \image addressbook-editdialog.png Screenshot of Dialog to Edit a Contact
+
+ Entries are removed using the \c removeEntry() function.
+ The selected row is removed by accessing it through the
+ QItemSelectionModel object, \c selectionModel. The
+ \c newAddressTab is re-added to the \c AddressWidget only if
+ the user removes all the contacts in the address book.
+
+ \snippet itemviews/addressbook/addresswidget.cpp 5
+
+ The \c writeToFile() function is used to save a file containing
+ all the contacts in the address book. The file is saved in a
+ custom \c{.dat} format. The contents of the QList of \l{QPair}s
+ are written to \c file using QDataStream. If the file cannot be
+ opened, a QMessageBox is displayed with the related error message.
+
+ \snippet itemviews/addressbook/addresswidget.cpp 6
+
+ The \c readFromFile() function loads a file containing all the
+ contacts in the address book, previously saved using
+ \c writeToFile(). QDataStream is used to read the contents of a
+ \c{.dat} file into a list of pairs and each of these is added
+ using \c addEntry().
+
+ \snippet itemviews/addressbook/addresswidget.cpp 7
+
+
+ \section1 NewAddressTab Class Definition
+
+ The \c NewAddressTab class provides an informative tab telling
+ the user that the address book is empty. It appears and
+ disappears according to the contents of the address book, as
+ mentioned in \c{AddressWidget}'s implementation.
+
+ \image addressbook-newaddresstab.png Screenshot of NewAddressTab
+
+ The \c NewAddressTab class extends QWidget and contains a QLabel
+ and QPushButton.
+
+ \snippet itemviews/addressbook/newaddresstab.h 0
+
+
+ \section1 NewAddressTab Class Implementation
+
+ The constructor instantiates the \c addButton,
+ \c descriptionLabel and connects the \c{addButton}'s signal to
+ the \c{addEntry()} slot.
+
+ \snippet itemviews/addressbook/newaddresstab.cpp 0
+
+ The \c addEntry() function is similar to \c AddressWidget's
+ \c addEntry() in the sense that both functions instantiate an
+ \c AddDialog object. Data from the dialog is extracted and sent
+ to \c AddressWidget's \c addEntry() slot by emitting the
+ \c sendDetails() signal.
+
+ \snippet itemviews/addressbook/newaddresstab.cpp 1
+
+ \image signals-n-slots-aw-nat.png
+
+
+ \section1 AddDialog Class Definition
+
+ The \c AddDialog class extends QDialog and provides the user
+ with a QLineEdit and a QTextEdit to input data into the
+ address book.
+
+ \snippet itemviews/addressbook/adddialog.h 0
+
+ \image addressbook-adddialog.png
+
+
+ \section1 AddDialog Class Implementation
+
+ The \c AddDialog's constructor sets up the user interface,
+ creating the necessary widgets and placing them into layouts.
+
+ \snippet itemviews/addressbook/adddialog.cpp 0
+
+ To give the dialog the desired behavior, we connect the \gui OK
+ and \gui Cancel buttons to the dialog's \l{QDialog::}{accept()} and
+ \l{QDialog::}{reject()} slots. Since the dialog only acts as a
+ container for name and address information, we do not need to
+ implement any other functions for it.
+
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class extends QMainWindow and implements the
+ menus and actions necessary to manipulate the address book.
+
+ \table
+ \row \o \inlineimage addressbook-filemenu.png
+ \o \inlineimage addressbook-toolsmenu.png
+ \endtable
+
+ \snippet itemviews/addressbook/mainwindow.h 0
+
+ The \c MainWindow class uses an \c AddressWidget as its central
+ widget and provides the File menu with \gui Open, \gui Close and
+ \gui Exit actions, as well as the \gui Tools menu with
+ \gui{Add Entry...}, \gui{Edit Entry...} and \gui{Remove Entry}
+ actions.
+
+
+ \section1 MainWindow Class Implementation
+
+ The constructor for \c MainWindow instantiates AddressWidget,
+ sets it as its central widget and calls the \c createMenus()
+ function.
+
+ \snippet itemviews/addressbook/mainwindow.cpp 0
+
+ The \c createMenus() function sets up the \gui File and
+ \gui Tools menus, connecting the actions to their respective slots.
+ Both the \gui{Edit Entry...} and \gui{Remove Entry} actions are
+ disabled by default as such actions cannot be carried out on an empty
+ address book. They are only enabled when one or more contacts
+ are added.
+
+ \snippet itemviews/addressbook/mainwindow.cpp 1a
+ \dots
+ \codeline
+ \snippet itemviews/addressbook/mainwindow.cpp 1b
+
+ Apart from connecting all the actions' signals to their
+ respective slots, we also connect \c AddressWidget's
+ \c selectionChanged() signal to its \c updateActions() slot.
+
+ The \c openFile() function allows the user to choose a file with
+ the \l{QFileDialog::getOpenFileName()}{open file dialog}. The chosen
+ file has to be a custom \c{.dat} file that contains address book
+ contacts. This function is a slot connected to \c openAct in the
+ \gui File menu.
+
+ \snippet itemviews/addressbook/mainwindow.cpp 2
+
+ The \c saveFile() function allows the user to save a file with
+ the \l{QFileDialog::getSaveFileName()}{save file dialog}. This function
+ is a slot connected to \c saveAct in the \gui File menu.
+
+ \snippet itemviews/addressbook/mainwindow.cpp 3
+
+ The \c updateActions() function enables and disables
+ \gui{Edit Entry...} and \gui{Remove Entry} depending on the contents of
+ the address book. If the address book is empty, these actions
+ are disabled; otherwise, they are enabled. This function is a slot
+ is connected to the \c AddressWidget's \c selectionChanged()
+ signal.
+
+ \snippet itemviews/addressbook/mainwindow.cpp 4
+
+
+ \section1 main() Function
+
+ The main function for the address book instantiates QApplication
+ and opens a \c MainWindow before running the event loop.
+
+ \snippet itemviews/addressbook/main.cpp 0
+*/
diff --git a/doc/src/examples/ahigl.qdoc b/doc/src/examples/ahigl.qdoc
new file mode 100644
index 0000000..d42df66
--- /dev/null
+++ b/doc/src/examples/ahigl.qdoc
@@ -0,0 +1,572 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qws/ahigl
+ \title OpenGL for Embedded Systems Example
+
+ \section1 Introduction
+
+ This example demonstrates how you can use OpenGL for Embedded
+ Systems (ES) in your own screen driver and \l{add your graphics
+ driver to Qt for Embedded Linux}. In \l{Qt for Embedded Linux},
+ painting is done in software, normally performed in two steps:
+ First, each client renders its windows onto its window surface in
+ memory using a paint engine. Then the server uses the screen
+ driver to compose the window surface images and copy the
+ composition to the screen. (See the \l{Qt for Embedded Linux
+ Architecture} documentation for details.)
+
+ This example is not for the novice. It assumes the reader is
+ familiar with both OpenGL and the screen driver framework
+ demonstrated in the \l {Accelerated Graphics Driver Example}.
+
+ An OpenGL screen driver for Qt for Embedded Linux can use OpenGL ES
+ in three ways. First, the \l{QWSServer}{Qt for Embedded Linux server}
+ can use the driver to compose multiple window images and then show the
+ composition on the screen. Second, clients can use the driver to
+ accelerate OpenGL painting operations using the QOpenGLPaintEngine
+ class. Finally, clients can use the driver to do OpenGL operations
+ with instances of the QGLWidget class. This example implements all
+ three cases.
+
+ The example uses an implementation of OpenGL ES from
+ \l {http://ati.amd.com}{ATI} for the
+ \l {http://ati.amd.com/products/imageon238x/}{Imageon 2380}. The
+ OpenGL include files gl.h and egl.h must be installed to compile
+ the example, and the OpenGL and EGL libraries must be installed
+ for linking. If your target device is different, you must install
+ the include files and libraries for that device, and you also
+ might need to modify the example source code, if any API signatures
+ in your EGL library differ from the ones used here.
+
+ After compiling and linking the example source, install the
+ screen driver plugin with the command \c {make install}. To
+ start an application that uses the plugin, you can either set the
+ environment variable \l QWS_DISPLAY and then start the
+ application, or just start the application with the \c -display
+ switch, as follows:
+
+ \snippet doc/src/snippets/code/doc_src_examples_ahigl.qdoc 0
+
+ The example driver also implements an animated transition effect
+ for use when showing new windows or reshowing windows that have
+ been minimized. To enable this transition effect, run the
+ application with \c {-display ahigl:effects}.
+
+ \section1 The Class Definitions
+
+ The example comprises three main classes plus some helper classes.
+ The three main classes are the plugin (QAhiGLScreenPlugin), which
+ is defined in qscreenahiglplugin.cpp, the screen driver
+ (QAhiGLScreen), which is defined in qscreenahigl_qws.h, and the
+ window surface (QAhiGLWindowSurface), which is defined in
+ qwindowsurface_ahigl_p.h. The "Ahi" prefix in these class names
+ stands for \e {ATI Handheld Interface}. The example was written
+ for the ATI Imageon 2380, but it can also be used as a template
+ for other ATI handheld devices.
+
+ \section2 The Plugin Class Definition
+
+ The screen driver plugin is class QAhiGLScreenPlugin.
+
+ \snippet examples/qws/ahigl/qscreenahiglplugin.cpp 0
+
+ QAhiGLScreenPlugin is derived from class QScreenDriverPlugin,
+ which in turn is derived from QObject.
+
+ \section2 The Screen Driver Class Definitions
+
+ The screen driver classes are the public class QAhiGLScreen and
+ its private implementation class QAhiGLScreenPrivate. QAhiGLScreen
+ is derived from QGLScreen, which is derived from QScreen. If your
+ screen driver will only do window compositions and display them,
+ then you can derive your screen driver class directly from
+ QScreen. But if your screen driver will do accelerated graphics
+ rendering operations with the QOpenGLPaintEngine, or if it will
+ handle instances of class QGLWidget, then you must derive your
+ screen driver class from QGLScreen.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.h 0
+
+ All functions in the public API of class QAhiGLScreen are virtual
+ functions declared in its base classes. hasOpenGL() is declared in
+ QGLScreen. It simply returns true indicating our example screen
+ driver does support OpenGL operations. The other functions in the
+ public API are declared in QScreen. They are called by the
+ \l{QWSServer}{Qt for Embedded Linux server} at the appropriate times.
+
+ Note that class QScreen is a documented class but class QGLScreen
+ is not. This is because the design of class QGLScreen is not yet
+ final.
+
+ The only data member in class QAhiGLScreen is a standard d_ptr,
+ which points to an instance of the driver's private implementation
+ class QAhiGLScreenPrivate. The driver's internal state is stored
+ in the private class. Using the so-called d-pointer pattern allows
+ you to make changes to the driver's internal design without
+ breaking binary compatibility.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 0
+
+ Class QAhiGLScreenPrivate is derived from QObject so that it can
+ use the Qt signal/slot mechanism. QAhiGLScreen is not a QObject,
+ so it can't use the signal/slot mechanism. Signals meant for our
+ screen driver are received by slots in the private implementation
+ class, in this case, windowEvent() and redrawScreen().
+
+ \section2 The Window Surface Class Definitions
+
+ The window surface classes are QAhiGLWindowSurface and its private
+ implementation class QAhiGLWindowSurfacePrivate. We create class
+ QAhiGLWindowSurface so the screen driver can use the OpenGL paint
+ engine and the OpenGL widget, classes QOpenGLPaintEngine and
+ QGLWidget. QAhiGLWindowSurface is derived from the more general
+ OpenGL window surface class, QWSGLWindowSurface, which is derived
+ from QWSWindowSurface.
+
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl_p.h 0
+
+ In addition to implementing the standard functionality required by
+ any new subclass of QWSWindowSurface, QAhiGLWindowSurface also
+ contains the textureId() function used by QAhiGLScreen.
+
+ The same d-pointer pattern is used in this window surface class.
+ The private implementation class is QAhiGLWindowSurfacePrivate. It
+ allows making changes to the state variables of the window surface
+ without breaking binary compatibility.
+
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 0
+
+ In this case, our private implementation class has no member
+ functions except for its constructor. It contains only public data
+ members which hold state information for the window surface.
+
+ \section2 The Helper Classes
+
+ The example screen driver maintains a static \l {QMap} {map} of
+ all the \l {QWSWindow} {windows} it is showing on the screen.
+ Each window is mapped to an instance of struct WindowInfo.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 2
+
+ As each new window is created, an instance of struct WindowInfo is
+ allocated and inserted into the window map. WindowInfo uses a
+ GLuint to identify the OpenGL texture it creates for the window.
+ Note that the example driver, in addition to drawing windows using
+ OpenGL, also supports drawing windows in the normal way without
+ OpenGL, but it uses an OpenGL texture for the rendering operations
+ in either case. Top-level windows that are drawn without OpenGL
+ are first rendered in the normal way into a shared memory segment,
+ which is then converted to a OpenGL texture and drawn to the
+ screen.
+
+ To animate the window transition effect, WindowInfo uses an
+ instance of the helper class ShowAnimation. The animation is
+ created by the windowEvent() slot in QAhiGLScreenPrivate, whenever
+ a \l {QWSServer::WindowEvent} {Show} window event is emitted by
+ the \l {QWSServer} {window server}. The server emits this signal
+ when a window is shown the first time and again later, when the
+ window is reshown after having been minimized.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 1
+
+ Class ShowAnimation is derived from the QTimeLine class, which is
+ used for controlling animations. QTimeLine is a QObject, so
+ ShowAnimation can use the Qt signal/slot mechanism. We will see
+ how the timeline's \l {QTimeLine::valueChanged()} {valueChanged()}
+ and \l {QTimeLine::finished()} {finished()} signals are used to
+ control the animation and then destroy the instance of
+ ShowAnimation, when the animation ends. The ShowAnimation
+ constructor needs the pointer to the screen driver's private
+ implementation class so it can set up these signal/slot
+ connections.
+
+ \section1 The Class Implementations
+
+ \section2 The Plugin Class Implementation
+
+ QAhiGLScreenPlugin is a straightforward derivation of
+ QScreenDriverPlugin. It reimplements \l{QScreenDriverPlugin::}{keys()}
+ and \l{QScreenDriverPlugin::}{create()}. They are
+ called as needed by the \l{QWSServer}{Qt for Embedded Linux server.}
+ Recall that the server detects that the ahigl screen driver has
+ been requested, either by including "ahigl" in the value for the
+ environment variable QWS_DISPLAY, or by running your application
+ with a command line like the following.
+
+ \snippet doc/src/snippets/code/doc_src_examples_ahigl.qdoc 1
+
+ The server calls \l {QScreenDriverPlugin::} {keys()}, which
+ returns a \l {QStringList} containing the singleton "ahigl"
+ matching the requested screen driver and telling the server that
+ it can use our example screen driver. The server then calls \l
+ {QScreenDriverPlugin::} {create()}, which creates the instance of
+ QAhiGLScreen.
+
+ \snippet examples/qws/ahigl/qscreenahiglplugin.cpp 1
+
+ In the code snippet above, the macro Q_EXPORT_PLUGIN2 is used to export
+ the plugin class, QAhiGLScreen, for the qahiglscreen plugin.
+ Further information regarding plugins and how to create them
+ can be found at \l{How to Create Qt Plugins}.
+
+ \section2 The Screen Driver Class Implementations
+
+ The plugin creates the singleton instance of QAhiGLScreen. The
+ constructor is passed a \c displayId, which is used in the base
+ class QGLScreen to identify the server that the screen driver is
+ connected to. The constructor also creates its instance of
+ QAhiGLScreenPrivate, which instantiates a QTimer. The timeout()
+ signal of this timer is connected to the redrawScreen() slot so
+ the timer can be used to limit the frequency of actual drawing
+ operations in the hardware.
+
+ The public API of class QAhiGLScreen consists of implementations
+ of virtual functions declared in its base classes. The function
+ hasOpenGL() is declared in base class QGLScreen. The others are
+ declared in base class QScreen.
+
+ The \l {QScreen::}{connect()} function is the first one called by
+ the server after the screen driver is constructed. It initializes
+ the QScreen data members to hardcoded values that describe the ATI
+ screen. A better implementation would query the hardware for the
+ corresponding values in its current state and use those. It asks
+ whether the screen driver was started with the \c effects option
+ and sets the \c doEffects flag accordingly.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 7
+
+ The \l {QScreen::}{initDevice()} function is called by the server
+ after \l {QScreen::}{connect()}. It uses EGL library functions to
+ initialize the ATI hardware. Note that some data structures used
+ in this example are specific to the EGL implementation used, e.g.,
+ the DummyScreen structure.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 8
+
+ Note the signal/slot connection at the bottom of initDevice(). We
+ connect the server's QWSServer::windowEvent() signal to the
+ windowEvent() slot in the screen driver's private implementation
+ class. The windowEvent() slot handles three window events,
+ QWSServer::Create, QWSServer::Destroy, and QWSServer::Show.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 5
+
+ The function manages instances of the helper classes associated
+ with each window. When a QWSServer::Create event occurs, it means
+ a new top-level \l {QWSWindow} {window} has been created. In this
+ case, an instance of helper class WindowInfo is created and
+ inserted into the window map with the pointer to the new \l
+ {QWSWindow} {window} as its key. When a QWSServer::Destroy event
+ occurs, a window is being destroyed, and its mapping is removed
+ from the window map. These two events are straightforward. The
+ tricky bits happen when a QWSServer::Show event occurs. This case
+ occurs when a window is shown for the first time and when it is
+ reshown after having been minimized. If the window transition
+ effect has been enabled, a new instance of the helper class
+ ShowAnimation is created and stored in a QPointer in the window's
+ instance of WindowInfo. The constructor of ShowAnimation
+ automatically \l {QTimeLine::start()} {starts} the animation of
+ the transition effect.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 3
+
+ To ensure that a ShowAnimation is not deleted until its animation
+ ends, the \l {QTimeLine::finished()} {finished()} signal is
+ connected to the \l {QObject::deleteLater()} {deleteLater()} slot.
+ When the animation ends, the finished() signal is emitted and the
+ deleteLater() slot deletes the ShowAnimation. The key here is that
+ the pointer to the ShowAnimation is stored in a QPointer in the
+ WindowInfo class. This QPointer will also be notified when the
+ ShowAnimation is deleted, so the QPointer in WindowInfo can null
+ itself out, if and only if it is still pointing to the instance
+ of ShowAnimation being deleted.
+
+ The \l {QTimeLine::valueForTime()} {valueForTime()} function in
+ QTimeLine is reimplemented in ShowAnimation to return time values
+ that represent a curved path for the window transition effect.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 4
+
+ valueForTime() is called internally, when the time interval it
+ computed during the previous call has elapsed. If it computes a
+ next time value that is different from the one computed
+ previously, the \l {QTimeLine::valueChanged()} {valueChanged()}
+ signal is emitted. The ShowAnimation constructor shown above
+ connects this signal to the redrawScreen() slot in the screen
+ driver's private implementation class. This is how the animation
+ actually happens.
+
+ The screen driver's implementation of \l {QScreen::}
+ {exposeRegion()} is where the main work of the screen driver is
+ meant to be done, i.e., updating the screen. It is called by the
+ \l {QWSServer} {window system} to update a particular window's
+ region of the screen. But note that it doesn't actually update the
+ screen, i.e., it doesn't actually call redrawScreen() directly,
+ but starts the updateTimer, which causes redrawScreen() to be
+ called once for each updateTimer interval. This means that all
+ calls to exposeRegion() during an updateTimer interval are handled
+ by a single call to redrawScreen(). Thus updateTimer can be used
+ to limit the frequency of screen updates.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 13
+
+ The call to the private function invalidateTexture() destroys
+ the window's existing texture (image). This ensures that a new
+ texture will be created for the window, when redrawScreen() is
+ eventually called.
+
+ But there is a caveat to using updateTimer to limit the frequency
+ of screen updates. When the driver's animated transition effect
+ for new windows is enabled and a new window is being shown for the
+ first time or reshown after having been minimized, an instance of
+ ShowAnimation is created to run the animation. The valueChanged()
+ signal of this ShowAnimation is also connected to the
+ redrawScreen() slot, and QTimeLine, the base class of our
+ ShowAnimation, uses its own, internal timer to limit the speed of
+ the animation. This means that in the driver as currently written,
+ if the window transition effect is enabled (i.e. if the plugin is
+ started, with \c {-display ahigl:effects}), then redrawScreen()
+ can be called both when the update timer times out and when the
+ ShowAnimation timer times out, so the screen might get updated
+ more often than the frequency established by the update timer.
+ This may or may not be a bug, depending on your own hardware, if
+ you use this example as a template for your own OpenGL driver.
+
+ The screen driver's private function redrawScreen() constructs
+ the window compositions. It is called only by the function of the
+ same name in the screen driver's private implementation class.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 6
+
+ Recall that this redrawScreen() in the private implementation
+ class is a slot function connected to two signals, the \c
+ timeout() signal of the updateTimer in the private implementation
+ class, and the valueChanged() signal of the helper class
+ ShowAnimation. Thus, the screen is only ever updated when a
+ timeout of one of the two timers occurs. This is important for two
+ reasons. First, the screen is meant to be updated no more than
+ once per updateTimer interval. Second, however, if the animated
+ window transition effect is requested, the screen might be updated
+ more often than that, and this might be a bug if the hardware
+ can't handle more frequent updates.
+
+ The redrawScreen() in QAhiGLScreen begins by using standard
+ OpenGL to fill the screen with the background color.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 10
+
+ Next it iterates over the list of all \l {QWSWindow} {client
+ windows} obtained from the \l {QWSServer} {server}, extracting
+ from each window its instance of QWSWIndowSurface, then using that
+ window surface to create an OpenGL texture, and finally calling
+ the helper function drawWindow() to draw the texture on the
+ screen.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 11
+
+ Note the call to glBindTexture() immediately before the call to
+ drawWindow(). This call binds the identifer \c GL_TEXTURE_2D to
+ the texture we have just created. This makes our texture
+ accessible to functions in the OpenGL libraries. If you miss that
+ point, digging into the internals of drawWindow() won't make much
+ sense.
+
+ Finally, the cursor is added to the window composition, and in the
+ last statement, the whole thing is displayed on the screen.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 12
+
+ The call to \c drawWindow(win,progress), in addition to passing a
+ pointer to the window to be redrawn, also passes the \c progress
+ parameter obtained by calling \l {QTimeLine::currentValue()} on
+ the window's instance of ShowAnimation. Recall that the current
+ value of the timeline is updated internally by a timer local to
+ the timeline, and the redrawScreen() slot is called whenever the
+ current value changes. The progress value will only be used if
+ the animated transition effect has been enabled. These extra calls
+ of redrawScreen() may cause the screen to be updated more often
+ than the rate determined by updateTimer. This must be taken
+ into account, if you set your updateTimer to timeout at the
+ maximum screen update frequency your hardware can handle.
+
+ The drawWindow() function is not shown here and not explained
+ further, but the call to drawWindow() is the entry point to a
+ hierarchy of private helper functions that execute sequences of
+ OpenGL and EGL library calls. The reader is assumed to be familiar
+ enough with the OpenGL and EGL APIs to understand the code in
+ these helper functions on his own. Besides drawWindow(), the list
+ of these helper functions includes drawQuad(), drawQuadWavyFlag(),
+ the two overloadings of drawQuad_helper() (used by drawQuad() and
+ drawQuadWacyFlag()), and setRectCoords().
+
+ Note the two different ways the window's texture can be created in
+ redrawScreen(). If the window surface is an OpenGL window surface
+ (QAhiGLWindowSurface described below), the texture is obtained
+ from the window surface directly by calling its textureId()
+ function. But when the window surface is not an OpenGL one, the
+ static function createTexture() is called with the window
+ surface's \l {QImage} {image} to copy that image into an OpenGL
+ texture. This is done with the EGL functions glTexImage2D() and
+ glTexSubImage2D(). createTexture() is another function that
+ should be understandable for exsperienced OpenGL users, so it is
+ not shown or explained further here.
+
+ The two implementations of \l {QScreen::}{createSurface()} are for
+ instantiating new window surfaces. The overloading with the widget
+ parameter is called in the client.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 14
+
+ If the parameter is an \l {QGLWidget} {OpenGL widget}, or, when it
+ isn't an OpenGL widget but its size is no bigger than 256 x 256,
+ we instantiate our subclass QAhiGLWindowSurface. Otherwise, we
+ instantiate a QWSWindowSurface. The size contraint is a
+ limitation of the OpenGL ES libraries we are using for our ATI
+ device.
+
+ Note the test at the top of the function asking if our application
+ process is the \l {QApplication::GuiServer} {server}. We only
+ create instances of QAhiGLWindowSurface if our client is in the
+ server process. This is because of an implementation restriction
+ required by the OpenGL library used in the example. They only
+ support use of OpenGL in the server process. Hence a client can
+ use the QAhiGLWindowSurface if the client is in the server
+ process.
+
+ The other overloading of createSurface() is called by the
+ server to create a window surface that will hold a copy of a
+ client side window surface.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 15
+
+ This overloading accepts a QString parameter identifying the type
+ of window surface to instantiate. QAhiGLWindowSurface is
+ instantiated if the parameter is \c ahigl. Otherwise, a normal
+ QWSWindowSurface is instantiated. The client's window surface
+ communicates its image data to the server's window surface through
+ shared memory.
+
+ The implementation of \l {QScreen::}{setMode()}, is a stub in this
+ example. It would normally reset the frame buffer's resolution.
+ Its parameters are the \e width, \e height, and the bit \e depth
+ for the frame buffer's new resolution. If you implement setMode()
+ in your screen driver, remember that it must emit a signal to warn
+ other applications to redraw their frame buffers with the new
+ resolution. There is no significance to setMode() not being
+ implemented in this example. It simply wasn't implemented.
+ However, the stub had to be included because QScreen declares
+ setMode() to be pure virtual.
+
+ Before the application exits, the server will call \l {QScreen::}
+ {shutdownDevice()} to release the hardware resources. This is also
+ done using EGL library functions.
+
+ \snippet examples/qws/ahigl/qscreenahigl_qws.cpp 9
+
+ The server will also call \l {QScreen::}{disconnect()}, but this
+ function is only a stub in this example.
+
+ \section2 The window Surface Class Implementations
+
+ QAhiGLScreen creates instances of QAhiGLWindowSurface in its two
+ createSurface() functions, and there are two constructors for
+ QAhiGLWindowSurface that correspond to these two versions of
+ createSurface(). The constructor accepting a \l {QWidget} {widget}
+ parameter is called by the client side version of createSurface(),
+ and the constructor without the \l {QWidget} {widget} parameter is
+ called by the server side version. There will be a window surface
+ constructed on the server side for each one constructed on the
+ client side.
+
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 1
+ \codeline
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 2
+
+ The constructors create an instance of QAhiGLWindowSurfacePrivate,
+ the private implementation class, which contains all the state
+ variables for QAhiGLWindowSurface. The client side constructor
+ also creates an instance of QWSGLPaintDevice, the OpenGL paint
+ device, for return by \l {QWSWindowSurface::} {paintDevice()}.
+ This ensures that all \l {QPainter}s used on this surface will use
+ an OpenGL enabled QPaintEngine. It is a bit of jiggery pokery,
+ which is required because \l {QWSWindowSurface::} {paintDevice()}
+ is declared pure virtual. Normally, the client side constructor
+ will be called with an \l {QGLWidget}{OpenGL widget}, which has
+ its own \l {QWidget::} {paintEngine()} function that returns the
+ global static OpenGL paint engine, but because the constructor
+ also accepts a normal \l {QWidget}{widget}, it must be able to
+ find the OpenGL paint engine in that case as well, so since \l
+ {QWSWindowSurface::} {paintDevice()} must be implemented anyway,
+ the constructor creates an instance of QWSGLPaintDevice, which can
+ always return the global static pointer to QOpenGLPaintEngine.
+
+ The OpenGL library implementation used for this example only
+ supports one OpenGL context. This context is therefore shared
+ among the single instance of QAhiGLScreen and all instances of
+ QAhiGLWindowSurface. It is passed to both constructors.
+
+ This example uses the OpenGL frame buffer object extension, which
+ allows for accelerating OpenGL painting operations. Using this
+ OpenGL extension, painting operations are performed in a frame
+ buffer object, which QAhiGLScreen later uses to construct window
+ compositions on the screen. Allocation of the frame buffer object
+ is performed in \l {QWindowSurface::} {setGeometry()}. A safer way
+ to use this extension would be to first test to see if the
+ extension is supported by your OpenGL library, and use a different
+ approach if it is not.
+
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 3
+
+ Since there can be several instances of the QAhiGLWindowSurface, we need
+ to make sure that the correct framebuffer object is active before painting.
+ This is done by reimplementing \l QWindowSurface::beginPaint():
+
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 4
+
+ Finally we need to make sure that whenever a widget grows beyond the size
+ supported by this driver (256 x 256), the surface is deleted and a new
+ standard surface is created instead. This is handled by reimplementing
+ \l QWSWindowSurface::isValid():
+
+ \snippet examples/qws/ahigl/qwindowsurface_ahigl.cpp 5
+*/
diff --git a/doc/src/examples/analogclock.qdoc b/doc/src/examples/analogclock.qdoc
new file mode 100644
index 0000000..d5f7273
--- /dev/null
+++ b/doc/src/examples/analogclock.qdoc
@@ -0,0 +1,168 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/analogclock
+ \title Analog Clock Example
+
+ The Analog Clock example shows how to draw the contents of a custom
+ widget.
+
+ \image analogclock-example.png Screenshot of the Analog Clock example
+
+ This example also demonstrates how the transformation and scaling
+ features of QPainter can be used to make drawing custom widgets
+ easier.
+
+ \section1 AnalogClock Class Definition
+
+ The \c AnalogClock class provides a clock widget with hour and minute
+ hands that is automatically updated every few seconds.
+ We subclass \l QWidget and reimplement the standard
+ \l{QWidget::paintEvent()}{paintEvent()} function to draw the clock face:
+
+ \snippet examples/widgets/analogclock/analogclock.h 0
+
+ \section1 AnalogClock Class Implementation
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 1
+
+ When the widget is constructed, we set up a one-second timer to
+ keep track of the current time, and we connect it to the standard
+ \l{QWidget::update()}{update()} slot so that the clock face is
+ updated when the timer emits the \l{QTimer::timeout()}{timeout()}
+ signal.
+
+ Finally, we resize the widget so that it is displayed at a
+ reasonable size.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 8
+ \snippet examples/widgets/analogclock/analogclock.cpp 10
+
+ The \c paintEvent() function is called whenever the widget's
+ contents need to be updated. This happens when the widget is
+ first shown, and when it is covered then exposed, but it is also
+ executed when the widget's \l{QWidget::update()}{update()} slot
+ is called. Since we connected the timer's
+ \l{QTimer::timeout()}{timeout()} signal to this slot, it will be
+ called at least once every five seconds.
+
+ Before we set up the painter and draw the clock, we first define
+ two lists of \l {QPoint}s and two \l{QColor}s that will be used
+ for the hour and minute hands. The minute hand's color has an
+ alpha component of 191, meaning that it's 75% opaque.
+
+ We also determine the length of the widget's shortest side so that we
+ can fit the clock face inside the widget. It is also useful to determine
+ the current time before we start drawing.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 11
+ \snippet examples/widgets/analogclock/analogclock.cpp 12
+ \snippet examples/widgets/analogclock/analogclock.cpp 13
+ \snippet examples/widgets/analogclock/analogclock.cpp 14
+
+ The contents of custom widgets are drawn with a QPainter.
+ Painters can be used to draw on any QPaintDevice, but they are
+ usually used with widgets, so we pass the widget instance to the
+ painter's constructor.
+
+ We call QPainter::setRenderHint() with QPainter::Antialiasing to
+ turn on antialiasing. This makes drawing of diagonal lines much
+ smoother.
+
+ The translation moves the origin to the center of the widget, and
+ the scale operation ensures that the following drawing operations
+ are scaled to fit within the widget. We use a scale factor that
+ let's us use x and y coordinates between -100 and 100, and that
+ ensures that these lie within the length of the widget's shortest
+ side.
+
+ To make our code simpler, we will draw a fixed size clock face that will
+ be positioned and scaled so that it lies in the center of the widget.
+
+ The painter takes care of all the transformations made during the
+ paint event, and ensures that everything is drawn correctly. Letting
+ the painter handle transformations is often easier than performing
+ manual calculations just to draw the contents of a custom widget.
+
+ \img analogclock-viewport.png
+
+ We draw the hour hand first, using a formula that rotates the coordinate
+ system counterclockwise by a number of degrees determined by the current
+ hour and minute. This means that the hand will be shown rotated clockwise
+ by the required amount.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 15
+ \snippet examples/widgets/analogclock/analogclock.cpp 16
+
+ We set the pen to be Qt::NoPen because we don't want any outline,
+ and we use a solid brush with the color appropriate for
+ displaying hours. Brushes are used when filling in polygons and
+ other geometric shapes.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 17
+ \snippet examples/widgets/analogclock/analogclock.cpp 19
+
+ We save and restore the transformation matrix before and after the
+ rotation because we want to place the minute hand without having to
+ take into account any previous rotations.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 20
+ \codeline
+ \snippet examples/widgets/analogclock/analogclock.cpp 21
+
+ We draw markers around the edge of the clock for each hour. We
+ draw each marker then rotate the coordinate system so that the
+ painter is ready for the next one.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 22
+ \snippet examples/widgets/analogclock/analogclock.cpp 23
+
+ The minute hand is rotated in a similar way to the hour hand.
+
+ \snippet examples/widgets/analogclock/analogclock.cpp 25
+ \codeline
+ \snippet examples/widgets/analogclock/analogclock.cpp 26
+
+ Again, we draw markers around the edge of the clock, but this
+ time to indicate minutes. We skip multiples of 5 to avoid drawing
+ minute markers on top of hour markers.
+*/
diff --git a/doc/src/examples/application.qdoc b/doc/src/examples/application.qdoc
new file mode 100644
index 0000000..32e8c10
--- /dev/null
+++ b/doc/src/examples/application.qdoc
@@ -0,0 +1,410 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example mainwindows/application
+ \title Application Example
+
+ The Application example shows how to implement a standard GUI
+ application with menus, toolbars, and a status bar. The example
+ itself is a simple text editor program built around QTextEdit.
+
+ \image application.png Screenshot of the Application example
+
+ Nearly all of the code for the Application example is in the \c
+ MainWindow class, which inherits QMainWindow. QMainWindow
+ provides the framework for windows that have menus, toolbars,
+ dock windows, and a status bar. The application provides
+ \menu{File}, \menu{Edit}, and \menu{Help} entries in the menu
+ bar, with the following popup menus:
+
+ \image application-menus.png The Application example's menu system
+
+ The status bar at the bottom of the main window shows a
+ description of the menu item or toolbar button under the cursor.
+
+ To keep the example simple, recently opened files aren't shown in
+ the \menu{File} menu, even though this feature is desired in 90%
+ of applications. The \l{mainwindows/recentfiles}{Recent Files}
+ example shows how to implement this. Furthermore, this example
+ can only load one file at a time. The \l{mainwindows/sdi}{SDI}
+ and \l{mainwindows/mdi}{MDI} examples shows how to lift these
+ restrictions.
+
+ \section1 MainWindow Class Definition
+
+ Here's the class definition:
+
+ \snippet examples/mainwindows/application/mainwindow.h 0
+
+ The public API is restricted to the constructor. In the \c
+ protected section, we reimplement QWidget::closeEvent() to detect
+ when the user attempts to close the window, and warn the user
+ about unsaved changes. In the \c{private slots} section, we
+ declare slots that correspond to menu entries, as well as a
+ mysterious \c documentWasModified() slot. Finally, in the \c
+ private section of the class, we have various members that will
+ be explained in due time.
+
+ \section1 MainWindow Class Implementation
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 0
+
+ We start by including \c <QtGui>, a header file that contains the
+ definition of all classes in the \l QtCore and \l QtGui
+ libraries. This saves us from the trouble of having to include
+ every class individually. We also include \c mainwindow.h.
+
+ You might wonder why we don't include \c <QtGui> in \c
+ mainwindow.h and be done with it. The reason is that including
+ such a large header from another header file can rapidly degrade
+ performances. Here, it wouldn't do any harm, but it's still
+ generally a good idea to include only the header files that are
+ strictly necessary from another header file.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 1
+ \snippet examples/mainwindows/application/mainwindow.cpp 2
+
+ In the constructor, we start by creating a QTextEdit widget as a
+ child of the main window (the \c this object). Then we call
+ QMainWindow::setCentralWidget() to tell that this is going to be
+ the widget that occupies the central area of the main window,
+ between the toolbars and the status bar.
+
+ Then we call \c createActions(), \c createMenus(), \c
+ createToolBars(), and \c createStatusBar(), four private
+ functions that set up the user interface. After that, we call \c
+ readSettings() to restore the user's preferences.
+
+ We establish a signal-slot connection between the QTextEdit's
+ document object and our \c documentWasModified() slot. Whenever
+ the user modifies the text in the QTextEdit, we want to update
+ the title bar to show that the file was modified.
+
+ At the end, we set the window title using the private
+ \c setCurrentFile() function. We'll come back to this later.
+
+ \target close event handler
+ \snippet examples/mainwindows/application/mainwindow.cpp 3
+ \snippet examples/mainwindows/application/mainwindow.cpp 4
+
+ When the user attempts to close the window, we call the private
+ function \c maybeSave() to give the user the possibility to save
+ pending changes. The function returns true if the user wants the
+ application to close; otherwise, it returns false. In the first
+ case, we save the user's preferences to disk and accept the close
+ event; in the second case, we ignore the close event, meaning
+ that the application will stay up and running as if nothing
+ happened.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 5
+ \snippet examples/mainwindows/application/mainwindow.cpp 6
+
+ The \c newFile() slot is invoked when the user selects
+ \menu{File|New} from the menu. We call \c maybeSave() to save any
+ pending changes and if the user accepts to go on, we clear the
+ QTextEdit and call the private function \c setCurrentFile() to
+ update the window title and clear the
+ \l{QWidget::windowModified}{windowModified} flag.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 7
+ \snippet examples/mainwindows/application/mainwindow.cpp 8
+
+ The \c open() slot is invoked when the user clicks
+ \menu{File|Open}. We pop up a QFileDialog asking the user to
+ choose a file. If the user chooses a file (i.e., \c fileName is
+ not an empty string), we call the private function \c loadFile()
+ to actually load the file.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 9
+ \snippet examples/mainwindows/application/mainwindow.cpp 10
+
+ The \c save() slot is invoked when the user clicks
+ \menu{File|Save}. If the user hasn't provided a name for the file
+ yet, we call \c saveAs(); otherwise, we call the private function
+ \c saveFile() to actually save the file.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 11
+ \snippet examples/mainwindows/application/mainwindow.cpp 12
+
+ In \c saveAs(), we start by popping up a QFileDialog asking the
+ user to provide a name. If the user clicks \gui{Cancel}, the
+ returned file name is empty, and we do nothing.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 13
+ \snippet examples/mainwindows/application/mainwindow.cpp 14
+
+ The application's About box is done using one statement, using
+ the QMessageBox::about() static function and relying on its
+ support for an HTML subset.
+
+ The \l{QObject::tr()}{tr()} call around the literal string marks
+ the string for translation. It is a good habit to call
+ \l{QObject::tr()}{tr()} on all user-visible strings, in case you
+ later decide to translate your application to other languages.
+ The \l{Internationalization with Qt} overview convers
+ \l{QObject::tr()}{tr()} in more detail.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 15
+ \snippet examples/mainwindows/application/mainwindow.cpp 16
+
+ The \c documentWasModified() slot is invoked each time the text
+ in the QTextEdit changes because of user edits. We call
+ QWidget::setWindowModified() to make the title bar show that the
+ file was modified. How this is done varies on each platform.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 17
+ \snippet examples/mainwindows/application/mainwindow.cpp 18
+ \dots
+ \snippet examples/mainwindows/application/mainwindow.cpp 22
+
+ The \c createActions() private function, which is called from the
+ \c MainWindow constructor, creates \l{QAction}s. The code is very
+ repetitive, so we show only the actions corresponding to
+ \menu{File|New}, \menu{File|Open}, and \menu{Help|About Qt}.
+
+ A QAction is an object that represents one user action, such as
+ saving a file or invoking a dialog. An action can be put in a
+ QMenu or a QToolBar, or both, or in any other widget that
+ reimplements QWidget::actionEvent().
+
+ An action has a text that is shown in the menu, an icon, a
+ shortcut key, a tooltip, a status tip (shown in the status bar),
+ a "What's This?" text, and more. It emits a
+ \l{QAction::triggered()}{triggered()} signal whenever the user
+ invokes the action (e.g., by clicking the associated menu item or
+ toolbar button). We connect this signal to a slot that performs
+ the actual action.
+
+ The code above contains one more idiom that must be explained.
+ For some of the actions, we specify an icon as a QIcon to the
+ QAction constructor. The QIcon constructor takes the file name
+ of an image that it tries to load. Here, the file name starts
+ with \c{:}. Such file names aren't ordinary file names, but
+ rather path in the executable's stored resources. We'll come back
+ to this when we review the \c application.qrc file that's part of
+ the project.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 23
+ \snippet examples/mainwindows/application/mainwindow.cpp 24
+
+ The \gui{Edit|Cut} and \gui{Edit|Copy} actions must be available
+ only when the QTextEdit contains selected text. We disable them
+ by default and connect the QTextEdit::copyAvailable() signal to
+ the QAction::setEnabled() slot, ensuring that the actions are
+ disabled when the text editor has no selection.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 25
+ \snippet examples/mainwindows/application/mainwindow.cpp 27
+
+ Creating actions isn't sufficient to make them available to the
+ user; we must also add them to the menu system. This is what \c
+ createMenus() does. We create a \menu{File}, an \menu{Edit}, and
+ a \menu{Help} menu. QMainWindow::menuBar() lets us access the
+ window's menu bar widget. We don't have to worry about creating
+ the menu bar ourselves; the first time we call this function, the
+ QMenuBar is created.
+
+ Just before we create the \menu{Help} menu, we call
+ QMenuBar::addSeparator(). This has no effect for most widget
+ styles (e.g., Windows and Mac OS X styles), but for Motif-based
+ styles this makes sure that \menu{Help} is pushed to the right
+ side of the menu bar. Try running the application with various
+ styles and see the results:
+
+ \snippet doc/src/snippets/code/doc_src_examples_application.qdoc 0
+
+ Let's now review the toolbars:
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 30
+
+ Creating toolbars is very similar to creating menus. The same
+ actions that we put in the menus can be reused in the toolbars.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 32
+ \snippet examples/mainwindows/application/mainwindow.cpp 33
+
+ QMainWindow::statusBar() returns a pointer to the main window's
+ QStatusBar widget. Like with \l{QMainWindow::menuBar()}, the
+ widget is automatically created the first time the function is
+ called.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 34
+ \snippet examples/mainwindows/application/mainwindow.cpp 36
+
+ The \c readSettings() function is called from the constructor to
+ load the user's preferences and other application settings. The
+ QSettings class provides a high-level interface for storing
+ settings permanently on disk. On Windows, it uses the (in)famous
+ Windows registry; on Mac OS X, it uses the native XML-based
+ CFPreferences API; on Unix/X11, it uses text files.
+
+ The QSettings constructor takes arguments that identify your
+ company and the name of the product. This ensures that the
+ settings for different applications are kept separately.
+
+ We use QSettings::value() to extract the value of the "pos" and
+ "size" settings. The second argument to QSettings::value() is
+ optional and specifies a default value for the setting if there
+ exists none. This value is used the first time the application is
+ run.
+
+ When restoring the position and size of a window, it's important
+ to call QWidget::resize() before QWidget::move(). The reason why
+ is given in the \l{geometry.html}{Window Geometry} overview.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 37
+ \snippet examples/mainwindows/application/mainwindow.cpp 39
+
+ The \c writeSettings() function is called from \c closeEvent().
+ Writing settings is similar to reading them, except simpler. The
+ arguments to the QSettings constructor must be the same as in \c
+ readSettings().
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 40
+ \snippet examples/mainwindows/application/mainwindow.cpp 41
+
+ The \c maybeSave() function is called to save pending changes. If
+ there are pending changes, it pops up a QMessageBox giving the
+ user to save the document. The options are QMessageBox::Yes,
+ QMessageBox::No, and QMessageBox::Cancel. The \gui{Yes} button is
+ made the default button (the button that is invoked when the user
+ presses \key{Return}) using the QMessageBox::Default flag; the
+ \gui{Cancel} button is made the escape button (the button that is
+ invoked when the user presses \key{Esc}) using the
+ QMessageBox::Escape flag.
+
+ The \c maybeSave() function returns \c true in all cases, except
+ when the user clicks \gui{Cancel}. The caller must check the
+ return value and stop whatever it was doing if the return value
+ is \c false.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 42
+ \snippet examples/mainwindows/application/mainwindow.cpp 43
+
+ In \c loadFile(), we use QFile and QTextStream to read in the
+ data. The QFile object provides access to the bytes stored in a
+ file.
+
+ We start by opening the file in read-only mode. The QFile::Text
+ flag indicates that the file is a text file, not a binary file.
+ On Unix and Mac OS X, this makes no difference, but on Windows,
+ it ensures that the "\\r\\n" end-of-line sequence is converted to
+ "\\n" when reading.
+
+ If we successfully opened the file, we use a QTextStream object
+ to read in the data. QTextStream automatically converts the 8-bit
+ data into a Unicode QString and supports various encodings. If no
+ encoding is specified, QTextStream assumes the file is written
+ using the system's default 8-bit encoding (for example, Latin-1;
+ see QTextCodec::codecForLocale() for details).
+
+ Since the call to QTextStream::readAll() might take some time, we
+ set the cursor to be Qt::WaitCursor for the entire application
+ while it goes on.
+
+ At the end, we call the private \c setCurrentFile() function,
+ which we'll cover in a moment, and we display the string "File
+ loaded" in the status bar for 2 seconds (2000 milliseconds).
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 44
+ \snippet examples/mainwindows/application/mainwindow.cpp 45
+
+ Saving a file is very similar to loading one. Here, the
+ QFile::Text flag ensures that on Windows, "\\n" is converted into
+ "\\r\\n" to conform to the Windows convension.
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 46
+ \snippet examples/mainwindows/application/mainwindow.cpp 47
+
+ The \c setCurrentFile() function is called to reset the state of
+ a few variables when a file is loaded or saved, or when the user
+ starts editing a new file (in which case \c fileName is empty).
+ We update the \c curFile variable, clear the
+ QTextDocument::modified flag and the associated \c
+ QWidget:windowModified flag, and update the window title to
+ contain the new file name (or \c untitled.txt).
+
+ The \c strippedName() function call around \c curFile in the
+ QWidget::setWindowTitle() call shortens the file name to exclude
+ the path. Here's the function:
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 48
+ \snippet examples/mainwindows/application/mainwindow.cpp 49
+
+ \section1 The main() Function
+
+ The \c main() function for this application is typical of
+ applications that contain one main window:
+
+ \snippet examples/mainwindows/application/main.cpp 0
+
+ \section1 The Resource File
+
+ As you will probably recall, for some of the actions, we
+ specified icons with file names starting with \c{:} and mentioned
+ that such file names aren't ordinary file names, but path in the
+ executable's stored resources. These resources are compiled
+
+ The resources associated with an application are specified in a
+ \c .qrc file, an XML-based file format that lists files on the
+ disk. Here's the \c application.qrc file that's used by the
+ Application example:
+
+ \quotefile mainwindows/application/application.qrc
+
+ The \c .png files listed in the \c application.qrc file are files
+ that are part of the Application example's source tree. Paths are
+ relative to the directory where the \c application.qrc file is
+ located (the \c mainwindows/application directory).
+
+ The resource file must be mentioned in the \c application.pro
+ file so that \c qmake knows about it:
+
+ \snippet examples/mainwindows/application/application.pro 0
+
+ \c qmake will produce make rules to generate a file called \c
+ qrc_application.cpp that is linked into the application. This
+ file contains all the data for the images and other resources as
+ static C++ arrays of compressed binary data. See
+ \l{resources.html}{The Qt Resource System} for more information
+ about resources.
+*/
diff --git a/doc/src/examples/arrowpad.qdoc b/doc/src/examples/arrowpad.qdoc
new file mode 100644
index 0000000..76b753b
--- /dev/null
+++ b/doc/src/examples/arrowpad.qdoc
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example linguist/arrowpad
+ \title Arrow Pad Example
+
+ This example is a slightly more involved and introduces a key \e
+ {Qt Linguist} concept: "contexts". It also shows how to use two
+ or more languages.
+
+ \image linguist-arrowpad_en.png
+
+ We will use two translations, French and Dutch, although there is no
+ effective limit on the number of possible translations that can be used
+ with an application. The relevant lines of \c arrowpad.pro are
+
+ \snippet examples/linguist/arrowpad/arrowpad.pro 0
+ \codeline
+ \snippet examples/linguist/arrowpad/arrowpad.pro 1
+
+ Run \c lupdate; it should produce two identical message files
+ \c arrowpad_fr.ts and \c arrowpad_nl.ts. These files will contain all the source
+ texts marked for translation with \c tr() calls and their contexts.
+
+ See the \l{Qt Linguist manual} for more information about
+ translating Qt application.
+
+ \section1 Line by Line Walkthrough
+
+ In \c arrowpad.h we define the \c ArrowPad subclass which is a
+ subclass of QWidget. In the screenshot above, the central
+ widget with the four buttons is an \c ArrowPad.
+
+ \snippet examples/linguist/arrowpad/arrowpad.h 0
+ \snippet examples/linguist/arrowpad/arrowpad.h 1
+ \snippet examples/linguist/arrowpad/arrowpad.h 2
+
+ When \c lupdate is run it not only extracts the source texts but it
+ also groups them into contexts. A context is the name of the class in
+ which the source text appears. Thus, in this example, "ArrowPad" is a
+ context: it is the context of the texts in the \c ArrowPad class.
+ The \c Q_OBJECT macro defines \c tr(x) in \c ArrowPad like this:
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 0
+
+ Knowing which class each source text appears in enables \e {Qt
+ Linguist} to group texts that are logically related together, e.g.
+ all the text in a dialog will have the context of the dialog's class
+ name and will be shown together. This provides useful information for
+ the translator since the context in which text appears may influence how
+ it should be translated. For some translations keyboard
+ accelerators may need to be changed and having all the source texts in a
+ particular context (class) grouped together makes it easier for the
+ translator to perform any accelerator changes without introducing
+ conflicts.
+
+ In \c arrowpad.cpp we implement the \c ArrowPad class.
+
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 0
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 1
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 2
+ \snippet examples/linguist/arrowpad/arrowpad.cpp 3
+
+ We call \c ArrowPad::tr() for each button's label since the labels are
+ user-visible text.
+
+ \image linguist-arrowpad_en.png
+
+ \snippet examples/linguist/arrowpad/mainwindow.h 0
+ \snippet examples/linguist/arrowpad/mainwindow.h 1
+
+ In the screenshot above, the whole window is a \c MainWindow.
+ This is defined in the \c mainwindow.h header file. Here too, we
+ use \c Q_OBJECT, so that \c MainWindow will become a context in
+ \e {Qt Linguist}.
+
+ \snippet examples/linguist/arrowpad/mainwindow.cpp 0
+
+ In the implementation of \c MainWindow, \c mainwindow.cpp, we create
+ an instance of our \c ArrowPad class.
+
+ \snippet examples/linguist/arrowpad/mainwindow.cpp 1
+
+ We also call \c MainWindow::tr() twice, once for the action and
+ once for the shortcut.
+
+ Note the use of \c tr() to support different keys in other
+ languages. "Ctrl+Q" is a good choice for Quit in English, but a
+ Dutch translator might want to use "Ctrl+A" (for Afsluiten) and a
+ German translator "Strg+E" (for Beenden). When using \c tr() for
+ \key Ctrl key accelerators, the two argument form should be used
+ with the second argument describing the function that the
+ accelerator performs.
+
+ Our \c main() function is defined in \c main.cpp as usual.
+
+ \snippet examples/linguist/arrowpad/main.cpp 2
+ \snippet examples/linguist/arrowpad/main.cpp 3
+
+ We choose which translation to use according to the current locale.
+ QLocale::system() can be influenced by setting the \c LANG
+ environment variable, for example. Notice that the use of a naming
+ convention that incorporates the locale for \c .qm message files,
+ (and \c .ts files), makes it easy to implement choosing the
+ translation file according to locale.
+
+ If there is no \c .qm message file for the locale chosen the original
+ source text will be used and no error raised.
+
+ \section1 Translating to French and Dutch
+
+ We'll begin by translating the example application into French. Start
+ \e {Qt Linguist} with \c arrowpad_fr.ts. You should get the seven source
+ texts ("\&Up", "\&Left", etc.) grouped in two contexts ("ArrowPad"
+ and "MainWindow").
+
+ Now, enter the following translations:
+
+ \list
+ \o \c ArrowPad
+ \list
+ \o \&Up - \&Haut
+ \o \&Left - \&Gauche
+ \o \&Right - \&Droite
+ \o \&Down - \&Bas
+ \endlist
+ \o \c MainWindow
+ \list
+ \o E\&xit - \&Quitter
+ \o Ctrl+Q - Ctrl+Q
+ \o \&File - \&Fichier
+ \endlist
+ \endlist
+
+ It's quickest to press \key{Alt+D} (which clicks the \gui {Done \& Next}
+ button) after typing each translation, since this marks the
+ translation as done and moves on to the next source text.
+
+ Save the file and do the same for Dutch working with \c arrowpad_nl.ts:
+
+ \list
+ \o \c ArrowPad
+ \list
+ \o \&Up - \&Omhoog
+ \o \&Left - \&Links
+ \o \&Right - \&Rechts
+ \o \&Down - Omlaa\&g
+ \endlist
+ \o \c MainWindow
+ \list
+ \o E\&xit - \&Afsluiten
+ \o Ctrl+Q - Ctrl+A
+ \o File - \&Bestand
+ \endlist
+ \endlist
+
+ We have to convert the \c tt1_fr.ts and \c tt1_nl.ts translation source
+ files into \c .qm files. We could use \e {Qt Linguist} as we've done
+ before; however using the command line tool \c lrelease ensures that
+ \e all the \c .qm files for the application are created without us
+ having to remember to load and \gui File|Release each one
+ individually from \e {Qt Linguist}.
+
+ Type
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 1
+
+ This should create both \c arrowpad_fr.qm and \c arrowpad_nl.qm. Set the \c
+ LANG environment variable to \c fr. In Unix, one of the two following
+ commands should work
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 2
+
+ In Windows, either modify \c autoexec.bat or run
+
+ \snippet doc/src/snippets/code/doc_src_examples_arrowpad.qdoc 3
+
+ When you run the program, you should now see the French version:
+
+ \image linguist-arrowpad_fr.png
+
+ Try the same with Dutch, by setting \c LANG=nl. Now the Dutch
+ version should appear:
+
+ \image linguist-arrowpad_nl.png
+
+ \section1 Exercises
+
+ Mark one of the translations in \e {Qt Linguist} as not done, i.e.
+ by unchecking the "done" checkbox; run \c lupdate, then \c lrelease,
+ then the example. What effect did this change have?
+
+ Set \c LANG=fr_CA (French Canada) and run the example program again.
+ Explain why the result is the same as with \c LANG=fr.
+
+ Change one of the accelerators in the Dutch translation to eliminate the
+ conflict between \e \&Bestand and \e \&Boven.
+*/
diff --git a/doc/src/examples/basicdrawing.qdoc b/doc/src/examples/basicdrawing.qdoc
new file mode 100644
index 0000000..5297201
--- /dev/null
+++ b/doc/src/examples/basicdrawing.qdoc
@@ -0,0 +1,468 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/basicdrawing
+ \title Basic Drawing Example
+
+ The Basic Drawing example shows how to display basic graphics
+ primitives in a variety of styles using the QPainter class.
+
+ QPainter performs low-level painting on widgets and other paint
+ devices. The class can draw everything from simple lines to
+ complex shapes like pies and chords. It can also draw aligned text
+ and pixmaps. Normally, it draws in a "natural" coordinate system,
+ but it can in addition do view and world transformation.
+
+ \image basicdrawing-example.png
+
+ The example provides a render area, displaying the currently
+ active shape, and lets the user manipulate the rendered shape and
+ its appearance using the QPainter parameters: The user can change
+ the active shape (\gui Shape), and modify the QPainter's pen (\gui
+ {Pen Width}, \gui {Pen Style}, \gui {Pen Cap}, \gui {Pen Join}),
+ brush (\gui {Brush Style}) and render hints (\gui
+ Antialiasing). In addition the user can rotate a shape (\gui
+ Transformations); behind the scenes we use QPainter's ability to
+ manipulate the coordinate system to perform the rotation.
+
+ The Basic Drawing example consists of two classes:
+
+ \list
+ \o \c RenderArea is a custom widget that renders multiple
+ copies of the currently active shape.
+ \o \c Window is the application's main window displaying a
+ \c RenderArea widget in addition to several parameter widgets.
+ \endlist
+
+ First we will review the \c Window class, then we will take a
+ look at the \c RenderArea class.
+
+ \section1 Window Class Definition
+
+ The Window class inherits QWidget, and is the application's main
+ window displaying a \c RenderArea widget in addition to several
+ parameter widgets.
+
+ \snippet examples/painting/basicdrawing/window.h 0
+
+ We declare the various widgets, and three private slots updating
+ the \c RenderArea widget: The \c shapeChanged() slot updates the
+ \c RenderArea widget when the user changes the currently active
+ shape. We call the \c penChanged() slot when either of the
+ QPainter's pen parameters changes. And the \c brushChanged() slot
+ updates the \c RenderArea widget when the user changes the
+ painter's brush style.
+
+ \section1 Window Class Implementation
+
+ In the constructor we create and initialize the various widgets
+ appearing in the main application window.
+
+ \snippet examples/painting/basicdrawing/window.cpp 1
+
+ First we create the \c RenderArea widget that will render the
+ currently active shape. Then we create the \gui Shape combobox,
+ and add the associated items (i.e. the different shapes a QPainter
+ can draw).
+
+ \snippet examples/painting/basicdrawing/window.cpp 2
+
+ QPainter's pen is a QPen object; the QPen class defines how a
+ painter should draw lines and outlines of shapes. A pen has
+ several properties: Width, style, cap and join.
+
+ A pen's width can be \e zero or greater, but the most common width
+ is zero. Note that this doesn't mean 0 pixels, but implies that
+ the shape is drawn as smoothly as possible although perhaps not
+ mathematically correct.
+
+ We create a QSpinBox for the \gui {Pen Width} parameter.
+
+ \snippet examples/painting/basicdrawing/window.cpp 3
+
+ The pen style defines the line type. The default style is solid
+ (Qt::SolidLine). Setting the style to none (Qt::NoPen) tells the
+ painter to not draw lines or outlines. The pen cap defines how
+ the end points of lines are drawn. And the pen join defines how
+ two lines join when multiple connected lines are drawn. The cap
+ and join only apply to lines with a width of 1 pixel or greater.
+
+ We create \l {QComboBox}es for each of the \gui {Pen Style}, \gui
+ {Pen Cap} and \gui {Pen Join} parameters, and adds the associated
+ items (i.e the values of the Qt::PenStyle, Qt::PenCapStyle and
+ Qt::PenJoinStyle enums respectively).
+
+ \snippet examples/painting/basicdrawing/window.cpp 4
+
+ The QBrush class defines the fill pattern of shapes drawn by a
+ QPainter. The default brush style is Qt::NoBrush. This style tells
+ the painter to not fill shapes. The standard style for filling is
+ Qt::SolidPattern.
+
+ We create a QComboBox for the \gui {Brush Style} parameter, and add
+ the associated items (i.e. the values of the Qt::BrushStyle enum).
+
+ \snippet examples/painting/basicdrawing/window.cpp 5
+ \snippet examples/painting/basicdrawing/window.cpp 6
+
+ Antialiasing is a feature that "smoothes" the pixels to create
+ more even and less jagged lines, and can be applied using
+ QPainter's render hints. QPainter::RenderHints are used to specify
+ flags to QPainter that may or may not be respected by any given
+ engine.
+
+ We simply create a QCheckBox for the \gui Antialiasing option.
+
+ \snippet examples/painting/basicdrawing/window.cpp 7
+
+ The \gui Transformations option implies a manipulation of the
+ coordinate system that will appear as if the rendered shape is
+ rotated in three dimensions.
+
+ We use the QPainter::translate(), QPainter::rotate() and
+ QPainter::scale() functions to implement this feature represented
+ in the main application window by a simple QCheckBox.
+
+ \snippet examples/painting/basicdrawing/window.cpp 8
+
+ Then we connect the parameter widgets with their associated slots
+ using the static QObject::connect() function, ensuring that the \c
+ RenderArea widget is updated whenever the user changes the shape,
+ or any of the other parameters.
+
+ \snippet examples/painting/basicdrawing/window.cpp 9
+ \snippet examples/painting/basicdrawing/window.cpp 10
+
+ Finally, we add the various widgets to a layout, and call the \c
+ shapeChanged(), \c penChanged(), and \c brushChanged() slots to
+ initialize the application. We also turn on antialiasing.
+
+ \snippet examples/painting/basicdrawing/window.cpp 11
+
+ The \c shapeChanged() slot is called whenever the user changes the
+ currently active shape.
+
+ First we retrieve the shape the user has chosen using the
+ QComboBox::itemData() function. This function returns the data for
+ the given role in the given index in the combobox. We use
+ QComboBox::currentIndex() to retrieve the index of the shape, and
+ the role is defined by the Qt::ItemDataRole enum; \c IdRole is an
+ alias for Qt::UserRole.
+
+ Note that Qt::UserRole is only the first role that can be used for
+ application-specific purposes. If you need to store different data
+ in the same index, you can use different roles by simply
+ incrementing the value of Qt::UserRole, for example: 'Qt::UserRole
+ + 1' and 'Qt::UserRole + 2'. However, it is a good programming
+ practice to give each role their own name: 'myFirstRole =
+ Qt::UserRole + 1' and 'mySecondRole = Qt::UserRole + 2'. Even
+ though we only need a single role in this particular example, we
+ add the following line of code to the beginning of the \c
+ window.cpp file.
+
+ \snippet examples/painting/basicdrawing/window.cpp 0
+
+ The QComboBox::itemData() function returns the data as a QVariant,
+ so we need to cast the data to \c RenderArea::Shape. If there is
+ no data for the given role, the function returns
+ QVariant::Invalid.
+
+ In the end we call the \c RenderArea::setShape() slot to update
+ the \c RenderArea widget.
+
+ \snippet examples/painting/basicdrawing/window.cpp 12
+
+ We call the \c penChanged() slot whenever the user changes any of
+ the pen parameters. Again we use the QComboBox::itemData()
+ function to retrieve the parameters, and then we call the \c
+ RenderArea::setPen() slot to update the \c RenderArea widget.
+
+ \snippet examples/painting/basicdrawing/window.cpp 13
+
+ The brushChanged() slot is called whenever the user changes the
+ brush parameter which we retrieve using the QComboBox::itemData()
+ function as before.
+
+ \snippet examples/painting/basicdrawing/window.cpp 14
+
+ If the brush parameter is a gradient fill, special actions are
+ required.
+
+ The QGradient class is used in combination with QBrush to specify
+ gradient fills. Qt currently supports three types of gradient
+ fills: linear, radial and conical. Each of these is represented by
+ a subclass of QGradient: QLinearGradient, QRadialGradient and
+ QConicalGradient.
+
+ So if the brush style is Qt::LinearGradientPattern, we first
+ create a QLinearGradient object with interpolation area between
+ the coordinates passed as arguments to the constructor. The
+ positions are specified using logical coordinates. Then we set the
+ gradient's colors using the QGradient::setColorAt() function. The
+ colors is defined using stop points which are composed by a
+ position (between 0 and 1) and a QColor. The set of stop points
+ describes how the gradient area should be filled. A gradient can
+ have an arbitrary number of stop points.
+
+ In the end we call \c RenderArea::setBrush() slot to update the \c
+ RenderArea widget's brush with the QLinearGradient object.
+
+ \snippet examples/painting/basicdrawing/window.cpp 15
+
+ A similar pattern of actions, as the one used for QLinearGradient,
+ is used in the cases of Qt::RadialGradientPattern and
+ Qt::ConicalGradientPattern.
+
+ The only difference is the arguments passed to the constructor:
+ Regarding the QRadialGradient constructor the first argument is
+ the center, and the second the radial gradient's radius. The third
+ argument is optional, but can be used to define the focal point of
+ the gradient inside the circle (the default focal point is the
+ circle center). Regarding the QConicalGradient constructor, the
+ first argument specifies the center of the conical, and the second
+ specifies the start angle of the interpolation.
+
+ \snippet examples/painting/basicdrawing/window.cpp 16
+
+ If the brush style is Qt::TexturePattern we create a QBrush from a
+ QPixmap. Then we call \c RenderArea::setBrush() slot to update the
+ \c RenderArea widget with the newly created brush.
+
+ \snippet examples/painting/basicdrawing/window.cpp 17
+
+ Otherwise we simply create a brush with the given style and a
+ green color, and then call \c RenderArea::setBrush() slot to
+ update the \c RenderArea widget with the newly created brush.
+
+ \section1 RenderArea Class Definition
+
+ The \c RenderArea class inherits QWidget, and renders multiple
+ copies of the currently active shape using a QPainter.
+
+ \snippet examples/painting/basicdrawing/renderarea.h 0
+
+ First we define a public \c Shape enum to hold the different
+ shapes that can be rendered by the widget (i.e the shapes that can
+ be rendered by a QPainter). Then we reimplement the constructor as
+ well as two of QWidget's public functions: \l
+ {QWidget::minimumSizeHint()}{minimumSizeHint()} and \l
+ {QWidget::sizeHint()}{sizeHint()}.
+
+ We also reimplement the QWidget::paintEvent() function to be able
+ to draw the currently active shape according to the specified
+ parameters.
+
+ We declare several private slots: The \c setShape() slot changes
+ the \c RenderArea's shape, the \c setPen() and \c setBrush() slots
+ modify the widget's pen and brush, and the \c setAntialiased() and
+ \c setTransformed() slots modify the widget's respective
+ properties.
+
+ \section1 RenderArea Class Implementation
+
+ In the constructor we initialize some of the widget's variables.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 0
+
+ We set its shape to be a \gui Polygon, its antialiased property to
+ be false and we load an image into the widget's pixmap
+ variable. In the end we set the widget's background role, defining
+ the brush from the widget's \l {QWidget::palette}{palette} that
+ will be used to render the background. QPalette::Base is typically
+ white.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 2
+
+ The \c RenderArea inherits QWidget's \l
+ {QWidget::sizeHint()}{sizeHint} property holding the recommended
+ size for the widget. If the value of this property is an invalid
+ size, no size is recommended.
+
+ The default implementation of the QWidget::sizeHint() function
+ returns an invalid size if there is no layout for the widget, and
+ returns the layout's preferred size otherwise.
+
+ Our reimplementation of the function returns a QSize with a 400
+ pixels width and a 200 pixels height.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 1
+
+ \c RenderArea also inherits QWidget's
+ \l{QWidget::minimumSizeHint()}{minimumSizeHint} property holding
+ the recommended minimum size for the widget. Again, if the value
+ of this property is an invalid size, no size is recommended.
+
+ The default implementation of QWidget::minimumSizeHint() returns
+ an invalid size if there is no layout for the widget, and returns
+ the layout's minimum size otherwise.
+
+ Our reimplementation of the function returns a QSize with a 100
+ pixels width and a 100 pixels height.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 3
+ \codeline
+ \snippet examples/painting/basicdrawing/renderarea.cpp 4
+ \codeline
+ \snippet examples/painting/basicdrawing/renderarea.cpp 5
+
+ The public \c setShape(), \c setPen() and \c setBrush() slots are
+ called whenever we want to modify a \c RenderArea widget's shape,
+ pen or brush. We set the shape, pen or brush according to the
+ slot parameter, and call QWidget::update() to make the changes
+ visible in the \c RenderArea widget.
+
+ The QWidget::update() slot does not cause an immediate
+ repaint; instead it schedules a paint event for processing when Qt
+ returns to the main event loop.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 6
+ \codeline
+ \snippet examples/painting/basicdrawing/renderarea.cpp 7
+
+ With the \c setAntialiased() and \c setTransformed() slots we
+ change the state of the properties according to the slot
+ parameter, and call the QWidget::update() slot to make the changes
+ visible in the \c RenderArea widget.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 8
+
+ Then we reimplement the QWidget::paintEvent() function. The first
+ thing we do is to create the graphical objects we will need to
+ draw the various shapes.
+
+ We create a vector of four \l {QPoint}s. We use this vector to
+ render the \gui Points, \gui Polyline and \gui Polygon
+ shapes. Then we create a QRect, defining a rectangle in the plane,
+ which we use as the bounding rectangle for all the shapes excluding
+ the \gui Path and the \gui Pixmap.
+
+ We also create a QPainterPath. The QPainterPath class provides a
+ container for painting operations, enabling graphical shapes to be
+ constructed and reused. A painter path is an object composed of a
+ number of graphical building blocks, such as rectangles, ellipses,
+ lines, and curves. For more information about the QPainterPath
+ class, see the \l {painting/painterpaths}{Painter Paths}
+ example. In this example, we create a painter path composed of one
+ straight line and a Bezier curve.
+
+ In addition we define a start angle and an arc length that we will
+ use when drawing the \gui Arc, \gui Chord and \gui Pie shapes.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 9
+
+ We create a QPainter for the \c RenderArea widget, and set the
+ painters pen and brush according to the \c RenderArea's pen and
+ brush. If the \gui Antialiasing parameter option is checked, we
+ also set the painter's render hints. QPainter::Antialiasing
+ indicates that the engine should antialias edges of primitives if
+ possible.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 10
+
+ Finally, we render the multiple copies of the \c RenderArea's
+ shape. The number of copies is depending on the size of the \c
+ RenderArea widget, and we calculate their positions using two \c
+ for loops and the widgets height and width.
+
+ For each copy we first save the current painter state (pushes the
+ state onto a stack). Then we translate the coordinate system,
+ using the QPainter::translate() function, to the position
+ determined by the variables of the \c for loops. If we omit this
+ translation of the coordinate system all the copies of the shape
+ will be rendered on top of each other in the top left cormer of
+ the \c RenderArea widget.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 11
+
+ If the \gui Transformations parameter option is checked, we do an
+ additional translation of the coordinate system before we rotate
+ the coordinate system 60 degrees clockwise using the
+ QPainter::rotate() function and scale it down in size using the
+ QPainter::scale() function. In the end we translate the coordinate
+ system back to where it was before we rotated and scaled it.
+
+ Now, when rendering the shape, it will appear as if it was rotated
+ in three dimensions.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 12
+
+ Next, we identify the \c RenderArea's shape, and render it using
+ the associated QPainter drawing function:
+
+ \list
+ \o QPainter::drawLine(),
+ \o QPainter::drawPoints(),
+ \o QPainter::drawPolyline(),
+ \o QPainter::drawPolygon(),
+ \o QPainter::drawRect(),
+ \o QPainter::drawRoundedRect(),
+ \o QPainter::drawEllipse(),
+ \o QPainter::drawArc(),
+ \o QPainter::drawChord(),
+ \o QPainter::drawPie(),
+ \o QPainter::drawPath(),
+ \o QPainter::drawText() or
+ \o QPainter::drawPixmap()
+ \endlist
+
+ Before we started rendering, we saved the current painter state
+ (pushes the state onto a stack). The rationale for this is that we
+ calculate each shape copy's position relative to the same point in
+ the coordinate system. When translating the coordinate system, we
+ lose the knowledge of this point unless we save the current
+ painter state \e before we start the translating process.
+
+ \snippet examples/painting/basicdrawing/renderarea.cpp 13
+
+ Then, when we are finished rendering a copy of the shape we can
+ restore the original painter state, with its associated coordinate
+ system, using the QPainter::restore() function. In this way we
+ ensure that the next shape copy will be rendered in the correct
+ position.
+
+ We could translate the coordinate system back using
+ QPainter::translate() instead of saving the painter state. But
+ since we in addition to translating the coordinate system (when
+ the \gui Transformation parameter option is checked) both rotate
+ and scale the coordinate system, the easiest solution is to save
+ the current painter state.
+*/
diff --git a/doc/src/examples/basicgraphicslayouts.qdoc b/doc/src/examples/basicgraphicslayouts.qdoc
new file mode 100644
index 0000000..92571af
--- /dev/null
+++ b/doc/src/examples/basicgraphicslayouts.qdoc
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/basicgraphicslayouts
+ \title Basic Graphics Layouts Example
+
+ The Basic Graphics Layouts example shows how to use the layout classes
+ in QGraphicsView: QGraphicsLinearLayout and QGraphicsGridLayout.
+
+ \image basicgraphicslayouts-example.png Screenshot of the Basic Layouts Example
+
+ \section1 Window Class Definition
+
+ The \c Window class is a subclass of QGraphicsWidget. It has a
+ constructor with a QGraphicsWidget \a parent as its parameter.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/window.h 0
+
+ \section1 Window Class Implementation
+
+ The constructor of \c Window instantiates a QGraphicsLinearLayout object,
+ \c windowLayout, with vertical orientation. We instantiate another
+ QGraphicsLinearLayout object, \c linear, whose parent is \c windowLayout.
+ Next, we create a \c LayoutItem object, \c item and add it to \c linear
+ with the \l{QGraphicsLinearLayout::}{addItem()} function. We also provide
+ \c item with a \l{QGraphicsLinearLayout::setStretchFactor()}
+ {stretchFactor}.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/window.cpp 0
+
+ We repeat the process:
+
+ \list
+ \o create a new \c LayoutItem,
+ \o add the item \c linear, and
+ \o provide a stretch factor.
+ \endlist
+
+ \snippet examples/graphicsview/basicgraphicslayouts/window.cpp 1
+
+ We then add \c linear to \c windowLayout, nesting two
+ QGraphicsLinearLayout objects. Apart from the QGraphicsLinearLayout, we
+ also use a QGraphicsGridLayout object, \c grid, which is a 4x3 grid with
+ some cells spanning to other rows.
+
+ We create seven \c LayoutItem objects and place them into \c grid with
+ the \l{QGraphicsGridLayout::}{addItem()} function as shown in the code
+ snippet below:
+
+ \snippet examples/graphicsview/basicgraphicslayouts/window.cpp 2
+
+ The first item we add to \c grid is placed in the top left cell,
+ spanning four rows. The next two items are placed in the second column,
+ and they span two rows. Each item's \l{QGraphicsWidget::}{maximumHeight()}
+ and \l{QGraphicsWidget::}{minimumHeight()} are set to be equal so that
+ they do not expand vertically. As a result, these items will not
+ fit vertically in their cells. So, we specify that they should be
+ vertically aligned in the center of the cell using Qt::AlignVCenter.
+
+ Finally, \c grid itself is added to \c windowLayout. Unlike
+ QGridLayout::addItem(), QGraphicsGridLayout::addItem() requires a row
+ and a column for its argument, specifying which cell the item should be
+ positioned in. Also, if the \c rowSpan and \c columnSpan arguments
+ are omitted, they will default to 1.
+
+ Note that we do not specify a parent for each \c LayoutItem that we
+ construct, as all these items will be added to \c windowLayout. When we
+ add an item to a layout, it will be automatically reparented to the widget
+ on which the layout is installed.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/window.cpp 3
+
+ Now that we have set up \c grid and added it to \c windowLayout, we
+ install \c windowLayout onto the window object using
+ QGraphicsWidget::setLayout() and we set the window title.
+
+ \section1 LayoutItem Class Definition
+
+ The \c LayoutItem class is a subclass of QGraphicsWidget. It has a
+ constructor, a destructor, and a reimplementation of the
+ {QGraphicsItem::paint()}{paint()} function.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.h 0
+
+ The \c LayoutItem class also has a private instance of QPixmap, \c pix.
+
+ \note We subclass QGraphicsWidget so that \c LayoutItem objects can
+ be automatically plugged into a layout, as QGraphicsWidget is a
+ specialization of QGraphicsLayoutItem.
+
+ \section1 LayoutItem Class Implementation
+
+ In \c{LayoutItem}'s constructor, \c pix is instantiated and the
+ \c{QT_original_R.png} image is loaded into it. We set the size of
+ \c LayoutItem to be slightly larger than the size of the pixmap as we
+ require some space around it for borders that we will paint later.
+ Alternatively, you could scale the pixmap to prevent the item from
+ becoming smaller than the pixmap.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 0
+
+ We use the Q_UNUSED() macro to prevent the compiler from generating
+ warnings regarding unused parameters.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 1
+
+ The idea behind the \c paint() function is to paint the
+ background rect then paint a rect around the pixmap.
+
+ \snippet examples/graphicsview/basicgraphicslayouts/layoutitem.cpp 2
+
+*/ \ No newline at end of file
diff --git a/doc/src/examples/basiclayouts.qdoc b/doc/src/examples/basiclayouts.qdoc
new file mode 100644
index 0000000..0d64b1f
--- /dev/null
+++ b/doc/src/examples/basiclayouts.qdoc
@@ -0,0 +1,204 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example layouts/basiclayouts
+ \title Basic Layouts Example
+
+ The Basic Layouts example shows how to use the standard layout
+ managers that are available in Qt: QBoxLayout, QGridLayout and
+ QFormLayout.
+
+ \image basiclayouts-example.png Screenshot of the Basic Layouts example
+
+ The QBoxLayout class lines up widgets horizontally or vertically.
+ QHBoxLayout and QVBoxLayout are convenience subclasses of QBoxLayout.
+ QGridLayout lays out widgets in cells by dividing the available space
+ into rows and columns. QFormLayout, on the other hand, lays out its
+ children in a two-column form with labels in the left column and
+ input fields in the right column.
+
+ \section1 Dialog Class Definition
+
+ \snippet examples/layouts/basiclayouts/dialog.h 0
+
+ The \c Dialog class inherits QDialog. It is a custom widget that
+ displays its child widgets using the geometry managers:
+ QHBoxLayout, QVBoxLayout, QGridLayout and QFormLayout.
+
+ We declare four private functions to simplify the class
+ constructor: The \c createMenu(), \c createHorizontalGroupBox(),
+ \c createGridGroupBox() and \c createFormGroupBox() functions create
+ several widgets that the example uses to demonstrate how the layout
+ affects their appearances.
+
+ \section1 Dialog Class Implementation
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 0
+
+ In the constructor, we first use the \c createMenu() function to
+ create and populate a menu bar and the \c createHorizontalGroupBox()
+ function to create a group box containing four buttons with a
+ horizontal layout. Next we use the \c createGridGroupBox() function
+ to create a group box containing several line edits and a small text
+ editor which are displayed in a grid layout. Finally, we use the
+ \c createFormGroupBox() function to createa a group box with
+ three labels and three input fields: a line edit, a combo box and
+ a spin box.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 1
+
+ We also create a big text editor and a dialog button box. The
+ QDialogButtonBox class is a widget that presents buttons in a
+ layout that is appropriate to the current widget style. The
+ preferred buttons can be specified as arguments to the
+ constructor, using the QDialogButtonBox::StandardButtons enum.
+
+ Note that we don't have to specify a parent for the widgets when
+ we create them. The reason is that all the widgets we create here
+ will be added to a layout, and when we add a widget to a layout,
+ it is automatically reparented to the widget the layout is
+ installed on.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 2
+
+ The main layout is a QVBoxLayout object. QVBoxLayout is a
+ convenience class for a box layout with vertical orientation.
+
+ In general, the QBoxLayout class takes the space it gets (from its
+ parent layout or from the parent widget), divides it up into a
+ series of boxes, and makes each managed widget fill one box. If
+ the QBoxLayout's orientation is Qt::Horizontal the boxes are
+ placed in a row. If the orientation is Qt::Vertical, the boxes are
+ placed in a column. The corresponding convenience classes are
+ QHBoxLayout and QVBoxLayout, respectively.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 3
+
+ When we call the QLayout::setMenuBar() function, the layout places
+ the provided menu bar at the top of the parent widget, and outside
+ the widget's \l {QWidget::contentsRect()}{content margins}. All
+ child widgets are placed below the bottom edge of the menu bar.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 4
+
+ We use the QBoxLayout::addWidget() function to add the widgets to
+ the end of layout. Each widget will get at least its minimum size
+ and at most its maximum size. It is possible to specify a stretch
+ factor in the \l {QBoxLayout::addWidget()}{addWidget()} function,
+ and any excess space is shared according to these stretch
+ factors. If not specified, a widget's stretch factor is 0.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 5
+
+ We install the main layout on the \c Dialog widget using the
+ QWidget::setLayout() function, and all of the layout's widgets are
+ automatically reparented to be children of the \c Dialog widget.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 6
+
+ In the private \c createMenu() function we create a menu bar, and
+ add a pull-down \gui File menu containing an \gui Exit option.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 7
+
+ When we create the horizontal group box, we use a QHBoxLayout as
+ the internal layout. We create the buttons we want to put in the
+ group box, add them to the layout and install the layout on the
+ group box.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 8
+
+ In the \c createGridGroupBox() function we use a QGridLayout which
+ lays out widgets in a grid. It takes the space made available to
+ it (by its parent layout or by the parent widget), divides it up
+ into rows and columns, and puts each widget it manages into the
+ correct cell.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 9
+
+ For each row in the grid we create a label and an associated line
+ edit, and add them to the layout. The QGridLayout::addWidget()
+ function differ from the corresponding function in QBoxLayout: It
+ needs the row and column specifying the grid cell to put the
+ widget in.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 10
+
+ QGridLayout::addWidget() can in addition take arguments
+ specifying the number of rows and columns the cell will be
+ spanning. In this example, we create a small editor which spans
+ three rows and one column.
+
+ For both the QBoxLayout::addWidget() and QGridLayout::addWidget()
+ functions it is also possible to add a last argument specifying
+ the widget's alignment. By default it fills the whole cell. But we
+ could, for example, align a widget with the right edge by
+ specifying the alignment to be Qt::AlignRight.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 11
+
+ Each column in a grid layout has a stretch factor. The stretch
+ factor is set using QGridLayout::setColumnStretch() and determines
+ how much of the available space the column will get over and above
+ its necessary minimum.
+
+ In this example, we set the stretch factors for columns 1 and 2.
+ The stretch factor is relative to the other columns in this grid;
+ columns with a higher stretch factor take more of the available
+ space. So column 2 in our grid layout will get more of the
+ available space than column 1, and column 0 will not grow at all
+ since its stretch factor is 0 (the default).
+
+ Columns and rows behave identically; there is an equivalent
+ stretch factor for rows, as well as a QGridLayout::setRowStretch()
+ function.
+
+ \snippet examples/layouts/basiclayouts/dialog.cpp 12
+
+ In the \c createFormGroupBox() function, we use a QFormLayout
+ to neatly arrange objects into two columns - name and field.
+ There are three QLabel objects for names with three
+ corresponding input widgets as fields: a QLineEdit, a QComboBox
+ and a QSpinBox. Unlike QBoxLayout::addWidget() and
+ QGridLayout::addWidget(), we use QFormLayout::addRow() to add widgets
+ to the layout.
+*/
diff --git a/doc/src/examples/basicsortfiltermodel.qdoc b/doc/src/examples/basicsortfiltermodel.qdoc
new file mode 100644
index 0000000..557729a
--- /dev/null
+++ b/doc/src/examples/basicsortfiltermodel.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/basicsortfiltermodel
+ \title Basic Sort/Filter Model Example
+
+ The Basic Sort/Filter Model example illustrates how to use
+ QSortFilterProxyModel to perform basic sorting and filtering.
+
+ \image basicsortfiltermodel-example.png Screenshot of the Basic Sort/Filter Model Example
+
+*/
diff --git a/doc/src/examples/blockingfortuneclient.qdoc b/doc/src/examples/blockingfortuneclient.qdoc
new file mode 100644
index 0000000..5c9dbe1
--- /dev/null
+++ b/doc/src/examples/blockingfortuneclient.qdoc
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/blockingfortuneclient
+ \title Blocking Fortune Client Example
+
+ The Blocking Fortune Client example shows how to create a client for a
+ network service using QTcpSocket's synchronous API in a non-GUI thread.
+
+ \image blockingfortuneclient-example.png
+
+ QTcpSocket supports two general approaches to network programming:
+
+ \list
+
+ \o \e{The asynchronous (non-blocking) approach.} Operations are scheduled
+ and performed when control returns to Qt's event loop. When the operation
+ is finished, QTcpSocket emits a signal. For example,
+ QTcpSocket::connectToHost() returns immediately, and when the connection
+ has been established, QTcpSocket emits
+ \l{QTcpSocket::connected()}{connected()}.
+
+ \o \e{The synchronous (blocking) approach.} In non-GUI and multithreaded
+ applications, you can call the \c waitFor...() functions (e.g.,
+ QTcpSocket::waitForConnected()) to suspend the calling thread until the
+ operation has completed, instead of connecting to signals.
+
+ \endlist
+
+ The implementation is very similar to the
+ \l{network/fortuneclient}{Fortune Client} example, but instead of having
+ QTcpSocket as a member of the main class, doing asynchronous networking in
+ the main thread, we will do all network operations in a separate thread
+ and use QTcpSocket's blocking API.
+
+ The purpose of this example is to demonstrate a pattern that you can use
+ to simplify your networking code, without losing responsiveness in your
+ user interface. Use of Qt's blocking network API often leads to
+ simpler code, but because of its blocking behavior, it should only be used
+ in non-GUI threads to prevent the user interface from freezing. But
+ contrary to what many think, using threads with QThread does not
+ necessarily add unmanagable complexity to your application.
+
+ We will start with the FortuneThread class, which handles the network
+ code.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.h 0
+
+ FortuneThread is a QThread subclass that provides an API for scheduling
+ requests for fortunes, and it has signals for delivering fortunes and
+ reporting errors. You can call requestNewFortune() to request a new
+ fortune, and the result is delivered by the newFortune() signal. If any
+ error occurs, the error() signal is emitted.
+
+ It's important to notice that requestNewFortune() is called from the main,
+ GUI thread, but the host name and port values it stores will be accessed
+ from FortuneThread's thread. Because we will be reading and writing
+ FortuneThread's data members from different threads concurrently, we use
+ QMutex to synchronize access.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 2
+
+ The requestNewFortune() function stores the host name and port of the
+ fortune server as member data, and we lock the mutex with QMutexLocker to
+ protect this data. We then start the thread, unless it is already
+ running. We will come back to the QWaitCondition::wakeOne() call later.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 4
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 5
+
+ In the run() function, we start by acquiring the mutex lock, fetching the
+ host name and port from the member data, and then releasing the lock
+ again. The case that we are protecting ourselves against is that \c
+ requestNewFortune() could be called at the same time as we are fetching
+ this data. QString is \l reentrant but \e not \l{thread-safe}, and we must
+ also avoid the unlikely risk of reading the host name from one request,
+ and port of another. And as you might have guessed, FortuneThread can only
+ handle one request at a time.
+
+ The run() function now enters a loop:
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 6
+
+ The loop will continue requesting fortunes for as long as \e quit is
+ false. We start our first request by creating a QTcpSocket on the stack,
+ and then we call \l{QTcpSocket::connectToHost()}{connectToHost()}. This
+ starts an asynchronous operation which, after control returns to Qt's
+ event loop, will cause QTcpSocket to emit
+ \l{QTcpSocket::connected()}{connected()} or
+ \l{QTcpSocket::error()}{error()}.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 8
+
+ But since we are running in a non-GUI thread, we do not have to worry
+ about blocking the user interface. So instead of entering an event loop,
+ we simply call QTcpSocket::waitForConnected(). This function will wait,
+ blocking the calling thread, until QTcpSocket emits connected() or an
+ error occurs. If connected() is emitted, the function returns true; if the
+ connection failed or timed out (which in this example happens after 5
+ seconds), false is returned. QTcpSocket::waitForConnected(), like the
+ other \c waitFor...() functions, is part of QTcpSocket's \e{blocking
+ API}.
+
+ After this statement, we have a connected socket to work with. Now it's
+ time to see what the fortune server has sent us.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 9
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 10
+
+ This step is to read the size of the packet. Although we are only reading
+ two bytes here, and the \c while loop may seem to overdo it, we present this
+ code to demonstrate a good pattern for waiting for data using
+ QTcpSocket::waitForReadyRead(). It goes like this: For as long as we still
+ need more data, we call waitForReadyRead(). If it returns false,
+ we abort the operation. After this statement, we know that we have received
+ enough data.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 11
+
+ Now we can create a QDataStream object, passing the socket to
+ QDataStream's constructor, and as in the other client examples we set
+ the stream protocol version to QDataStream::Qt_4_0, and read the size
+ of the packet.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 12
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 13
+
+ Again, we'll use a loop that waits for more data by calling
+ QTcpSocket::waitForReadyRead(). In this loop, we're waiting until
+ QTcpSocket::bytesAvailable() returns the full packet size.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 14
+
+ Now that we have all the data that we need, we can use QDataStream to
+ read the fortune string from the packet. The resulting fortune is
+ delivered by emitting newFortune().
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 15
+
+ The final part of our loop is that we acquire the mutex so that we can
+ safely read from our member data. We then let the thread go to sleep by
+ calling QWaitCondition::wait(). At this point, we can go back to
+ requestNewFortune() and look closed at the call to wakeOne():
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 1
+ \dots
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 3
+
+ What happened here was that because the thread falls asleep waiting for a
+ new request, we needed to wake it up again when a new request
+ arrives. QWaitCondition is often used in threads to signal a wakeup call
+ like this.
+
+ \snippet examples/network/blockingfortuneclient/fortunethread.cpp 0
+
+ Finishing off the FortuneThread walkthrough, this is the destructor that
+ sets \e quit to true, wakes up the thread and waits for the thread to exit
+ before returning. This lets the \c while loop in run() will finish its current
+ iteration. When run() returns, the thread will terminate and be destroyed.
+
+ Now for the BlockingClient class:
+
+ \snippet examples/network/blockingfortuneclient/blockingclient.h 0
+
+ BlockingClient is very similar to the Client class in the
+ \l{network/fortuneclient}{Fortune Client} example, but in this class
+ we store a FortuneThread member instead of a pointer to a QTcpSocket.
+ When the user clicks the "Get Fortune" button, the same slot is called,
+ but its implementation is slightly different:
+
+ \snippet examples/network/blockingfortuneclient/blockingclient.cpp 0
+ \snippet examples/network/blockingfortuneclient/blockingclient.cpp 1
+
+ We connect our FortuneThread's two signals newFortune() and error() (which
+ are somewhat similar to QTcpSocket::readyRead() and QTcpSocket::error() in
+ the previous example) to requestNewFortune() and displayError().
+
+ \snippet examples/network/blockingfortuneclient/blockingclient.cpp 2
+
+ The requestNewFortune() slot calls FortuneThread::requestNewFortune(),
+ which \e shedules the request. When the thread has received a new fortune
+ and emits newFortune(), our showFortune() slot is called:
+
+ \snippet examples/network/blockingfortuneclient/blockingclient.cpp 3
+ \codeline
+ \snippet examples/network/blockingfortuneclient/blockingclient.cpp 4
+
+ Here, we simply display the fortune we received as the argument.
+
+ \sa {Fortune Client Example}, {Fortune Server Example}
+*/
diff --git a/doc/src/examples/borderlayout.qdoc b/doc/src/examples/borderlayout.qdoc
new file mode 100644
index 0000000..6275249
--- /dev/null
+++ b/doc/src/examples/borderlayout.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example layouts/borderlayout
+ \title Border Layout Example
+
+ The Border Layout example shows how to create a custom layout that arranges
+ child widgets according to a simple set of rules.
+
+ \image borderlayout-example.png
+*/
diff --git a/doc/src/examples/broadcastreceiver.qdoc b/doc/src/examples/broadcastreceiver.qdoc
new file mode 100644
index 0000000..253b68b
--- /dev/null
+++ b/doc/src/examples/broadcastreceiver.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/broadcastreceiver
+ \title Broadcast Receiver Example
+
+ The Broadcast Receiever example shows how to receive information that is broadcasted
+ over a local network.
+
+ \image broadcastreceiver-example.png
+*/
diff --git a/doc/src/examples/broadcastsender.qdoc b/doc/src/examples/broadcastsender.qdoc
new file mode 100644
index 0000000..05975aa
--- /dev/null
+++ b/doc/src/examples/broadcastsender.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/broadcastsender
+ \title Broadcast Sender Example
+
+ The Broadcast Sender example shows how to broadcast information to multiple clients
+ on a local network.
+
+ \image broadcastsender-example.png
+*/
diff --git a/doc/src/examples/cachedtable.qdoc b/doc/src/examples/cachedtable.qdoc
new file mode 100644
index 0000000..b7f416b
--- /dev/null
+++ b/doc/src/examples/cachedtable.qdoc
@@ -0,0 +1,211 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/cachedtable
+ \title Cached Table Example
+
+ The Cached Table example shows how a table view can be used to access a database,
+ caching any changes to the data until the user explicitly submits them using a
+ push button.
+
+ \image cachedtable-example.png
+
+ The example consists of a single class, \c TableEditor, which is a
+ custom dialog widget that allows the user to modify data stored in
+ a database. We will first review the class definiton and how to
+ use the class, then we will take a look at the implementation.
+
+ \section1 TableEditor Class Definition
+
+ The \c TableEditor class inherits QDialog making the table editor
+ widget a top-level dialog window.
+
+ \snippet examples/sql/cachedtable/tableeditor.h 0
+
+ The \c TableEditor constructor takes two arguments: The first is a
+ pointer to the parent widget and is passed on to the base class
+ constructor. The other is a reference to the database table the \c
+ TableEditor object will operate on.
+
+ Note the QSqlTableModel variable declaration: As we will see in
+ this example, the QSqlTableModel class can be used to provide data
+ to view classes such as QTableView. The QSqlTableModel class
+ provides an editable data model making it possible to read and
+ write database records from a single table. It is build on top of
+ the lower-level QSqlQuery class which provides means of executing
+ and manipulating SQL statements.
+
+ We are also going to show how a table view can be used to cache
+ any changes to the data until the user explicitly requests to
+ submit them. For that reason we need to declare a \c submit() slot
+ in additon to the model and the editor's buttons.
+
+ \table 100%
+ \header \o Connecting to a Database
+ \row
+ \o
+
+ Before we can use the \c TableEditor class, we must create a
+ connection to the database containing the table we want to edit:
+
+ \snippet examples/sql/cachedtable/main.cpp 0
+
+ The \c createConnection() function is a helper function provided
+ for convenience. It is defined in the \c connection.h file which
+ is located in the \c sql example directory (all the examples in
+ the \c sql directory use this function to connect to a database).
+
+ \snippet examples/sql/connection.h 0
+
+ The \c createConnection function opens a connection to an
+ in-memory SQLITE database and creates a test table. If you want
+ to use another database, simply modify this function's code.
+ \endtable
+
+ \section1 TableEditor Class Implementation
+
+ The class implementation consists of only two functions, the
+ constructor and the \c submit() slot. In the constructor we create
+ and customize the data model and the various window elements:
+
+ \snippet examples/sql/cachedtable/tableeditor.cpp 0
+
+ First we create the data model and set the SQL database table we
+ want the model to operate on. Note that the
+ QSqlTableModel::setTable() function does not select data from the
+ table; it only fetches its field information. For that reason we
+ call the QSqlTableModel::select() function later on, populating
+ the model with data from the table. The selection can be
+ customized by specifying filters and sort conditions (see the
+ QSqlTableModel class documentation for more details).
+
+ We also set the model's edit strategy. The edit strategy dictates
+ when the changes done by the user in the view, are actually
+ applied to the database. Since we want to cache the changes in the
+ table view (i.e. in the model) until the user explicitly submits
+ them, we choose the QSqlTableModel::OnManualSubmit strategy. The
+ alternatives are QSqlTableModel::OnFieldChange and
+ QSqlTableModel::OnRowChange.
+
+ Finally, we set up the labels displayed in the view header using
+ the \l {QSqlQueryModel::setHeaderData()}{setHeaderData()} function
+ that the model inherits from the QSqlQueryModel class.
+
+ \snippet examples/sql/cachedtable/tableeditor.cpp 1
+
+ Then we create a table view. The QTableView class provides a
+ default model/view implementation of a table view, i.e. it
+ implements a table view that displays items from a model. It also
+ allows the user to edit the items, storing the changes in the
+ model. To create a read only view, set the proper flag using the
+ \l {QAbstractItemView::editTriggers}{editTriggers} property the
+ view inherits from the QAbstractItemView class.
+
+ To make the view present our data, we pass our model to the view
+ using the \l {QAbstractItemView::setModel()}{setModel()} function.
+
+ \snippet examples/sql/cachedtable/tableeditor.cpp 2
+
+ The \c {TableEditor}'s buttons are regular QPushButton objects. We
+ add them to a button box to ensure that the buttons are presented
+ in a layout that is appropriate to the current widget style. The
+ rationale for this is that dialogs and message boxes typically
+ present buttons in a layout that conforms to the interface
+ guidelines for that platform. Invariably, different platforms have
+ different layouts for their dialogs. QDialogButtonBox allows a
+ developer to add buttons to it and will automatically use the
+ appropriate layout for the user's desktop environment.
+
+ Most buttons for a dialog follow certain roles. When adding a
+ button to a button box using the \l
+ {QDialogButtonBox}{addButton()} function, the button's role must
+ be specified using the QDialogButtonBox::ButtonRole
+ enum. Alternatively, QDialogButtonBox provides several standard
+ buttons (e.g. \gui OK, \gui Cancel, \gui Save) that you can
+ use. They exist as flags so you can OR them together in the
+ constructor.
+
+ \snippet examples/sql/cachedtable/tableeditor.cpp 3
+
+ We connect the \gui Quit button to the table editor's \l
+ {QWidget::close()}{close()} slot, and the \gui Submit button to
+ our private \c submit() slot. The latter slot will take care of
+ the data transactions. Finally, we connect the \gui Revert button
+ to our model's \l {QSqlTableModel::revertAll()}{revertAll()} slot,
+ reverting all pending changes (i.e., restoring the original data).
+
+ \snippet examples/sql/cachedtable/tableeditor.cpp 4
+
+ In the end we add the button box and the table view to a layout,
+ install the layout on the table editor widget, and set the
+ editor's window title.
+
+ \snippet examples/sql/cachedtable/tableeditor.cpp 5
+
+ The \c submit() slot is called whenever the users hit the \gui
+ Submit button to save their changes.
+
+ First, we begin a transaction on the database using the
+ QSqlDatabase::transaction() function. A database transaction is a
+ unit of interaction with a database management system or similar
+ system that is treated in a coherent and reliable way independent
+ of other transactions. A pointer to the used database can be
+ obtained using the QSqlTableModel::database() function.
+
+ Then, we try to submit all the pending changes, i.e. the model's
+ modified items. If no error occurs, we commit the transaction to
+ the database using the QSqlDatabase::commit() function (note that
+ on some databases, this function will not work if there is an
+ active QSqlQuery on the database). Otherwise we perform a rollback
+ of the transaction using the QSqlDatabase::rollback() function and
+ post a warning to the user.
+
+ \table 100%
+ \row
+ \o
+ \bold {See also:}
+
+ A complete list of Qt's SQL \l {Database Classes}, and the \l
+ {Model/View Programming} documentation.
+
+ \endtable
+*/
diff --git a/doc/src/examples/calculator.qdoc b/doc/src/examples/calculator.qdoc
new file mode 100644
index 0000000..2cae6ce
--- /dev/null
+++ b/doc/src/examples/calculator.qdoc
@@ -0,0 +1,389 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/calculator
+ \title Calculator Example
+
+ The example shows how to use signals and slots to implement the
+ functionality of a calculator widget, and how to use QGridLayout
+ to place child widgets in a grid.
+
+ \image calculator-example.png Screenshot of the Calculator example
+
+ The example consists of two classes:
+
+ \list
+ \o \c Calculator is the calculator widget, with all the
+ calculator functionality.
+ \o \c Button is the widget used for each of the calculator
+ button. It derives from QToolButton.
+ \endlist
+
+ We will start by reviewing \c Calculator, then we will take a
+ look at \c Button.
+
+ \section1 Calculator Class Definition
+
+ \snippet examples/widgets/calculator/calculator.h 0
+
+ The \c Calculator class provides a simple calculator widget. It
+ inherits from QDialog and has several private slots associated
+ with the calculator's buttons. QObject::eventFilter() is
+ reimplemented to handle mouse events on the calculator's display.
+
+ Buttons are grouped in categories according to their behavior.
+ For example, all the digit buttons (labeled \gui 0 to \gui 9)
+ append a digit to the current operand. For these, we connect
+ multiple buttons to the same slot (e.g., \c digitClicked()). The
+ categories are digits, unary operators (\gui{Sqrt}, \gui{x\unicode{178}},
+ \gui{1/x}), additive operators (\gui{+}, \gui{-}), and
+ multiplicative operators (\gui{\unicode{215}}, \gui{\unicode{247}}). The other buttons
+ have their own slots.
+
+ \snippet examples/widgets/calculator/calculator.h 1
+ \snippet examples/widgets/calculator/calculator.h 2
+
+ The private \c createButton() function is used as part of the
+ widget construction. \c abortOperation() is called whenever a
+ division by zero occurs or when a square root operation is
+ applied to a negative number. \c calculate() applies a binary
+ operator (\gui{+}, \gui{-}, \gui{\unicode{215}}, or \gui{\unicode{247}}).
+
+ \snippet examples/widgets/calculator/calculator.h 3
+ \snippet examples/widgets/calculator/calculator.h 4
+ \snippet examples/widgets/calculator/calculator.h 5
+ \snippet examples/widgets/calculator/calculator.h 6
+ \snippet examples/widgets/calculator/calculator.h 7
+ \snippet examples/widgets/calculator/calculator.h 8
+
+ These variables, together with the contents of the calculator
+ display (a QLineEdit), encode the state of the calculator:
+
+ \list
+ \o \c sumInMemory contains the value stored in the calculator's memory
+ (using \gui{MS}, \gui{M+}, or \gui{MC}).
+ \o \c sumSoFar stores the value accumulated so far. When the user
+ clicks \gui{=}, \c sumSoFar is recomputed and shown on the
+ display. \gui{Clear All} resets \c sumSoFar to zero.
+ \o \c factorSoFar stores a temporary value when doing
+ multiplications and divisions.
+ \o \c pendingAdditiveOperator stores the last additive operator
+ clicked by the user.
+ \o \c pendingMultiplicativeOperator stores the last multiplicative operator
+ clicked by the user.
+ \o \c waitingForOperand is \c true when the calculator is
+ expecting the user to start typing an operand.
+ \endlist
+
+ Additive and multiplicative operators are treated differently
+ because they have different precedences. For example, \gui{1 + 2 \unicode{247}
+ 3} is interpreted as \gui{1 + (2 \unicode{247} 3)} because \gui{\unicode{247}} has higher
+ precedence than \gui{+}.
+
+ The table below shows the evolution of the calculator state as
+ the user enters a mathematical expression.
+
+ \table
+ \header \o User Input \o Display \o Sum so Far \o Add. Op. \o Factor so Far \o Mult. Op. \o Waiting for Operand?
+ \row \o \o 0 \o 0 \o \o \o \o \c true
+ \row \o \gui{1} \o 1 \o 0 \o \o \o \o \c false
+ \row \o \gui{1 +} \o 1 \o 1 \o \gui{+} \o \o \o \c true
+ \row \o \gui{1 + 2} \o 2 \o 1 \o \gui{+} \o \o \o \c false
+ \row \o \gui{1 + 2 \unicode{247}} \o 2 \o 1 \o \gui{+} \o 2 \o \gui{\unicode{247}} \o \c true
+ \row \o \gui{1 + 2 \unicode{247} 3} \o 3 \o 1 \o \gui{+} \o 2 \o \gui{\unicode{247}} \o \c false
+ \row \o \gui{1 + 2 \unicode{247} 3 -} \o 1.66667 \o 1.66667 \o \gui{-} \o \o \o \c true
+ \row \o \gui{1 + 2 \unicode{247} 3 - 4} \o 4 \o 1.66667 \o \gui{-} \o \o \o \c false
+ \row \o \gui{1 + 2 \unicode{247} 3 - 4 =} \o -2.33333 \o 0 \o \o \o \o \c true
+ \endtable
+
+ Unary operators, such as \gui Sqrt, require no special handling;
+ they can be applied immediately since the operand is already
+ known when the operator button is clicked.
+
+ \snippet examples/widgets/calculator/calculator.h 9
+ \codeline
+ \snippet examples/widgets/calculator/calculator.h 10
+
+ Finally, we declare the variables associated with the display and the
+ buttons used to display numerals.
+
+ \section1 Calculator Class Implementation
+
+ \snippet examples/widgets/calculator/calculator.cpp 0
+
+ In the constructor, we initialize the calculator's state. The \c
+ pendingAdditiveOperator and \c pendingMultiplicativeOperator
+ variables don't need to be initialized explicitly, because the
+ QString constructor initializes them to empty strings.
+
+ \snippet examples/widgets/calculator/calculator.cpp 1
+ \snippet examples/widgets/calculator/calculator.cpp 2
+
+ We create the QLineEdit representing the calculator's display and
+ set up some of its properties. In particular, we set it to be
+ read-only.
+
+ We also enlarge \c{display}'s font by 8 points.
+
+ \snippet examples/widgets/calculator/calculator.cpp 4
+
+ For each button, we call the private \c createButton() function with
+ the proper text label and a slot to connect to the button.
+
+ \snippet examples/widgets/calculator/calculator.cpp 5
+ \snippet examples/widgets/calculator/calculator.cpp 6
+
+ The layout is handled by a single QGridLayout. The
+ QLayout::setSizeConstraint() call ensures that the \c Calculator
+ widget is always shown as its optimal size (its
+ \l{QWidget::sizeHint()}{size hint}), preventing the user from
+ resizing the calculator. The size hint is determined by the size
+ and \l{QWidget::sizePolicy()}{size policy} of the child widgets.
+
+ Most child widgets occupy only one cell in the grid layout. For
+ these, we only need to pass a row and a column to
+ QGridLayout::addWidget(). The \c display, \c backspaceButton, \c
+ clearButton, and \c clearAllButton widgets occupy more than one
+ column; for these we must also pass a row span and a column
+ span.
+
+ \snippet examples/widgets/calculator/calculator.cpp 7
+
+ Pressing one of the calculator's digit buttons will emit the
+ button's \l{QToolButton::clicked()}{clicked()} signal, which will
+ trigger the \c digitClicked() slot.
+
+ First, we find out which button sent the signal using
+ QObject::sender(). This function returns the sender as a QObject
+ pointer. Since we know that the sender is a \c Button object, we
+ can safely cast the QObject. We could have used a C-style cast or
+ a C++ \c static_cast<>(), but as a defensive programming
+ technique we use a \l qobject_cast(). The advantage is that if
+ the object has the wrong type, a null pointer is returned.
+ Crashes due to null pointers are much easier to diagnose than
+ crashes due to unsafe casts. Once we have the button, we extract
+ the operator using QToolButton::text().
+
+ The slot needs to consider two situations in particular. If \c
+ display contains "0" and the user clicks the \gui{0} button, it
+ would be silly to show "00". And if the calculator is in
+ a state where it is waiting for a new operand,
+ the new digit is the first digit of that new operand; in that case,
+ any result of a previous calculation must be cleared first.
+
+ At the end, we append the new digit to the value in the display.
+
+ \snippet examples/widgets/calculator/calculator.cpp 8
+ \snippet examples/widgets/calculator/calculator.cpp 9
+
+ The \c unaryOperatorClicked() slot is called whenever one of the
+ unary operator buttons is clicked. Again a pointer to the clicked
+ button is retrieved using QObject::sender(). The operator is
+ extracted from the button's text and stored in \c
+ clickedOperator. The operand is obtained from \c display.
+
+ Then we perform the operation. If \gui Sqrt is applied to a
+ negative number or \gui{1/x} to zero, we call \c
+ abortOperation(). If everything goes well, we display the result
+ of the operation in the line edit and we set \c waitingForOperand
+ to \c true. This ensures that if the user types a new digit, the
+ digit will be considered as a new operand, instead of being
+ appended to the current value.
+
+ \snippet examples/widgets/calculator/calculator.cpp 10
+ \snippet examples/widgets/calculator/calculator.cpp 11
+
+ The \c additiveOperatorClicked() slot is called when the user
+ clicks the \gui{+} or \gui{-} button.
+
+ Before we can actually do something about the clicked operator,
+ we must handle any pending operations. We start with the
+ multiplicative operators, since these have higher precedence than
+ additive operators:
+
+ \snippet examples/widgets/calculator/calculator.cpp 12
+ \snippet examples/widgets/calculator/calculator.cpp 13
+
+ If \gui{\unicode{215}} or \gui{\unicode{247}} has been clicked earlier, without clicking
+ \gui{=} afterward, the current value in the display is the right
+ operand of the \gui{\unicode{215}} or \gui{\unicode{247}} operator and we can finally
+ perform the operation and update the display.
+
+ \snippet examples/widgets/calculator/calculator.cpp 14
+ \snippet examples/widgets/calculator/calculator.cpp 15
+
+ If \gui{+} or \gui{-} has been clicked earlier, \c sumSoFar is
+ the left operand and the current value in the display is the
+ right operand of the operator. If there is no pending additive
+ operator, \c sumSoFar is simply set to be the text in the
+ display.
+
+ \snippet examples/widgets/calculator/calculator.cpp 16
+ \snippet examples/widgets/calculator/calculator.cpp 17
+
+ Finally, we can take care of the operator that was just clicked.
+ Since we don't have the right-hand operand yet, we store the clicked
+ operator in the \c pendingAdditiveOperator variable. We will
+ apply the operation later, when we have a right operand, with \c
+ sumSoFar as the left operand.
+
+ \snippet examples/widgets/calculator/calculator.cpp 18
+
+ The \c multiplicativeOperatorClicked() slot is similar to \c
+ additiveOperatorClicked(). We don't need to worry about pending
+ additive operators here, because multiplicative operators have
+ precedence over additive operators.
+
+ \snippet examples/widgets/calculator/calculator.cpp 20
+
+ Like in \c additiveOperatorClicked(), we start by handing any
+ pending multiplicative and additive operators. Then we display \c
+ sumSoFar and reset the variable to zero. Resetting the variable
+ to zero is necessary to avoid counting the value twice.
+
+ \snippet examples/widgets/calculator/calculator.cpp 22
+
+ The \c pointClicked() slot adds a decimal point to the content in
+ \c display.
+
+ \snippet examples/widgets/calculator/calculator.cpp 24
+
+ The \c changeSignClicked() slot changes the sign of the value in
+ \c display. If the current value is positive, we prepend a minus
+ sign; if the current value is negative, we remove the first
+ character from the value (the minus sign).
+
+ \snippet examples/widgets/calculator/calculator.cpp 26
+
+ The \c backspaceClicked() removes the rightmost character in the
+ display. If we get an empty string, we show "0" and set \c
+ waitingForOperand to \c true.
+
+ \snippet examples/widgets/calculator/calculator.cpp 28
+
+ The \c clear() slot resets the current operand to zero. It is
+ equivalent to clicking \gui Backspace enough times to erase the
+ entire operand.
+
+ \snippet examples/widgets/calculator/calculator.cpp 30
+
+ The \c clearAll() slot resets the calculator to its initial state.
+
+ \snippet examples/widgets/calculator/calculator.cpp 32
+
+ The \c clearMemory() slot erases the sum kept in memory, \c
+ readMemory() displays the sum as an operand, \c setMemory()
+ replace the sum in memory with the current sum, and \c
+ addToMemory() adds the current value to the value in memory. For
+ \c setMemory() and \c addToMemory(), we start by calling \c
+ equalClicked() to update \c sumSoFar and the value in the
+ display.
+
+ \snippet examples/widgets/calculator/calculator.cpp 34
+
+ The private \c createButton() function is called from the
+ constructor to create calculator buttons.
+
+ \snippet examples/widgets/calculator/calculator.cpp 36
+
+ The private \c abortOperation() function is called whenever a
+ calculation fails. It resets the calculator state and displays
+ "####".
+
+ \snippet examples/widgets/calculator/calculator.cpp 38
+
+ The private \c calculate() function performs a binary operation.
+ The right operand is given by \c rightOperand. For additive
+ operators, the left operand is \c sumSoFar; for multiplicative
+ operators, the left operand is \c factorSoFar. The function
+ return \c false if a division by zero occurs.
+
+ \section1 Button Class Definition
+
+ Let's now take a look at the \c Button class:
+
+ \snippet examples/widgets/calculator/button.h 0
+
+ The \c Button class has a convenience constructor that takes a
+ text label and a parent widget, and it reimplements QWidget::sizeHint()
+ to provide more space around the text than the amount QToolButton
+ normally provides.
+
+ \section1 Button Class Implementation
+
+ \snippet examples/widgets/calculator/button.cpp 0
+
+ The buttons' appearance is determined by the layout of the
+ calculator widget through the size and
+ \l{QWidget::sizePolicy}{size policy} of the layout's child
+ widgets. The call to the
+ \l{QWidget::setSizePolicy()}{setSizePolicy()} function in the
+ constructor ensures that the button will expand horizontally to
+ fill all the available space; by default, \l{QToolButton}s don't
+ expand to fill available space. Without this call, the different
+ buttons in a same column would have different widths.
+
+ \snippet examples/widgets/calculator/button.cpp 1
+ \snippet examples/widgets/calculator/button.cpp 2
+
+ In \l{QWidget::sizeHint()}{sizeHint()}, we try to return a size
+ that looks good for most buttons. We reuse the size hint of the
+ base class (QToolButton) but modify it in the following ways:
+
+ \list
+ \o We add 20 to the \l{QSize::height()}{height} component of the size hint.
+ \o We make the \l{QSize::width()}{width} component of the size
+ hint at least as much as the \l{QSize::width()}{height}.
+ \endlist
+
+ This ensures that with most fonts, the digit and operator buttons
+ will be square, without truncating the text on the
+ \gui{Backspace}, \gui{Clear}, and \gui{Clear All} buttons.
+
+ The screenshot below shows how the \c Calculator widget would
+ look like if we \e didn't set the horizontal size policy to
+ QSizePolicy::Expanding in the constructor and if we didn't
+ reimplement QWidget::sizeHint().
+
+ \image calculator-ugly.png The Calculator example with default size policies and size hints
+
+*/
diff --git a/doc/src/examples/calculatorbuilder.qdoc b/doc/src/examples/calculatorbuilder.qdoc
new file mode 100644
index 0000000..c63267e
--- /dev/null
+++ b/doc/src/examples/calculatorbuilder.qdoc
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/calculatorbuilder
+ \title Calculator Builder Example
+
+ The Calculator Builder example shows how to create a user interface from
+ a \QD form at run-time, using the QUiLoader class.
+
+ \image calculatorbuilder-example.png
+
+ We use the form created in the \l{designer/calculatorform}{Calculator Form}
+ example to show that the same user interface can be generated when the
+ application is executed or defined when the application is built.
+
+ \section1 Preparation
+
+ The \l{designer/calculatorform}{Calculator Form} example defines a user
+ interface that we can use without modification. In this example, we use a
+ \l{The Qt Resource System}{resource file} to contain the \c{calculatorform.ui}
+ file created in the previous example, but it could be stored on disk instead.
+
+ To generate a form at run time, we need to link the example against the
+ \c QtUiTools module library. The project file we use contains all the
+ necessary information to do this:
+
+ \snippet examples/designer/calculatorbuilder/calculatorbuilder.pro 0
+
+ All the other necessary files are declared as usual.
+
+ \section1 CalculatorForm Class Definition
+
+ The \c CalculatorForm class defines the widget used to host the form's
+ user interface:
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.h 0
+
+ Note that we do not need to include a header file to describe the user
+ interface. We only define two public slots, using the auto-connection
+ naming convention required by \c uic, and declare private variables
+ that we will use to access widgets provided by the form after they are
+ constructed.
+
+ \section1 CalculatorForm Class Implementation
+
+ We will need to use the QUiLoader class that is provided by the
+ \c libQtUiTools library, so we first ensure that we include the header
+ file for the module:
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 0
+
+ The constructor uses a form loader object to construct the user
+ interface that we retrieve, via a QFile object, from the example's
+ resources:
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 1
+
+ By including the user interface in the example's resources, we ensure
+ that it will be present when the example is run. The \c{loader.load()}
+ function takes the user interface description contained in the file
+ and constructs the form widget as a child widget of the \c{CalculatorForm}.
+
+ We are interested in three widgets in the generated user interface:
+ two spin boxes and a label. For convenience, we retrieve pointers to
+ these widgets from the widget that was constructed by the \c FormBuilder,
+ and we record them for later use. The \c qFindChild() template function
+ allows us to query widgets in order to find named child widgets.
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 2
+
+ The widgets created by the form loader need to be connected to the
+ specially-named slots in the \c CalculatorForm object. We use Qt's
+ meta-object system to enable these connections:
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 3
+
+ The form widget is added to a layout, and the window title is set:
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 4
+
+ The two slots that modify widgets provided by the form are defined
+ in a similar way to those in the \l{designer/calculatorform}{Calculator
+ Form} example, except that we read the values from the spin boxes and
+ write the result to the output widget via the pointers we recorded in
+ the constructor:
+
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 5
+ \codeline
+ \snippet examples/designer/calculatorbuilder/calculatorform.cpp 7
+
+ The advantage of this approach is that we can replace the form when the
+ application is run, but we can still manipulate the widgets it contains
+ as long as they are given appropriate names.
+*/
diff --git a/doc/src/examples/calculatorform.qdoc b/doc/src/examples/calculatorform.qdoc
new file mode 100644
index 0000000..a8e891e
--- /dev/null
+++ b/doc/src/examples/calculatorform.qdoc
@@ -0,0 +1,126 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/calculatorform
+ \title Calculator Form Example
+
+ The Calculator Form Example shows how to use a form created with
+ \QD in an application by using the user interface information from
+ a QWidget subclass. We use \l{Using a Designer .ui File in Your Application}
+ {uic's auto-connection} feature to automatically connect signals
+ from widgets on the form to slots in our code.
+
+ \image calculatorform-example.png Screenshot of the Calculator Form example
+
+ The example presents two spin boxes that are used to input integer values
+ and a label that shows their sum. Whenever either of the spin boxes are
+ updated, the signal-slot connections between the widgets and the form
+ ensure that the label is also updated.
+
+ \section1 Preparation
+
+ The user interface for this example is designed completely using \QD. The
+ result is a .ui file describing the form, the widgets used, any signal-slot
+ connections between them, and other standard user interface properties.
+
+ To ensure that the example can use this file, we need to include a \c FORMS
+ declaration in the example's project file:
+
+ \snippet examples/designer/calculatorform/calculatorform.pro 1
+
+ When the project is built, \c uic will create a header file that lets us
+ construct the form.
+
+ \section1 CalculatorForm Class Definition
+
+ The \c CalculatorForm class uses the user interface described in the
+ \c calculatorform.ui file. To access the form and its contents, we need
+ to include the \c ui_calculatorform.h header file created by \c uic
+ during the build process:
+
+ \snippet examples/designer/calculatorform/calculatorform.h 0
+
+ We define the \c CalculatorForm class by subclassing QWidget because the
+ form itself is based on QWidget:
+
+ \snippet examples/designer/calculatorform/calculatorform.h 1
+
+ Apart from the constructor, the class contains two private slots that
+ are named according to the auto-connection naming convention required
+ by \c uic.
+ The private \c ui member variable refers to the form, and is used to
+ access the contents of the user interface.
+
+ \section1 CalculatorForm Class Implementation
+
+ The constructor simply calls the base class's constructor and
+ sets up the form's user interface.
+
+ \snippet examples/designer/calculatorform/calculatorform.cpp 0
+
+ The user interface is set up with the \c setupUI() function. We pass
+ \c this as the argument to this function to use the \c CalculatorForm
+ widget itself as the container for the user interface.
+
+ To automatically connect signals from the spin boxes defined in the
+ user interface, we use the naming convention that indicates which
+ widgets and their signals in the user interface should be connected
+ to each slot. The first slot is called whenever the spin box called
+ "inputSpinBox1" in the user interface emits the
+ \l{QSpinBox::valueChanged()}{valueChanged()} signal:
+
+ \snippet examples/designer/calculatorform/calculatorform.cpp 1
+
+ When this occurs, we use the value supplied by the signal to update the
+ output label by setting its new text directly. We access the output label
+ and the other spin box via the class's private \c ui variable.
+
+ The second slot is called whenever the second spin box, called
+ "inputSpinBox2", emits the \l{QSpinBox::valueChanged()}{valueChanged()}
+ signal:
+
+ \snippet examples/designer/calculatorform/calculatorform.cpp 2
+
+ In this case, the value from the first spin box is read and combined
+ with the value supplied by the signal. Again, the output label is
+ updated directly via the \c ui variable.
+*/
diff --git a/doc/src/examples/calendar.qdoc b/doc/src/examples/calendar.qdoc
new file mode 100644
index 0000000..e6beef4
--- /dev/null
+++ b/doc/src/examples/calendar.qdoc
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example richtext/calendar
+ \title Calendar Example
+
+ The Calendar example shows how to create rich text content and display it using
+ a rich text editor.
+
+ \image calendar-example.png
+
+ Specifically, the example demonstrates the following:
+
+ \list
+ \o Use of a text editor with a text document
+ \o Insertion of tables and frames into a document
+ \o Navigation within a table
+ \o Insert text in different styles
+ \endlist
+
+ The rich text editor used to display the document is used within a main window
+ application.
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class provides a text editor widget and some controls to
+ allow the user to change the month and year shown. The font size used for the
+ text can also be adjusted.
+
+ \snippet examples/richtext/calendar/mainwindow.h 0
+
+ The private \c insertCalendar() function performs most of the work, relying on
+ the \c fontSize and \c selectedDate variables to write useful information to
+ the \c editor.
+
+ \section1 MainWindow Class Implementation
+
+ The \c MainWindow constructor sets up the user interface and initializes
+ variables used to generate a calendar for each month.
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 0
+
+ We begin by setting default values for the selected date that will be highlighted
+ in the calendar and the font size to be used. Since we are using a QMainWindow
+ for the user interface, we construct a widget for use as the central widget.
+
+ The user interface will include a line of controls above the generated calendar;
+ we construct a label and a combobox to allow the month to be selected, and a
+ spin box for the year. These widgets are configured to provide a reasonable range
+ of values for the user to try:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 1
+
+ We use the \c selectedDate object to obtain the current month and year, and we
+ set these in the combobox and spin box:
+
+ The font size is displayed in a spin box which we restrict to a sensible range
+ of values:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 2
+
+ We construct an editor and use the \c insertCalendar() function to create
+ a calendar for it. Each calendar is displayed in the same text editor; in
+ this example we use a QTextBrowser since we do not allow the calendar to be
+ edited.
+
+ The controls used to set the month, year, and font size will not have any
+ effect on the appearance of the calendar unless we make some signal-slot
+ connections:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 3
+
+ The signals are connected to some simple slots in the \c MainWindow class
+ which we will describe later.
+
+ We create layouts to manage the widgets we constructed:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 4
+
+ Finally, the central widget is set for the window.
+
+ Each calendar is created for the editor by the \c insertCalendar() function
+ which uses the date and font size, defined by the private \a selectedDate
+ and \c fontSize variables, to produce a suitable plan for the specified
+ month and year.
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 5
+
+ We begin by clearing the editor's rich text document, and obtain a text
+ cursor from the editor that we will use to add content. We also create a
+ QDate object based on the currently selected date.
+
+ The calendar is made up of a table with a gray background color that contains
+ seven columns: one for each day of the week. It is placed in the center of the
+ page with equal space to the left and right of it. All of these properties are
+ set in a QTextTableFormat object:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 6
+
+ Each cell in the table will be padded and spaced to make the text easier to
+ read.
+
+ We want the columns to have equal widths, so we provide a vector containing
+ percentage widths for each of them and set the constraints in the
+ QTextTableFormat:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 7
+
+ The constraints used for the column widths are only useful if the table has
+ an appropriate number of columns. With the format for the table defined, we
+ construct a new table with one row and seven columns at the current cursor
+ position:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 8
+
+ We only need one row to start with; more can be added as we need them. Using
+ this approach means that we do not need to perform any date calculations
+ until we add cells to the table.
+
+ When inserting objects into a document with the cursor's insertion functions,
+ the cursor is automatically moved inside the newly inserted object. This means
+ that we can immediately start modifying the table from within:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 9
+
+ Since the table has an outer frame, we obtain the frame and its format so that
+ we can customize it. After making the changes we want, we set the frame's format
+ using the modified format object. We have given the table an outer border one
+ pixel wide.
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 10
+
+ In a similar way, we obtain the cursor's current character format and
+ create customized formats based on it.
+
+ We do not set the format on the cursor because this would change the default
+ character format; instead, we use the customized formats explicitly when we
+ insert text. The following loop inserts the days of the week into the table
+ as bold text:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 11
+
+ For each day of the week, we obtain an existing table cell in the first row
+ (row 0) using the table's \l{QTextTable::cellAt()}{cellAt()} function. Since
+ we start counting the days of the week at day 1 (Monday), we subtract 1 from
+ \c weekDay to ensure that we obtain the cell for the correct column of the
+ table.
+
+ Before text can be inserted into a cell, we must obtain a cursor with the
+ correct position in the document. The cell provides a function for this
+ purpose, and we use this cursor to insert text using the \c boldFormat
+ character format that we created earlier:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 12
+
+ Inserting text into document objects usually follows the same pattern.
+ Each object can provide a new cursor that corresponds to the first valid
+ position within itself, and this can be used to insert new content. We
+ continue to use this pattern as we insert the days of the month into the
+ table.
+
+ Since every month has more than seven days, we insert a single row to begin
+ and add days until we reach the end of the month. If the current date is
+ encountered, it is inserted with a special format (created earlier) that
+ makes it stand out:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 13
+
+ We add a new row to the table at the end of each week only if the next week
+ falls within the currently selected month.
+
+ For each calendar that we create, we change the window title to reflect the
+ currently selected month and year:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 14
+
+ The \c insertCalendar() function relies on up-to-date values for the month,
+ year, and font size. These are set in the following slots:
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 15
+
+ The \c setFontSize() function simply changes the private \c fontSize variable
+ before updating the calendar.
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 16
+
+ The \c setMonth slot is called when the QComboBox used to select the month is
+ updated. The value supplied is the currently selected row in the combobox.
+ We add 1 to this value to obtain a valid month number, and create a new QDate
+ based on the existing one. The calendar is then updated to use this new date.
+
+ \snippet examples/richtext/calendar/mainwindow.cpp 17
+
+ The \c setYear() slot is called when the QDateTimeEdit used to select the
+ year is updated. The value supplied is a QDate object; this makes
+ the construction of a new value for \c selectedDate simple. We update the
+ calendar afterwards to use this new date.
+*/
diff --git a/doc/src/examples/calendarwidget.qdoc b/doc/src/examples/calendarwidget.qdoc
new file mode 100644
index 0000000..f4417c2
--- /dev/null
+++ b/doc/src/examples/calendarwidget.qdoc
@@ -0,0 +1,305 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \title Calendar Widget Example
+ \example widgets/calendarwidget
+
+ The Calendar Widget example shows use of \c QCalendarWidget.
+
+ \image calendarwidgetexample.png
+
+ QCalendarWidget displays one calendar month
+ at a time and lets the user select a date.
+ The calendar consists of four components: a navigation
+ bar that lets the user change the month that is
+ displayed, a grid where each cell represents one day
+ in the month, and two headers that display weekday names
+ and week numbers.
+
+ The Calendar Widget example displays a QCalendarWidget and lets the user
+ configure its appearance and behavior using
+ \l{QComboBox}es, \l{QCheckBox}es, and \l{QDateEdit}s. In
+ addition, the user can influence the formatting of individual dates
+ and headers.
+
+ The properties of the QCalendarWidget are summarized in the table
+ below.
+
+ \table
+ \header \o Property
+ \o Description
+ \row \o \l{QCalendarWidget::}{selectedDate}
+ \o The currently selected date.
+ \row \o \l{QCalendarWidget::}{minimumDate}
+ \o The earliest date that can be selected.
+ \row \o \l{QCalendarWidget::}{maximumDate}
+ \o The latest date that can be selected.
+ \row \o \l{QCalendarWidget::}{firstDayOfWeek}
+ \o The day that is displayed as the first day of the week
+ (usually Sunday or Monday).
+ \row \o \l{QCalendarWidget::}{gridVisible}
+ \o Whether the grid should be shown.
+ \row \o \l{QCalendarWidget::}{selectionMode}
+ \o Whether the user can select a date or not.
+ \row \o \l{QCalendarWidget::}{horizontalHeaderFormat}
+ \o The format of the day names in the horizontal header
+ (e.g., "M", "Mon", or "Monday").
+ \row \o \l{QCalendarWidget::}{verticalHeaderFormat}
+ \o The format of the vertical header.
+ \row \o \l{QCalendarWidget::}{navigationBarVisible}
+ \o Whether the navigation bar at the top of the calendar
+ widget is shown.
+ \endtable
+
+ The example consists of one class, \c Window, which creates and
+ lays out the QCalendarWidget and the other widgets that let the
+ user configure the QCalendarWidget.
+
+ \section1 Window Class Definition
+
+ Here is the definition of the \c Window class:
+
+ \snippet examples/widgets/calendarwidget/window.h 0
+ \dots
+ \snippet examples/widgets/calendarwidget/window.h 1
+
+ As is often the case with classes that represent self-contained
+ windows, most of the API is private. We will review the private
+ members as we stumble upon them in the implementation.
+
+ \section1 Window Class Implementation
+
+ Let's now review the class implementation, starting with the constructor:
+
+ \snippet examples/widgets/calendarwidget/window.cpp 0
+
+ We start by creating the four \l{QGroupBox}es and their child
+ widgets (including the QCalendarWidget) using four private \c
+ create...GroupBox() functions, described below. Then we arrange
+ the group boxes in a QGridLayout.
+
+ We set the grid layout's resize policy to QLayout::SetFixedSize to
+ prevent the user from resizing the window. In that mode, the
+ window's size is set automatically by QGridLayout based on the
+ size hints of its contents widgets.
+
+ To ensure that the window isn't automatically resized every time
+ we change a property of the QCalendarWidget (e.g., hiding the
+ navigation bar, trhe vertical header, or the grid), we set the
+ minimum height of row 0 and the minimum width of column 0 to the
+ initial size of the QCalendarWidget.
+
+ Let's move on to the \c createPreviewGroupBox() function:
+
+ \snippet examples/widgets/calendarwidget/window.cpp 9
+
+ The \gui Preview group box contains only one widget: the
+ QCalendarWidget. We set it up, connect its
+ \l{QCalendarWidget::}{currentPageChanged()} signal to our \c
+ reformatCalendarPage() slot to make sure that every new page gets
+ the formatting specified by the user.
+
+ The \c createGeneralOptionsGroupBox() function is somewhat large
+ and several widgets are set up the same way; we look at parts of
+ its implementation here and skip the rest:
+
+ \snippet examples/widgets/calendarwidget/window.cpp 10
+ \dots
+
+ We start with the setup of the \gui{Week starts on} combobox.
+ This combobox controls which day should be displayed as the first
+ day of the week.
+
+ The QComboBox class lets us attach user data as a QVariant to
+ each item. The data can later be retrieved with QComboBox's
+ \l{QComboBox::}{itemData()} function. QVariant doesn't directly
+ support the Qt::DayOfWeek data type, but it supports \c int, and
+ C++ will happily convert any enum value to \c int.
+
+ \dots
+ \snippet examples/widgets/calendarwidget/window.cpp 11
+ \dots
+
+ After creating the widgets, we connect the signals and slots. We
+ connect the comboboxes to private slots of \c Window or to
+ public slots provided by QComboBox.
+
+ \dots
+ \snippet examples/widgets/calendarwidget/window.cpp 12
+
+ At the end of the function, we call the slots that update the calendar to ensure
+ that the QCalendarWidget is synchronized with the other widgets on startup.
+
+ Let's now take a look at the \c createDatesGroupBox() private function:
+
+ \snippet examples/widgets/calendarwidget/window.cpp 13
+
+ In this function, we create the \gui {Minimum Date}, \gui {Maximum Date},
+ and \gui {Current Date} editor widgets,
+ which control the calendar's minimum, maximum, and selected dates.
+ The calendar's minimum and maximum dates have already been
+ set in \c createPrivewGroupBox(); we can then set the widgets
+ default values to the calendars values.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 14
+ \dots
+ \snippet examples/widgets/calendarwidget/window.cpp 15
+
+ We connect the \c currentDateEdit's
+ \l{QDateEdit::}{dateChanged()} signal directly to the calendar's
+ \l{QCalendarWidget::}{setSelectedDate()} slot. When the calendar's
+ selected date changes, either as a result of a user action or
+ programmatically, our \c selectedDateChanged() slot updates
+ the \gui {Current Date} editor. We also need to react when the user
+ changes the \gui{Minimum Date} and \gui{Maximum Date} editors.
+
+ Here is the \c createTextFormatsGroup() function:
+
+ \snippet examples/widgets/calendarwidget/window.cpp 16
+
+ We set up the \gui {Weekday Color} and \gui {Weekend Color} comboboxes
+ using \c createColorCombo(), which instantiates a QComboBox and
+ populates it with colors ("Red", "Blue", etc.).
+
+ \snippet examples/widgets/calendarwidget/window.cpp 17
+
+ The \gui {Header Text Format} combobox lets the user change the
+ text format (bold, italic, or plain) used for horizontal and
+ vertical headers. The \gui {First Friday in blue} and \gui {May 1
+ in red} check box affect the rendering of specific dates.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 18
+
+ We connect the check boxes and comboboxes to various private
+ slots. The \gui {First Friday in blue} and \gui {May 1 in red}
+ check boxes are both connected to \c reformatCalendarPage(),
+ which is also called when the calendar switches month.
+
+ \dots
+ \snippet examples/widgets/calendarwidget/window.cpp 19
+
+ At the end of \c createTextFormatsGroupBox(), we call private
+ slots to synchronize the QCalendarWidget with the other widgets.
+
+ We're now done reviewing the four \c create...GroupBox()
+ functions. Let's now take a look at the other private functions
+ and slots.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 20
+
+ In \c createColorCombo(), we create a combobox and populate it with
+ standard colors. The second argument to QComboBox::addItem()
+ is a QVariant storing user data (in this case, QColor objects).
+
+ This function was used to set up the \gui {Weekday Color}
+ and \gui {Weekend Color} comboboxes.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 1
+
+ When the user changes the \gui {Week starts on} combobox's
+ value, \c firstDayChanged() is invoked with the index of the
+ combobox's new value. We retrieve the custom data item
+ associated with the new current item using
+ \l{QComboBox::}{itemData()} and cast it to a Qt::DayOfWeek.
+
+ \c selectionModeChanged(), \c horizontalHeaderChanged(), and \c
+ verticalHeaderChanged() are very similar to \c firstDayChanged(),
+ so they are omitted.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 2
+
+ The \c selectedDateChanged() updates the \gui{Current Date}
+ editor to reflect the current state of the QCalendarWidget.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 3
+
+ When the user changes the minimum date, we tell the
+ QCalenderWidget. We also update the \gui {Maximum Date} editor,
+ because if the new minimum date is later than the current maximum
+ date, QCalendarWidget will automatically adapt its maximum date
+ to avoid a contradicting state.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 4
+
+ \c maximumDateChanged() is implemented similarly to \c
+ minimumDateChanged().
+
+ \snippet examples/widgets/calendarwidget/window.cpp 5
+
+ Each combobox item has a QColor object as user data corresponding to the
+ item's text. After fetching the colors from the comboboxes, we
+ set the text format of each day of the week.
+
+ The text format of a column in the calendar is given as a
+ QTextCharFormat, which besides the foreground color lets us
+ specify various character formatting information. In this
+ example, we only show a subset of the possibilities.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 6
+
+ \c weekendFormatChanged() is the same as \c
+ weekdayFormatChanged(), except that it affects Saturday and
+ Sunday instead of Monday to Friday.
+
+ \snippet examples/widgets/calendarwidget/window.cpp 7
+
+ The \c reformatHeaders() slot is called when the user
+ changes the text format of
+ the headers. We compare the current text of the \gui {Header Text Format}
+ combobox to determine which format to apply. (An alternative would
+ have been to store \l{QTextCharFormat} values alongside the combobox
+ items.)
+
+ \snippet examples/widgets/calendarwidget/window.cpp 8
+
+ In \c reformatCalendarPage(), we set the text format of the first
+ Friday in the month and May 1 in the current year. The text
+ formats that are actually used depend on which check boxes are
+ checked.
+
+ QCalendarWidget lets us set the text format of individual dates
+ with the \l{QCalendarWidget::}{setDateTextFormat()}. We chose to
+ set the dates when the calendar page changes, i.e., a new month is
+ displayed. We check which of the \c mayFirstCheckBox and \c
+ firstDayCheckBox, if any, are checked
+ and set the text formats accordingly.
+*/
diff --git a/doc/src/examples/capabilitiesexample.qdoc b/doc/src/examples/capabilitiesexample.qdoc
new file mode 100644
index 0000000..9d62c71
--- /dev/null
+++ b/doc/src/examples/capabilitiesexample.qdoc
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example phonon/capabilities
+ \title Capabilities Example
+
+ The Backend Capabilities example shows how to check which MIME
+ types, audio devices, and audio effects are available.
+
+ \image capabilitiesexample.png
+
+ Phonon does not implement the multimedia functionality itself, but
+ relies on a backend to manage this. The backends do not manage the
+ hardware directly, but use intermediate technologies: QuickTime on
+ Mac, GStreamer on Linux, and DirectShow (which requires DirectX)
+ on Windows.
+
+ The user may add support for new MIME types and effects to these
+ systems, and the systems abilities may also be different. The
+ support for multimedia MIME types, and audio effects in Phonon
+ will therefore vary from system to system.
+
+ Backends informs the programmer about current capabilities through
+ an implementation of the Phonon::BackendCapabilities namespace.
+ The backend reports which MIME types can be played back, which
+ audio effects are available, and which sound devices are available
+ on the system. When the capabilities of a backend changes, it will
+ emit the
+ \l{Phonon::BackendCapabilities::Notifier::}{capabilitiesChanged()}
+ signal.
+
+ The example consists of one class, \c Window, which displays
+ capabilities information from the current backend used by Phonon.
+
+ See the \l{Phonon Overview} for a high-level introduction to
+ Phonon.
+
+ \section1 Window Class Definition
+
+ The \c Window class queries the Phonon backend for its
+ capabilities. The results are presented in a GUI consisting of
+ standard Qt widgets. We will now take a tour of the Phonon related
+ parts of both the definition and implementation of the \c Window
+ class.
+
+ \snippet examples/phonon/capabilities/window.h windowMembers
+
+ We need the slot to notice changes in the backends capabilities.
+
+ \c mimeListWidget and \c devicesListView lists MIME types and
+ audio devices. The \c effectsTreeWidget lists audio effects, and
+ expands to show their parameters.
+
+ The \c setupUi() and \c setupBackendBox() private utility
+ functions create the widgets and lays them out. We skip these
+ functions while discussing the implementation because they do not
+ contain Phonon relevant code.
+
+ \section1 Window Class Implementation
+
+ Our examination starts with a look at the constructor:
+
+ \snippet examples/phonon/capabilities/window.cpp constructor
+
+ After creating the user interface, we call \c updateWidgets(),
+ which will fill the widgets with the information we get from the
+ backend. We then connect the slot to the
+ \l{Phonon::BackendCapabilities::Notifier::}{capabilitiesChanged()}
+ and
+ \l{Phonon::BackendCapabilities::Notifier::availableAudioOutputDevicesChanged()}{availableAudioOutputDevicesChanged()}
+ signals in case the backend's abilities changes while the example
+ is running. The signal is emitted by a
+ Phonon::BackendCapabilities::Notifier object, which listens for
+ changes in the backend.
+
+ In the \c updateWidgets() function, we query the backend for
+ information it has about its abilities and present it in the GUI
+ of \c Window. We dissect it here:
+
+ \snippet examples/phonon/capabilities/window.cpp outputDevices
+
+ The
+ \l{Phonon::BackendCapabilities::Notifier::}{availableAudioOutputDevicesChanged()}
+ function is a member of the Phonon::BackendCapabilities namespace.
+ It returns a list of \l{Phonon::}{AudioOutputDevice}s, which gives
+ us information about a particular device, e.g., a sound card or a
+ USB headset.
+
+ Note that \l{Phonon::}{AudioOutputDevice} and also
+ \l{Phonon::}{EffectDescription}, which is described shortly, are
+ typedefs of \l{Phonon::}{ObjectDescriptionType}.
+
+ \omit
+ ###
+ The \l{Phonon::}{ObjectDescriptionModel} is a convenience
+ model that displays the names of the devices. Their
+ descriptions are shown as tooltips and disabled devices are
+ shown in gray.
+ \endomit
+
+ \snippet examples/phonon/capabilities/window.cpp mimeTypes
+
+ The MIME types supported are given as strings in a QStringList. We
+ can therefore create a list widget item with the string, and
+ append it to the \c mimeListWidget, which displays the available
+ MIME types.
+
+ \snippet examples/phonon/capabilities/window.cpp effects
+
+ As before we add the description and name to our widget, which in
+ this case is a QTreeWidget. A particular effect may also have
+ parameters, which are inserted in the tree as child nodes of their
+ effect.
+
+ \snippet examples/phonon/capabilities/window.cpp effectsParameters
+
+ The parameters are only accessible through an instance of the
+ \l{Phonon::}{Effect} class. Notice that an effect is created
+ with the effect description.
+
+ The \l{Phonon::}{EffectParameter} contains information about one
+ of an effects parameters. We pick out some of the information to
+ describe the parameter in the tree widget.
+
+ \section1 The main() function
+
+ Because Phonon uses D-Bus on Linux, it is necessary to give the
+ application a name. You do this with
+ \l{QCoreApplication::}{setApplicationName()}.
+
+ \snippet examples/phonon/capabilities/main.cpp everything
+*/
diff --git a/doc/src/examples/charactermap.qdoc b/doc/src/examples/charactermap.qdoc
new file mode 100644
index 0000000..64c00db
--- /dev/null
+++ b/doc/src/examples/charactermap.qdoc
@@ -0,0 +1,288 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+\example widgets/charactermap
+\title Character Map Example
+
+The Character Map example shows how to create a custom widget that can
+both display its own content and respond to user input.
+
+The example displays an array of characters which the user can click on
+to enter text in a line edit. The contents of the line edit can then be
+copied into the clipboard, and pasted into other applications. The
+purpose behind this sort of tool is to allow users to enter characters
+that may be unavailable or difficult to locate on their keyboards.
+
+\image charactermap-example.png Screenshot of the Character Map example
+
+The example consists of the following classes:
+
+\list
+\i \c CharacterWidget displays the available characters in the current
+ font and style.
+\i \c MainWindow provides a standard main window that contains font and
+ style information, a view onto the characters, a line edit, and a push
+ button for submitting text to the clipboard.
+\endlist
+
+\section1 CharacterWidget Class Definition
+
+The \c CharacterWidget class is used to display an array of characters in
+a user-specified font and style. For flexibility, we subclass QWidget and
+reimplement only the functions that we need to provide basic rendering
+and interaction features.
+
+The class definition looks like this:
+
+\snippet examples/widgets/charactermap/characterwidget.h 0
+
+The widget does not contain any other widgets, so it must provide its own
+size hint to allow its contents to be displayed correctly.
+We reimplement \l{QWidget::paintEvent()} to draw custom content. We also
+reimplement \l{QWidget::mousePressEvent()} to allow the user to interact
+with the widget.
+
+The updateFont() and updateStyle() slots are used to update the font and
+style of the characters in the widget whenever the user changes the
+settings in the application.
+The class defines the characterSelected() signal so that other parts
+of the application are informed whenever the user selects a character in
+the widget.
+As a courtesy, the widget provides a tooltip that shows the current
+character value. We reimplement the \l{QWidget::mouseMoveEvent()} event
+handler and define showToolTip() to enable this feature.
+
+The \c columns, \c displayFont and \c currentKey private data members
+are used to record the number of columns to be shown, the current font,
+and the currently highlighted character in the widget.
+
+\section1 CharacterWidget Class Implementation
+
+Since the widget is to be used as a simple canvas, the constructor just
+calls the base class constructor and defines some default values for
+private data members.
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 0
+
+We initialize \c currentKey with a value of -1 to indicate
+that no character is initially selected. We enable mouse tracking to
+allow us to follow the movement of the cursor across the widget.
+
+The class provides two functions to allow the font and style to be set up.
+Each of these modify the widget's display font and call update():
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 1
+\codeline
+\snippet examples/widgets/charactermap/characterwidget.cpp 2
+
+We use a fixed size font for the display. Similarly, a fixed size hint is
+provided by the sizeHint() function:
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 3
+
+Three standard event functions are implemented so that the widget
+can respond to clicks, provide tooltips, and render the available
+characters. The paintEvent() shows how the contents of the widget are
+arranged and displayed:
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 6
+
+A QPainter is created for the widget and, in all cases, we ensure that the
+widget's background is painted. The painter's font is set to the
+user-specified display font.
+
+The area of the widget that needs to be redrawn is used to determine which
+characters need to be displayed:
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 7
+
+Using integer division, we obtain the row and column numbers of each
+characters that should be displayed, and we draw a square on the widget
+for each character displayed.
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 8
+\snippet examples/widgets/charactermap/characterwidget.cpp 9
+
+The symbols for each character in the array are drawn within each square,
+with the symbol for the most recently selected character displayed in red:
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 10
+
+We do not need to take into account the difference between the area
+displayed in the viewport and the area we are drawing on because
+everything outside the visible area will be clipped.
+
+The mousePressEvent() defines how the widget responds to mouse clicks.
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 5
+
+We are only interested when the user clicks with the left mouse button
+over the widget. When this happens, we calculate which character was
+selected and emit the characterSelected() signal.
+The character's number is found by dividing the x and y-coordinates of
+the click by the size of each character's grid square. Since the number
+of columns in the widget is defined by the \c columns variable, we
+simply multiply the row index by that value and add the column number
+to obtain the character number.
+
+If any other mouse button is pressed, the event is passed on to the
+QWidget base class. This ensures that the event can be handled properly
+by any other interested widgets.
+
+The mouseMoveEvent() maps the mouse cursor's position in global
+coordinates to widget coordinates, and determines the character that
+was clicked by performing the calculation
+
+\snippet examples/widgets/charactermap/characterwidget.cpp 4
+
+The tooltip is given a position defined in global coordinates.
+
+\section1 MainWindow Class Definition
+
+The \c MainWindow class provides a minimal user interface for the example,
+with only a constructor, slots that respond to signals emitted by standard
+widgets, and some convenience functions that are used to set up the user
+interface.
+
+The class definition looks like this:
+
+\snippet examples/widgets/charactermap/mainwindow.h 0
+
+The main window contains various widgets that are used to control how
+the characters will be displayed, and defines the findFonts() function
+for clarity and convenience. The findStyles() slot is used by the widgets
+to determine the styles that are available, insertCharacter() inserts
+a user-selected character into the window's line edit, and
+updateClipboard() synchronizes the clipboard with the contents of the
+line edit.
+
+\section1 MainWindow Class Implementation
+
+In the constructor, we set up the window's central widget and fill it with
+some standard widgets (two comboboxes, a line edit, and a push button).
+We also construct a CharacterWidget custom widget, and add a QScrollArea
+so that we can view its contents:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 0
+
+QScrollArea provides a viewport onto the \c CharacterWidget when we set
+its widget and handles much of the work needed to provide a scrolling
+viewport.
+
+The font combo box is automatically popuplated with a list of available
+fonts. We list the available styles for the current font in the style
+combobox using the following function:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 1
+
+The line edit and push button are used to supply text to the clipboard:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 2
+
+We also obtain a clipboard object so that we can send text entered by the
+user to other applications.
+
+Most of the signals emitted in the example come from standard widgets.
+We connect these signals to slots in this class, and to the slots provided
+by other widgets.
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 4
+
+The font combobox's
+\l{QFontComboBox::currentFontChanged()}{currentFontChanged()} signal is
+connected to the findStyles() function so that the list of available styles
+can be shown for each font that is used. Since both the font and the style
+can be changed by the user, the font combobox's currentFontChanged() signal
+and the style combobox's
+\l{QComboBox::currentIndexChanged()}{currentIndexChanged()} are connected
+directly to the character widget.
+
+The final two connections allow characters to be selected in the character
+widget, and text to be inserted into the clipboard:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 5
+
+The character widget emits the characterSelected() custom signal when
+the user clicks on a character, and this is handled by the insertCharacter()
+function in this class. The clipboard is changed when the push button emits
+the clicked() signal, and we handle this with the updateClipboard() function.
+
+The remaining code in the constructor sets up the layout of the central widget,
+and provides a window title:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 6
+
+The font combobox is automatically populated with a list of available font
+families. The styles that can be used with each font are found by the
+findStyles() function. This function is called whenever the user selects a
+different font in the font combobox.
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 7
+
+We begin by recording the currently selected style, and we clear the
+style combobox so that we can insert the styles associated with the
+current font family.
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 8
+
+We use the font database to collect the styles that are available for the
+current font, and insert them into the style combobox. The current item is
+reset if the original style is not available for this font.
+
+The last two functions are slots that respond to signals from the character
+widget and the main window's push button. The insertCharacter() function is
+used to insert characters from the character widget when the user clicks a
+character:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 9
+
+The character is inserted into the line edit at the current cursor position.
+
+The main window's "To clipboard" push button is connected to the
+updateClipboard() function so that, when it is clicked, the clipboard is
+updated to contain the contents of the line edit:
+
+\snippet examples/widgets/charactermap/mainwindow.cpp 10
+
+We copy all the text from the line edit to the clipboard, but we do not clear
+the line edit.
+*/
diff --git a/doc/src/examples/chart.qdoc b/doc/src/examples/chart.qdoc
new file mode 100644
index 0000000..22f8a51
--- /dev/null
+++ b/doc/src/examples/chart.qdoc
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/chart
+ \title Chart Example
+
+ The Chart example shows how to create a custom view for the model/view framework.
+
+ \image chart-example.png
+
+ In this example, the items in a table model are represented as slices in a pie chart,
+ relying on the flexibility of the model/view architecture to handle custom editing
+ and selection features.
+
+ \bold{Note that you only need to create a new view class if your data requires a
+ specialized representation.} You should first consider using a standard QListView,
+ QTableView, or QTreeView with a custom QItemDelegate subclass if you need to
+ represent data in a special way.
+
+ \omit
+ \section1 PieView Class Definition
+
+ The \c PieView class is a subclass of QAbstractItemView. The base class provides
+ much of the functionality required by view classes, so we only need to provide
+ implementations for three public functions: visualRect(), scrollTo(), and
+ indexAt(). However, the view needs to maintain strict control over its look and
+ feel, so we also provide implementations for a number of other functions:
+
+ \snippet examples/itemviews/chart/pieview.h 0
+
+
+
+ \section1 PieView Class Implementation
+
+ The paint event renders the data from the standard item model as a pie chart.
+ We interpret the data in the following way:
+
+ \list
+ \o Column 0 contains data in two different roles:
+ The \l{Qt::ItemDataRole}{DisplayRole} contains a label, and the
+ \l{Qt::ItemDataRole}{DecorationRole} contains the color of the pie slice.
+ \o Column 1 contains a quantity which we will convert to the angular extent of
+ the slice.
+ \endlist
+
+ The figure is always drawn with the chart on the left and the key on
+ the right. This means that we must try and obtain an area that is wider
+ than it is tall. We do this by imposing a particular aspect ratio on
+ the chart and applying it to the available vertical space. This ensures
+ that we always obtain the maximum horizontal space for the aspect ratio
+ used.
+ We also apply fixed size margin around the figure.
+
+ We use logical coordinates to draw the chart and key, and position them
+ on the view using viewports.
+ \endomit
+*/
diff --git a/doc/src/examples/classwizard.qdoc b/doc/src/examples/classwizard.qdoc
new file mode 100644
index 0000000..a36edf7
--- /dev/null
+++ b/doc/src/examples/classwizard.qdoc
@@ -0,0 +1,204 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/classwizard
+ \title Class Wizard Example
+
+ The License Wizard example shows how to implement linear
+ wizards using QWizard.
+
+ \image classwizard.png Screenshot of the Class Wizard example
+
+ Most wizards have a linear structure, with page 1 followed by
+ page 2 and so on until the last page. Some wizards are more
+ complex in that they allow different traversal paths based on the
+ information provided by the user. The
+ \l{dialogs/licensewizard}{License Wizard} example shows how to
+ create such wizards.
+
+ The Class Wizard example consists of the following classes:
+
+ \list
+ \o \c ClassWizard inherits QWizard and provides a
+ three-step wizard that generates the skeleton of a C++ class
+ based on the user's input.
+ \o \c IntroPage, \c ClassInfoPage, \c CodeStylePage, \c
+ OutputFilesPage, and \c ConclusionPage are QWizardPage
+ subclasses that implement the wizard pages.
+ \endlist
+
+ \section1 ClassWizard Class Definition
+
+ \image classwizard-flow.png The Class Wizard pages
+
+ We will see how to subclass QWizard to implement our own wizard.
+ The concrete wizard class is called \c ClassWizard and provides
+ five pages:
+
+ \list
+ \o The first page is an introduction page, telling the user what
+ the wizard is going to do.
+ \o The second page asks for a class name and a base class, and
+ allows the user to specify whether the class should have a \c
+ Q_OBJECT macro and what constructors it should provide.
+ \o The third page allows the user to set some options related to the code
+ style, such as the macro used to protect the header file from
+ multiple inclusion (e.g., \c MYDIALOG_H).
+ \o The fourth page allows the user to specify the names of the
+ output files.
+ \o The fifth page is a conclusion page.
+ \endlist
+
+ Although the program is just an example, if you press \gui Finish
+ (\gui Done on Mac OS X), actual C++ source files will actually be
+ generated.
+
+ \section1 The ClassWizard Class
+
+ Here's the \c ClassWizard definition:
+
+ \snippet examples/dialogs/classwizard/classwizard.h 0
+
+ The class reimplements QDialog's \l{QDialog::}{accept()} slot.
+ This slot is called when the user clicks \gui{Finish}.
+
+ Here's the constructor:
+
+ \snippet examples/dialogs/classwizard/classwizard.cpp 1
+
+ We instantiate the five pages and insert them into the wizard
+ using QWizard::addPage(). The order in which they are inserted
+ is also the order in which they will be shown later on.
+
+ We call QWizard::setPixmap() to set the banner and the
+ background pixmaps for all pages. The banner is used as a
+ background for the page header when the wizard's style is
+ \l{QWizard::}{ModernStyle}; the background is used as the
+ dialog's background in \l{QWizard::}{MacStyle}. (See \l{Elements
+ of a Wizard Page} for more information.)
+
+ \snippet examples/dialogs/classwizard/classwizard.cpp 3
+ \snippet examples/dialogs/classwizard/classwizard.cpp 4
+ \dots
+ \snippet examples/dialogs/classwizard/classwizard.cpp 5
+ \snippet examples/dialogs/classwizard/classwizard.cpp 6
+
+ If the user clicks \gui Finish, we extract the information from
+ the various pages using QWizard::field() and generate the files.
+ The code is long and tedious (and has barely anything to do with
+ noble art of designing wizards), so most of it is skipped here.
+ See the actual example in the Qt distribution for the details if
+ you're curious.
+
+ \section1 The IntroPage Class
+
+ The pages are defined in \c classwizard.h and implemented in \c
+ classwizard.cpp, together with \c ClassWizard. We will start with
+ the easiest page:
+
+ \snippet examples/dialogs/classwizard/classwizard.h 1
+ \codeline
+ \snippet examples/dialogs/classwizard/classwizard.cpp 7
+
+ A page inherits from QWizardPage. We set a
+ \l{QWizardPage::}{title} and a
+ \l{QWizard::WatermarkPixmap}{watermark pixmap}. By not setting
+ any \l{QWizardPage::}{subTitle}, we ensure that no header is
+ displayed for this page. (On Windows, it is customary for wizards
+ to display a watermark pixmap on the first and last pages, and to
+ have a header on the other pages.)
+
+ Then we create a QLabel and add it to a layout.
+
+ \section1 The ClassInfoPage Class
+
+ The second page is defined and implemented as follows:
+
+ \snippet examples/dialogs/classwizard/classwizard.h 2
+ \codeline
+ \snippet examples/dialogs/classwizard/classwizard.cpp 9
+ \dots
+ \snippet examples/dialogs/classwizard/classwizard.cpp 12
+ \dots
+ \snippet examples/dialogs/classwizard/classwizard.cpp 13
+
+ First, we set the page's \l{QWizardPage::}{title},
+ \l{QWizardPage::}{subTitle}, and \l{QWizard::LogoPixmap}{logo
+ pixmap}. The logo pixmap is displayed in the page's header in
+ \l{QWizard::}{ClassicStyle} and \l{QWizard::}{ModernStyle}.
+
+ Then we create the child widgets, create \l{Registering and Using
+ Fields}{wizard fields} associated with them, and put them into
+ layouts. The \c className field is created with an asterisk (\c
+ *) next to its name. This makes it a \l{mandatory field}, that
+ is, a field that must be filled before the user can press the
+ \gui Next button (\gui Continue on Mac OS X). The fields' values
+ can be accessed from any other page using QWizardPage::field(),
+ or from the wizard code using QWizard::field().
+
+ \section1 The CodeStylePage Class
+
+ The third page is defined and implemented as follows:
+
+ \snippet examples/dialogs/classwizard/classwizard.h 3
+ \codeline
+ \snippet examples/dialogs/classwizard/classwizard.cpp 14
+ \dots
+ \snippet examples/dialogs/classwizard/classwizard.cpp 15
+ \codeline
+ \snippet examples/dialogs/classwizard/classwizard.cpp 16
+
+ The code in the constructor is very similar to what we did for \c
+ ClassInfoPage, so we skipped most of it.
+
+ The \c initializePage() function is what makes this class
+ interesting. It is reimplemented from QWizardPage and is used to
+ initialize some of the page's fields with values from the
+ previous page (namely, \c className and \c baseClass). For
+ example, if the class name on page 2 is \c SuperDuperWidget, the
+ default macro name on page 3 is \c SUPERDUPERWIDGET_H.
+
+ The \c OutputFilesPage and \c ConclusionPage classes are very
+ similar to \c CodeStylePage, so we won't review them here.
+
+ \sa QWizard, {License Wizard Example}, {Trivial Wizard Example}
+*/
diff --git a/doc/src/examples/codecs.qdoc b/doc/src/examples/codecs.qdoc
new file mode 100644
index 0000000..cb38cbe
--- /dev/null
+++ b/doc/src/examples/codecs.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/codecs
+ \title Codecs Example
+
+ The Codecs example demonstrates the principles behind importing and exporting text
+ using codecs to ensure that characters are encoded properly, avoiding loss of data
+ and retaining the correct symbols used in various scripts.
+
+ \image codecs-example.png
+*/
diff --git a/doc/src/examples/codeeditor.qdoc b/doc/src/examples/codeeditor.qdoc
new file mode 100644
index 0000000..669ab45
--- /dev/null
+++ b/doc/src/examples/codeeditor.qdoc
@@ -0,0 +1,209 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/codeeditor
+ \title Code Editor Example
+
+ The Code Editor example shows how to create a simple editor that
+ has line numbers and that highlights the current line.
+
+ \image codeeditor-example.png
+
+ As can be seen from the image, the editor displays the line
+ numbers in an area to the left of the area for editing. The editor
+ will highlight the line containing the cursor.
+
+ We implement the editor in \c CodeEditor, which is a widget that
+ inherits QPlainTextEdit. We keep a separate widget in \c
+ CodeEditor (\c LineNumberArea) onto which we draw the line
+ numbers.
+
+ QPlainTextEdit inherits from QAbstractScrollArea, and editing
+ takes place within its \l{QAbstractScrollArea::}{viewport()}'s
+ margins. We make room for our line number area by setting the left
+ margin of the viewport to the size we need to draw the line
+ numbers.
+
+ When it comes to editing code, we prefer QPlainTextEdit over
+ QTextEdit because it is optimized for handling plain text. See
+ the QPlainTextEdit class description for details.
+
+ QPlainTextEdit lets us add selections in addition to the the
+ selection the user can make with the mouse or keyboard. We use
+ this functionality to highlight the current line. More on this
+ later.
+
+ We will now move on to the definitions and implementations of \c
+ CodeEditor and \c LineNumberArea. Let's start with the \c
+ LineNumberArea class.
+
+ \section1 The LineNumberArea Class
+
+ We paint the line numbers on this widget, and place it over the \c
+ CodeEditor's \l{QAbstractScrollArea::}{viewport()}'s left margin
+ area.
+
+ We need to use protected functions in QPlainTextEdit while
+ painting the area. So to keep things simple, we paint the area in
+ the \c CodeEditor class. The area also asks the editor to
+ calculate its size hint.
+
+ Note that we could simply paint the line numbers directly on the
+ code editor, and drop the LineNumberArea class. However, the
+ QWidget class helps us to \l{QWidget::}{scroll()} its contents.
+ Also, having a separate widget is the right choice if we wish to
+ extend the editor with breakpoints or other code editor features.
+ The widget would then help in the handling of mouse events.
+
+ \snippet widgets/codeeditor/codeeditor.h extraarea
+
+ \section1 CodeEditor Class Definition
+
+ Here is the code editor's class definition:
+
+ \snippet widgets/codeeditor/codeeditor.h codeeditordefinition
+
+ In the editor we resize and draw the line numbers on the \c
+ LineNumberArea. We need to do this when the number of lines in the
+ editor changes, and when the editor's viewport() is scrolled. Of
+ course, it is also done when the editor's size changes. We do
+ this in \c updateLineNumberWidth() and \c updateLineNumberArea().
+
+ Whenever, the cursor's position changes, we highlight the current
+ line in \c highlightCurrentLine().
+
+ \section1 CodeEditor Class Implementation
+
+ We will now go through the code editors implementation, starting
+ off with the constructor.
+
+ \snippet widgets/codeeditor/codeeditor.cpp constructor
+
+ In the constructor we connect our slots to signals in
+ QPlainTextEdit. It is necessary to calculate the line number area
+ width and highlight the first line when the editor is created.
+
+ \snippet widgets/codeeditor/codeeditor.cpp extraAreaWidth
+
+ The \c lineNumberAreaWidth() function calculates the width of the
+ \c LineNumberArea widget. We take the number of digits in the last
+ line of the editor and multiply that with the maximum width of a
+ digit.
+
+ \snippet widgets/codeeditor/codeeditor.cpp slotUpdateExtraAreaWidth
+
+ When we update the width of the line number area, we simply call
+ QAbstractScrollArea::setViewportMargins().
+
+ \snippet widgets/codeeditor/codeeditor.cpp slotUpdateRequest
+
+ This slot is invoked when the editors viewport has been scrolled.
+ The QRect given as argument is the part of the editing area that
+ is do be updated (redrawn). \c dy holds the number of pixels the
+ view has been scrolled vertically.
+
+ \snippet widgets/codeeditor/codeeditor.cpp resizeEvent
+
+ When the size of the editor changes, we also need to resize the
+ line number area.
+
+ \snippet widgets/codeeditor/codeeditor.cpp cursorPositionChanged
+
+ When the cursor position changes, we highlight the current line,
+ i.e., the line containing the cursor.
+
+ QPlainTextEdit gives the possibility to have more than one
+ selection at the same time. we can set the character format
+ (QTextCharFormat) of these selections. We clear the cursors
+ selection before setting the new new
+ QPlainTextEdit::ExtraSelection, else several lines would get
+ highlighted when the user selects multiple lines with the mouse.
+ \omit ask someone how this works \endomit
+
+ One sets the selection with a text cursor. When using the
+ FullWidthSelection property, the current cursor text block (line)
+ will be selected. If you want to select just a portion of the text
+ block, the cursor should be moved with QTextCursor::movePosition()
+ from a position set with \l{QTextCursor::}{setPosition()}.
+
+ \snippet widgets/codeeditor/codeeditor.cpp extraAreaPaintEvent_0
+
+ The \c lineNumberAreaPaintEvent() is called from \c LineNumberArea
+ whenever it receives a paint event. We start off by painting the
+ widget's background.
+
+ \snippet widgets/codeeditor/codeeditor.cpp extraAreaPaintEvent_1
+
+ We will now loop through all visible lines and paint the line
+ numbers in the extra area for each line. Notice that in a plain
+ text edit each line will consist of one QTextBlock; though, if
+ line wrapping is enabled, a line may span several rows in the text
+ edit's viewport.
+
+ We get the top and bottom y-coordinate of the first text block,
+ and adjust these values by the height of the current text block in
+ each iteration in the loop.
+
+ \snippet widgets/codeeditor/codeeditor.cpp extraAreaPaintEvent_2
+
+ Notice that we check if the block is visible in addition to check
+ if it is in the areas viewport - a block can, for example, be
+ hidden by a window placed over the text edit.
+
+ \section1 Suggestions for Extending the Code Editor
+
+ No self-respecting code editor is without a syntax
+ highligther; the \l{Syntax Highlighter Example} shows how to
+ create one.
+
+ In addition to line numbers, you can add more to the extra area,
+ for instance, break points.
+
+ QSyntaxHighlighter gives the possibility to add user data to each
+ text block with
+ \l{QSyntaxHighlighter::}{setCurrentBlockUserData()}. This can be
+ used to implement parenthesis matching. In the \c
+ highlightCurrentLine(), the data of the currentBlock() can be
+ fetched with QTextBlock::userData(). Matching parentheses can be
+ highlighted with an extra selection.
+
+*/
diff --git a/doc/src/examples/collidingmice-example.qdoc b/doc/src/examples/collidingmice-example.qdoc
new file mode 100644
index 0000000..7ea2ca2
--- /dev/null
+++ b/doc/src/examples/collidingmice-example.qdoc
@@ -0,0 +1,279 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/collidingmice
+ \title Colliding Mice Example
+
+ The Colliding Mice example shows how to use the Graphics View
+ framework to implement animated items and detect collision between
+ items.
+
+ \image collidingmice-example.png
+
+ Graphics View provides the QGraphicsScene class for managing and
+ interacting with a large number of custom-made 2D graphical items
+ derived from the QGraphicsItem class, and a QGraphicsView widget
+ for visualizing the items, with support for zooming and rotation.
+
+ The example consists of an item class and a main function:
+ the \c Mouse class represents the individual mice extending
+ QGraphicsItem, and the \c main() function provides the main
+ application window.
+
+ We will first review the \c Mouse class to see how to animate
+ items and detect item collision, and then we will review the \c
+ main() function to see how to put the items into a scene and how to
+ implement the corresponding view.
+
+ \section1 Mouse Class Definition
+
+ The \c mouse class inherits both QObject and QGraphicsItem. The
+ QGraphicsItem class is the base class for all graphical items in
+ the Graphics View framework, and provides a light-weight
+ foundation for writing your own custom items.
+
+ \snippet examples/graphicsview/collidingmice/mouse.h 0
+
+ When writing a custom graphics item, you must implement
+ QGraphicsItem's two pure virtual public functions: \l
+ {QGraphicsItem::}{boundingRect()}, which returns an estimate of
+ the area painted by the item, and \l {QGraphicsItem::}{paint()},
+ which implements the actual painting. In addition, we reimplement
+ the \l {QGraphicsItem::}{shape()} function to return an accurate
+ shape of our mouse item; the default implementation simply returns
+ the item's bounding rectangle.
+
+ The rationale for deriving from QObject in addition to
+ QGraphicsItem is to be able to animate our items by reimplementing
+ QObject's \l {QObject::}{timerEvent()} function and use
+ QObject::startTimer() to generate timer events.
+
+ \section1 Mouse Class Definition
+
+ When constructing a mouse item, we first ensure that all the item's
+ private variables are properly initialized:
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 0
+
+ To calculate the various components of the mouse's color, we use
+ the global qrand() function which is a thread-safe version of the
+ standard C++ rand() function.
+
+ Then we call the \l {QGraphicsItem::rotate()}{rotate()} function
+ inherited from QGraphicsItem. Items live in their own local
+ coordinate system. Their coordinates are usually centered around
+ (0, 0), and this is also the center for all transformations. By
+ calling the item's \l {QGraphicsItem::rotate()}{rotate()} function
+ we alter the direction in which the mouse will start moving.
+
+ In the end we call QObject's \l {QObject::}{startTimer()}
+ function, emitting a timer event every 1000/33 millisecond. This
+ enables us to animate our mouse item using our reimplementation of
+ the \l {QObject::}{timerEvent()} function; whenever a mouse
+ receives a timer event it will trigger \l
+ {QObject::}{timerEvent()}:
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 4
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 5
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 6
+
+ First we ensure that the mice stays within a circle with a radius
+ of 150 pixels.
+
+ Note the \l {QGraphicsItem::mapFromScene()}{mapFromScene()}
+ function provided by QGraphicsItem. This function maps a position
+ given in \e scene coordinates, to the item's coordinate system.
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 7
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 8
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 9
+ \codeline
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 10
+
+ Then we try to avoid colliding with other mice.
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 11
+
+ Finally, we calculate the mouse's speed and its eye direction (for
+ use when painting the mouse), and set its new position.
+
+ The position of an item describes its origin (local coordinate (0,
+ 0)) in the parent coordinates. The \l {QGraphicsItem::setPos()}
+ function sets the position of the item to the given position in
+ the parent's coordinate system. For items with no parent, the
+ given position is interpreted as scene coordinates. QGraphicsItem
+ also provides a \l {QGraphicsItem::}{mapToParent()} function to
+ map a position given in item coordinates, to the parent's
+ coordinate system. If the item has no parent, the position will be
+ mapped to the scene's coordinate system instead.
+
+ Then it is time to provide an implementation for the pure virtual
+ functions inherited from QGraphicsItem. Let's first take a look at
+ the \l {QGraphicsItem::}{boundingRect()} function:
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 1
+
+ The \l {QGraphicsItem::boundingRect()}{boundingRect()} function
+ defines the outer bounds of the item as a rectangle. Note that the
+ Graphics View framework uses the bounding rectangle to determine
+ whether the item requires redrawing, so all painting must be
+ restricted inside this rectangle.
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 3
+
+ The Graphics View framework calls the \l
+ {QGraphicsItem::paint()}{paint()} function to paint the contents
+ of the item; the function paints the item in local coordinates.
+
+ Note the painting of the ears: Whenever a mouse item collides with
+ other mice items its ears are filled with red; otherwise they are
+ filled with dark yellow. We use the
+ QGraphicsScene::collidingItems() function to check if there are
+ any colliding mice. The actual collision detection is handled by
+ the Graphics View framework using shape-shape intersection. All we
+ have to do is to ensure that the QGraphicsItem::shape() function
+ returns an accurate shape for our item:
+
+ \snippet examples/graphicsview/collidingmice/mouse.cpp 2
+
+ Because the complexity of arbitrary shape-shape intersection grows
+ with an order of magnitude when the shapes are complex, this
+ operation can be noticably time consuming. An alternative approach
+ is to reimplement the \l
+ {QGraphicsItem::collidesWithItem()}{collidesWithItem()} function
+ to provide your own custom item and shape collision algorithm.
+
+ This completes the \c Mouse class implementation, it is now ready
+ for use. Let's take a look at the \c main() function to see how to
+ implement a scene for the mice and a view for displaying the
+ contents of the scene.
+
+ \section1 The Main() Function
+
+ In this example we have chosen to let the \c main() function
+ provide the main application window, creating the items and the
+ scene, putting the items into the scene and creating a
+ corresponding view.
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 0
+
+ First, we create an application object and call the global
+ qsrand() function to specify the seed used to generate a new
+ random number sequence of pseudo random integers with the
+ previously mentioned qrand() function.
+
+ Then it is time to create the scene:
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 1
+
+ The QGraphicsScene class serves as a container for
+ QGraphicsItems. It also provides functionality that lets you
+ efficiently determine the location of items as well as determining
+ which items that are visible within an arbitrary area on the
+ scene.
+
+ When creating a scene it is recommended to set the scene's
+ rectangle, i.e., the rectangle that defines the extent of the
+ scene. It is primarily used by QGraphicsView to determine the
+ view's default scrollable area, and by QGraphicsScene to manage
+ item indexing. If not explicitly set, the scene's default
+ rectangle will be the largest bounding rectangle of all the items
+ on the scene since the scene was created (i.e., the rectangle will
+ grow when items are added or moved in the scene, but it will never
+ shrink).
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 2
+
+ The item index function is used to speed up item discovery. \l
+ {QGraphicsScene::NoIndex}{NoIndex} implies that item location is
+ of linear complexity, as all items on the scene are
+ searched. Adding, moving and removing items, however, is done in
+ constant time. This approach is ideal for dynamic scenes, where
+ many items are added, moved or removed continuously. The
+ alternative is \l {QGraphicsScene::BspTreeIndex}{BspTreeIndex}
+ which makes use of binary search resulting in item location
+ algorithms that are of an order closer to logarithmic complexity.
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 3
+
+ Then we add the mice to the scene.
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 4
+
+ To be able to view the scene we must also create a QGraphicsView
+ widget. The QGraphicsView class visualizes the contents of a scene
+ in a scrollable viewport. We also ensure that the contents is
+ rendered using antialiasing, and we create the cheese background
+ by setting the view's background brush.
+
+ The image used for the background is stored as a binary file in
+ the application's executable using Qt's \l {The Qt Resource
+ System}{resource system}. The QPixmap constructor accepts both
+ file names that refer to actual files on disk and file names that
+ refer to the application's embedded resources.
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 5
+
+ Then we set the cache mode; QGraphicsView can cache pre-rendered
+ content in a pixmap, which is then drawn onto the viewport. The
+ purpose of such caching is to speed up the total rendering time
+ for areas that are slow to render, e.g., texture, gradient and
+ alpha blended backgrounds. The \l
+ {QGraphicsView::CacheMode}{CacheMode} property holds which parts
+ of the view that are cached, and the \l
+ {QGraphicsView::CacheBackground}{CacheBackground} flag enables
+ caching of the view's background.
+
+ By setting the \l {QGraphicsView::dragMode}{dragMode} property we
+ define what should happen when the user clicks on the scene
+ background and drags the mouse. The \l
+ {QGraphicsView::ScrollHandDrag}{ScrollHandDrag} flag makes the
+ cursor change into a pointing hand, and dragging the mouse around
+ will scroll the scrollbars.
+
+ \snippet examples/graphicsview/collidingmice/main.cpp 6
+
+ In the end, we set the application window's title and size before
+ we enter the main event loop using the QApplication::exec()
+ function.
+*/
+
diff --git a/doc/src/examples/coloreditorfactory.qdoc b/doc/src/examples/coloreditorfactory.qdoc
new file mode 100644
index 0000000..768bb51
--- /dev/null
+++ b/doc/src/examples/coloreditorfactory.qdoc
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/coloreditorfactory
+ \title Color Editor Factory Example
+
+ This example shows how to create an editor that can be used by
+ a QItemDelegate.
+
+ \image coloreditorfactoryimage.png
+
+ When editing data in a QListView, QTableView, or QTreeView,
+ editors are created and displayed by a \l{Delegate
+ Classes}{delegate}. QItemDelegate, which is the default delegate
+ used by Qt's \l{View Classes}{item views}, uses a
+ QItemEditorFactory to create editors for it. A unique instance
+ provided by QItemEditorFactory is by default installed on all
+ item delegates.
+
+ An item editor factory contains a collection of
+ QItemEditorCreatorBase instances, which are specialized factories
+ that produce editors for one particular QVariant data type (all
+ models in Qt store their data in \l{QVariant}s). An editor can be any
+ Qt or custom widget.
+
+ In this example, we will create an editor (implemented in the \c
+ ColorListEditor class) that can edit the QColor data type and be
+ used by \l{QItemDelegate}s. We do this by creating a new
+ QItemEditorCreatorBase that produces \c ColorListEditors and
+ register it with a new factory, which we set as the default editor
+ item factory (the unique factory instance). To test our editor, we
+ have implemented the \c Window class, which displays a
+ QTableWidget in which \l{QColor}s can be edited.
+
+ \section1 Window Class Implementation
+
+ In the Window class, we create the item editor creator
+ base for our color editor and add it to the default factory.
+ We also create a QTableWidget in which our editor can be
+ tested. It is filled with some data and displayed in a window.
+
+ We take a closer look at the constructor:
+
+ \snippet examples/itemviews/coloreditorfactory/window.cpp 0
+
+ The QStandardItemEditorCreator is a convenience class that
+ inherits QItemEditorCreatorBase. Its constructor takes a template
+ class, of which instances are returned from
+ \l{QItemEditorCreatorBase::}{createWidget()}. The creator uses a
+ constructor that takes a QWidget as its only parameter; the
+ template class must provide this. This way, there is no need to
+ subclass QStandardItemEditorCreator.
+
+ After the new factory has been set, all standard item delegates
+ will use it (i.e, also delegates that were created before the new
+ default factory was set).
+
+ The \c createGUI() function sets up the table and fills it
+ with data.
+
+ \section1 ColorListEditor Definition
+
+ The ColorListEditor inherits QComboBox and lets the user
+ select a QColor from its popup list.
+
+ \snippet examples/itemviews/coloreditorfactory/colorlisteditor.h 0
+
+ QItemDelegate manages the interaction between the editor and
+ the model, i.e., it retrieves data to edit from the model and
+ store data from the editor in the model. The data that is edited
+ by an editor is stored in the editor's user data property, and the
+ delegate uses Qt's \l{Qt's Property System}{property system} to
+ access it by name. We declare our user data property with the
+ Q_PROPERTY macro. The property is set to be the user type with the
+ USER keyword.
+
+ \section1 ColorListEditor Implementation
+
+ The constructor of \c ColorListEditor simply calls \c
+ populateList(), which we will look at later. We move on to the
+ \c color() function:
+
+ \snippet examples/itemviews/coloreditorfactory/colorlisteditor.cpp 0
+
+ We return the data that is selected in the combobox. The data
+ is stored in the Qt::DecorationRole as the color is then also
+ displayed in the popup list (as shown in the image above).
+
+ \snippet examples/itemviews/coloreditorfactory/colorlisteditor.cpp 1
+
+ The \c findData() function searches the items in the combobox
+ and returns the index of the item that has \c color in the
+ Qt::Decoration role.
+
+ \snippet examples/itemviews/coloreditorfactory/colorlisteditor.cpp 2
+
+ Qt knows some predefined colors by name. We simply loop
+ through these to fill our editor with items.
+
+ \section1 Further Customization of Item View Editors
+
+ You can customize Qt's \l{Model/View Programming}{model view
+ framework} in many ways. The procedure shown in this example is
+ usually sufficient to provide custom editors. Further
+ customization is achieved by subclassing QItemEditorFactory
+ and QItemEditorCreatorBase. It is also possible to subclass
+ QItemDelegate if you don't wish to use a factory at all.
+
+ Possible suggestions are:
+
+ \list
+ \o If the editor widget has no user property defined, the delegate
+ asks the factory for the property name, which it in turn
+ asks the item editor creator for. In this case, you can use
+ the QItemEditorCreator class, which takes the property
+ name to use for editing as a constructor argument.
+ \o If the editor requires other constructors or other
+ initialization than provided by QItemEditorCreatorBase, you
+ must reimplement
+ QItemEditorCreatorBase::createWidget().
+ \o You could also subclass QItemEditorFactory if you only want
+ to provide editors for certain kinds of data or use another
+ method of creating the editors than using creator bases.
+ \endlist
+
+ In this example, we use a standard QVariant data type. You can
+ also use custom types. In the \l{Star Delegate Example}, we
+ show how to store a custom data type in a QVariant and paint
+ and edit it in a class that inherits QItemDelegate.
+*/
diff --git a/doc/src/examples/combowidgetmapper.qdoc b/doc/src/examples/combowidgetmapper.qdoc
new file mode 100644
index 0000000..cf44bdb
--- /dev/null
+++ b/doc/src/examples/combowidgetmapper.qdoc
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/combowidgetmapper
+ \title Combo Widget Mapper Example
+
+ The Delegate Widget Mapper example shows how to use a custom delegate to
+ map information from a model to specific widgets on a form.
+
+ \image combo-widget-mapper.png
+
+ In the \l{Simple Widget Mapper Example}, we showed the basic use of a
+ widget mapper to relate data exposed by a model to simple input widgets
+ in a user interface. However, sometimes we want to use input widgets that
+ expose data as choices to the user, such as QComboBox, and we need a way
+ to relate their input to the values stored in the model.
+
+ This example is very similar to the \l{Simple Widget Mapper Example}.
+ Again, we create a \c Window class with an almost identical user interface,
+ except that, instead of providing a spin box so that each person's age
+ can be entered, we provide a combo box to allow their addresses to be
+ classified as "Home", "Work" or "Other".
+
+ \section1 Window Class Definition
+
+ The class provides a constructor, a slot to keep the buttons up to date,
+ and a private function to set up the model:
+
+ \snippet examples/itemviews/combowidgetmapper/window.h Window definition
+
+ In addition to the QDataWidgetMapper object and the controls used to make
+ up the user interface, we use a QStandardItemModel to hold our data and
+ a QStringListModel to hold information about the types of address that
+ can be applied to each person's data.
+
+ \section1 Window Class Implementation
+
+ The constructor of the \c Window class can be explained in three parts.
+ In the first part, we set up the widgets used for the user interface:
+
+ \snippet examples/itemviews/combowidgetmapper/window.cpp Set up widgets
+
+ Note that we set up the mapping the combo box in the same way as for other
+ widgets, but that we apply its own model to it so that it will display
+ data from its own model, the \c typeModel, rather than from the model
+ containing data about each person.
+
+ Next, we set up the widget mapper, relating each input widget to a column
+ in the model specified by the call to \l{QDataWidgetMapper::}{setModel()}:
+
+ \snippet examples/itemviews/combowidgetmapper/window.cpp Set up the mapper
+
+ For the combo box, we pass an extra argument to tell the widget mapper
+ which property to relate to values from the model. As a result, the user
+ is able to select an item from the combo box, and the corresponding
+ value stored in the widget's \c currentIndex property will be stored in
+ the model.
+
+ \omit
+ However, we also set a delegate on the mapper. As with \l{Delegate Classes},
+ this changes the way that data is presented to the user. In this case, the
+ delegate acts as a proxy between the mapper and the input widgets,
+ translating the data into a suitable form for the combo box but not
+ interfering with the other input widgets. The implementation is shown later.
+ \endomit
+
+ The rest of the constructor is very similar to that of the
+ \l{Simple Widget Mapper Example}:
+
+ \snippet examples/itemviews/combowidgetmapper/window.cpp Set up connections and layouts
+
+ The model is initialized in the window's \c{setupModel()} function. Here,
+ we create a standard model with 5 rows and 3 columns. In each row, we
+ insert a name, address, and a value that indicates the type of address.
+ The address types are stored in a string list model.
+
+ \snippet examples/itemviews/combowidgetmapper/window.cpp Set up the model
+
+ As we insert each row into the model, like a record in a database, we
+ store values that correspond to items in \c typeModel for each person's
+ address type. When the widget mapper reads these values from the final
+ column of each row, it will need to use them as references to values in
+ \c typeModel, as shown in the following diagram. This is where the
+ delegate is used.
+
+ \image widgetmapper-combo-mapping.png
+
+ We show the implementation of the \c{updateButtons()} slot for
+ completeness:
+
+ \snippet examples/itemviews/combowidgetmapper/window.cpp Slot for updating the buttons
+
+ \omit
+ \section1 Delegate Class Definition and Implementation
+
+ The delegate we use to mediate interaction between the widget mapper and
+ the input widgets is a small QItemDelegate subclass:
+
+ \snippet examples/itemviews/combowidgetmapper/delegate.h Delegate class definition
+
+ This provides implementations of the two standard functions used to pass
+ data between editor widgets and the model (see the \l{Delegate Classes}
+ documentation for a more general description of these functions).
+
+ Since we only provide an empty implementation of the constructor, we
+ concentrate on the other two functions.
+
+ The \l{QItemDelegate::}{setEditorData()} implementation takes the data
+ referred to by the model index supplied and processes it according to
+ the presence of a \c currentIndex property in the editor widget:
+
+ \snippet examples/itemviews/combowidgetmapper/delegate.cpp setEditorData implementation
+
+ If, like QComboBox, the editor widget has this property, it is set using
+ the value from the model. Since we are passing around QVariant values,
+ the strings stored in the model are automatically converted to the integer
+ values needed for the \c currentIndex property.
+
+ As a result, instead of showing "0", "1" or "2" in the combo box, one of
+ its predefined set of items is shown. We call QItemDelegate::setEditorData()
+ for widgets without the \c currentIndex property.
+
+ The \l{QItemDelegate::}{setModelData()} implementation performs the reverse
+ process, taking the value stored in the widget's \c currentIndex property
+ and storing it back in the model:
+
+ \snippet examples/itemviews/combowidgetmapper/delegate.cpp setModelData implementation
+ \endomit
+
+ \section1 Summary and Further Reading
+
+ The use of a separate model for the combo box provides a menu of choices
+ that are separate from the data stored in the main model. Using a named
+ mapping that relates the combo box's \c currentIndex property to a column
+ in the model effectively allows us to store a look-up value in the model.
+
+ However, when reading the model outside the context of the widget mapper,
+ we need to know about the \c typeModel to make sense of these look-up
+ values. It would be useful to be able to store both the data and the
+ choices held by the \c typeModel in one place.
+ This is covered by the \l{SQL Widget Mapper Example}.
+*/
diff --git a/doc/src/examples/completer.qdoc b/doc/src/examples/completer.qdoc
new file mode 100644
index 0000000..f47ba07
--- /dev/null
+++ b/doc/src/examples/completer.qdoc
@@ -0,0 +1,255 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/completer
+ \title Completer Example
+
+ The Completer example shows how to provide string-completion facilities
+ for an input widget based on data provided by a model.
+
+ \image completer-example.png
+
+ This example uses a custom item model, \c DirModel, and a QCompleter object.
+ QCompleter is a class that provides completions based on an item model. The
+ type of model, the completion mode, and the case sensitivity can be
+ selected using combo boxes.
+
+ \section1 The Resource File
+
+ The Completer example requires a resource file in order to store the
+ \e{countries.txt} and \e{words.txt}. The resource file contains the
+ following code:
+
+ \quotefile examples/tools/completer/completer.qrc
+
+ \section1 DirModel Class Definition
+
+ The \c DirModel class is a subclass of QDirModel, which provides a data
+ model for the local filesystem.
+
+ \snippet examples/tools/completer/dirmodel.h 0
+
+ This class only has a constructor and a \c data() function as it is only
+ created to enable \c data() to return the entire file path for the
+ display role, unlike \l{QDirModel}'s \c data() function that only returns
+ the folder and not the drive label. This is further explained in
+ \c DirModel's implementation.
+
+ \section1 DirModel Class Implementation
+
+ The constructor for the \c DirModel class is used to pass \a parent to
+ QDirModel.
+
+ \snippet examples/tools/completer/dirmodel.cpp 0
+
+ As mentioned earlier, the \c data() function is reimplemented in order to
+ get it to return the entire file parth for the display role. For example,
+ with a QDirModel, you will see "Program Files" in the view. However, with
+ \c DirModel, you will see "C:\\Program Files".
+
+ \snippet examples/tools/completer/dirmodel.cpp 1
+
+ The screenshots below illustrate this difference:
+
+ \table
+ \row \o \inlineimage completer-example-qdirmodel.png
+ \o \inlineimage completer-example-dirmodel.png
+ \endtable
+
+ The Qt::EditRole, which QCompleter uses to look for matches, is left
+ unchanged.
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class is a subclass of QMainWindow and implements four
+ private slots - \c about(), \c changeCase(), \c changeMode(), and
+ \c changeModel().
+
+ \snippet examples/tools/completer/mainwindow.h 0
+
+ Within the \c MainWindow class, we have two private functions:
+ \c createMenu() and \c modelFromFile(). We also declare the private widgets
+ needed - three QComboBox objects, a QCheckBox, a QCompleter, a QLabel, and
+ a QLineEdit.
+
+ \snippet examples/tools/completer/mainwindow.h 1
+
+ \section1 MainWindow Class Implementation
+
+ The constructor of \c MainWindow constructs a \c MainWindow with a parent
+ widget and initializes the private members. The \c createMenu() function
+ is then invoked.
+
+ We set up three QComboBox objects, \c modelComb, \c modeCombo and
+ \c caseCombo. By default, the \c modelCombo is set to QDirModel,
+ the \c modeCombo is set to "Filtered Popup" and the \c caseCombo is set
+ to "Case Insensitive".
+
+ \snippet examples/tools/completer/mainwindow.cpp 0
+
+ The \c wrapCheckBox is then set up. This \c checkBox determines if the
+ \c{completer}'s \l{QCompleter::setWrapAround()}{setWrapAround()} property
+ is enabled or disabled.
+
+ \snippet examples/tools/completer/mainwindow.cpp 1
+
+ We instantiate \c contentsLabel and set its size policy to
+ \l{QSizePolicy::Fixed}{fixed}. The combo boxes' \l{QComboBox::activated()}
+ {activated()} signals are then connected to their respective slots.
+
+ \snippet examples/tools/completer/mainwindow.cpp 2
+
+ The \c lineEdit is set up and then we arrange all the widgets using a
+ QGridLayout. The \c changeModel() function is called, to initialize the
+ \c completer.
+
+ \snippet examples/tools/completer/mainwindow.cpp 3
+
+ The \c createMenu() function is used to instantiate the QAction objects
+ needed to fill the \c fileMenu and \c helpMenu. The actions'
+ \l{QAction::triggered()}{triggered()} signals are connected to their
+ respective slots.
+
+ \snippet examples/tools/completer/mainwindow.cpp 4
+
+ The \c modelFromFile() function accepts the \a fileName of a file and
+ processes it depending on its contents.
+
+ We first validate the \c file to ensure that it can be opened in
+ QFile::ReadOnly mode. If this is unsuccessful, the function returns an
+ empty QStringListModel.
+
+ \snippet examples/tools/completer/mainwindow.cpp 5
+
+ The mouse cursor is then overriden with Qt::WaitCursor before we fill
+ a QStringList object, \c words, with the contents of \c file. Once this
+ is done, we restore the mouse cursor.
+
+ \snippet examples/tools/completer/mainwindow.cpp 6
+
+ As mentioned earlier, the resources file contains two files -
+ \e{countries.txt} and \e{words.txt}. If the \c file read is \e{words.txt},
+ we return a QStringListModel with \c words as its QStringList and
+ \c completer as its parent.
+
+ \snippet examples/tools/completer/mainwindow.cpp 7
+
+ If the \c file read is \e{countries.txt}, then we require a
+ QStandardItemModel with \c words.count() rows, 2 columns, and \c completer
+ as its parent.
+
+ \snippet examples/tools/completer/mainwindow.cpp 8
+
+ A standard line in \e{countries.txt} is:
+ \quotation
+ Norway NO
+ \endquotation
+
+ Hence, to populate the QStandardItemModel object, \c m, we have to
+ split the country name and its symbol. Once this is done, we return
+ \c m.
+
+ \snippet examples/tools/completer/mainwindow.cpp 9
+
+ The \c changeMode() function sets the \c{completer}'s mode, depending on
+ the value of \c index.
+
+ \snippet examples/tools/completer/mainwindow.cpp 10
+
+ The \c changeModel() function changes the item model used based on the
+ model selected by the user.
+
+ A \c switch statement is used to change the item model based on the index
+ of \c modelCombo. If \c case is 0, we use an unsorted QDirModel, providing
+ us with a file path excluding the drive label.
+
+ \snippet examples/tools/completer/mainwindow.cpp 11
+
+ Note that we create the model with \c completer as the parent as this
+ allows us to replace the model with a new model. The \c completer will
+ ensure that the old one is deleted the moment a new model is assigned
+ to it.
+
+ If \c case is 1, we use the \c DirModel we defined earlier, resulting in
+ full paths for the files.
+
+ \snippet examples/tools/completer/mainwindow.cpp 12
+
+ When \c case is 2, we attempt to complete names of countries. This requires
+ a QTreeView object, \c treeView. The country names are extracted from
+ \e{countries.txt} and set the popup used to display completions to
+ \c treeView.
+
+ \snippet examples/tools/completer/mainwindow.cpp 13
+
+ The screenshot below shows the Completer with the country list model.
+
+ \image completer-example-country.png
+
+ If \c case is 3, we attempt to complete words. This is done using a
+ QStringListModel that contains data extracted from \e{words.txt}. The
+ model is sorted \l{QCompleter::CaseInsensitivelySortedModel}
+ {case insensitively}.
+
+ The screenshot below shows the Completer with the word list model.
+
+ \image completer-example-word.png
+
+ Once the model type is selected, we call the \c changeMode() function and
+ the \c changeCase() function and set the wrap option accordingly. The
+ \c{wrapCheckBox}'s \l{QCheckBox::clicked()}{clicked()} signal is connected
+ to the \c{completer}'s \l{QCompleter::setWrapAround()}{setWrapAround()}
+ slot.
+
+ \snippet examples/tools/completer/mainwindow.cpp 14
+
+ The \c about() function provides a brief description about the example.
+
+ \snippet examples/tools/completer/mainwindow.cpp 15
+
+ \section1 \c main() Function
+
+ The \c main() function instantiates QApplication and \c MainWindow and
+ invokes the \l{QWidget::show()}{show()} function.
+
+ \snippet examples/tools/completer/main.cpp 0
+ */
diff --git a/doc/src/examples/complexpingpong.qdoc b/doc/src/examples/complexpingpong.qdoc
new file mode 100644
index 0000000..dd05a41
--- /dev/null
+++ b/doc/src/examples/complexpingpong.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dbus/complexpingpong
+ \title Complex Ping Pong Example
+
+ The Complex Ping Pong example improves on the \l{D-Bus Ping Pong Example} by providing
+ a more useful demonstration of D-Bus interfaces.
+
+ \quotefile doc/src/snippets/complexpingpong-example.qdoc
+*/
diff --git a/doc/src/examples/concentriccircles.qdoc b/doc/src/examples/concentriccircles.qdoc
new file mode 100644
index 0000000..7c36b0d
--- /dev/null
+++ b/doc/src/examples/concentriccircles.qdoc
@@ -0,0 +1,245 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/concentriccircles
+ \title Concentric Circles Example
+
+ The Concentric Circles example shows the improved rendering
+ quality that can be obtained using floating point precision and
+ anti-aliasing when drawing custom widgets. The example also shows
+ how to do simple animations.
+
+ The application's main window displays several widgets which are
+ drawn using the various combinations of precision and
+ anti-aliasing.
+
+ \image concentriccircles-example.png
+
+ Anti-aliasing is one of QPainter's render hints. The
+ QPainter::RenderHints are used to specify flags to QPainter that
+ may, or may not, be respected by any given
+ engine. QPainter::Antialiasing indicates that the engine should
+ anti-alias the edges of primitives if possible, i.e. put
+ additional pixels around the original ones to smooth the edges.
+
+ The difference between floating point precision and integer
+ precision is a matter of accuracy, and is visible in the
+ application's main window: Even though the logic that is
+ calculating the circles' geometry is the same, floating points
+ ensure that the white spaces between each circle are of the same
+ size, while integers make two and two circles appear as if they
+ belong together. The reason is that the integer based precision
+ rely on rounding off non-integer calculations.
+
+ The example consists of two classes:
+
+ \list
+ \o \c CircleWidget is a custom widget which renders several animated
+ concentric circles.
+ \o \c Window is the application's main window displaying four \c
+ {CircleWidget}s drawn using different combinations of precision
+ and aliasing.
+ \endlist
+
+ First we will review the CircleWidget class, then we will take a
+ look at the Window class.
+
+ \section1 CircleWidget Class Definition
+
+ The CircleWidget class inherits QWidget, and is a custom widget
+ which renders several animated concentric circles.
+
+ \snippet examples/painting/concentriccircles/circlewidget.h 0
+
+ We declare the \c floatBased and \c antialiased variables to hold
+ whether an instance of the class should be rendered with integer
+ or float based precision, and whether the rendering should be
+ anti-aliased or not. We also declare functions setting each of
+ these variables.
+
+ In addition we reimplement the QWidget::paintEvent() function to
+ apply the various combinations of precision and anti-aliasing when
+ rendering, and to support the animation. We reimplement the
+ QWidget::minimumSizeHint() and QWidget::sizeHint() functions to
+ give the widget a reasonable size within our application.
+
+ We declare the private \c nextAnimationFrame() slot, and the
+ associated \c frameNo variable holding the number of "animation
+ frames" for the widget, to facilitate the animation.
+
+ \section1 CircleWidget Class Implementation
+
+ In the constructor we make the widget's rendering integer based
+ and aliased by default:
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 0
+
+ We initialize the widget's \c frameNo variable, and set the
+ widget's background color using the QWidget::setBackgroundColor()
+ function which takes a \l {QPalette::ColorRole}{color role} as
+ argument; the QPalette::Base color role is typically white.
+
+ Then we set the widgets size policy using the
+ QWidget::setSizePolicy() function. QSizePolicy::Expanding means
+ that the widget's \l {QWidget::sizeHint()}{sizeHint()} is a
+ sensible size, but that the widget can be shrunk and still be
+ useful. The widget can also make use of extra space, so it should
+ get as much space as possible.
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 1
+ \codeline
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 2
+
+ The public \c setFloatBased() and \c setAntialiased() functions
+ update the widget's rendering preferences, i.e. whether the widget
+ should be rendered with integer or float based precision, and
+ whether the rendering should be anti-aliased or not.
+
+ The functions also generate a paint event by calling the
+ QWidget::update() function, forcing a repaint of the widget with
+ the new rendering preferences.
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 3
+ \codeline
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 4
+
+ The default implementations of the QWidget::minimumSizeHint() and
+ QWidget::sizeHint() functions return invalid sizes if there is no
+ layout for the widget, otherwise they return the layout's minimum and
+ preferred size, respectively.
+
+ We reimplement the functions to give the widget minimum and
+ preferred sizes which are reasonable within our application.
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 5
+
+ The nextAnimationFrame() slot simply increments the \c frameNo
+ variable's value, and calls the QWidget::update() function which
+ schedules a paint event for processing when Qt returns to the main
+ event loop.
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 6
+
+ A paint event is a request to repaint all or part of the
+ widget. The \c paintEvent() function is an event handler that can
+ be reimplemented to receive the widget's paint events. We
+ reimplement the event handler to apply the various combinations of
+ precision and anti-aliasing when rendering the widget, and to
+ support the animation.
+
+ First, we create a QPainter for the widget, and set its
+ antialiased flag to the widget's preferred aliasing. We also
+ translate the painters coordinate system, preparing to draw the
+ widget's cocentric circles. The translation ensures that the
+ center of the circles will be equivalent to the widget's center.
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 7
+
+ When painting a circle, we use the number of "animation frames" to
+ determine the alpha channel of the circle's color. The alpha
+ channel specifies the color's transparency effect, 0 represents a
+ fully transparent color, while 255 represents a fully opaque
+ color.
+
+ \snippet examples/painting/concentriccircles/circlewidget.cpp 8
+
+ If the calculated alpha channel is fully transparent, we don't
+ draw anything since that would be equivalent to drawing a white
+ circle on a white background. Instead we skip to the next circle
+ still creating a white space. If the calculated alpha channel is
+ fully opaque, we set the pen (the QColor passed to the QPen
+ constructor is converted into the required QBrush by default) and
+ draw the circle. If the widget's preferred precision is float
+ based, we specify the circle's bounding rectangle using QRectF and
+ double values, otherwise we use QRect and integers.
+
+ The animation is controlled by the public \c nextAnimationFrame()
+ slot: Whenever the \c nextAnimationFrame() slot is called the
+ number of frames is incremented and a paint event is
+ scheduled. Then, when the widget is repainted, the alpha-blending
+ of the circles' colors change and the circles appear as animated.
+
+ \section1 Window Class Definition
+
+ The Window class inherits QWidget, and is the application's main
+ window rendering four \c {CircleWidget}s using different
+ combinations of precision and aliasing.
+
+ \snippet examples/painting/concentriccircles/window.h 0
+
+ We declare the various components of the main window, i.e the text
+ labels and a double array that will hold reference to the four \c
+ {CircleWidget}s. In addition we declare the private \c
+ createLabel() function to simplify the constructor.
+
+ \section1 Window Class Implementation
+
+ \snippet examples/painting/concentriccircles/window.cpp 0
+
+ In the constructor, we first create the various labels and put
+ them in a QGridLayout.
+
+ \snippet examples/painting/concentriccircles/window.cpp 1
+
+ Then we create a QTimer. The QTimer class is a high-level
+ programming interface for timers, and provides repetitive and
+ single-shot timers.
+
+ We create a timer to facilitate the animation of our concentric
+ circles; when we create the four CircleWidget instances (and add
+ them to the layout), we connect the QTimer::timeout() signal to
+ each of the widgets' \c nextAnimationFrame() slots.
+
+ \snippet examples/painting/concentriccircles/window.cpp 2
+
+ Before we set the layout and window title for our main window, we
+ make the timer start with a timeout interval of 100 milliseconds,
+ using the QTimer::start() function. That means that the
+ QTimer::timeout() signal will be emitted, forcing a repaint of the
+ four \c {CircleWidget}s, every 100 millisecond which is the reason
+ the circles appear as animated.
+
+ \snippet examples/painting/concentriccircles/window.cpp 3
+
+ The private \c createLabel() function is implemented to simlify
+ the constructor.
+*/
diff --git a/doc/src/examples/configdialog.qdoc b/doc/src/examples/configdialog.qdoc
new file mode 100644
index 0000000..afb1c5f
--- /dev/null
+++ b/doc/src/examples/configdialog.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/configdialog
+ \title Config Dialog Example
+
+ The Config Dialog examples shows how a configuration dialog can be created by
+ using an icon view with a stacked widget.
+
+ \image configdialog-example.png
+*/
diff --git a/doc/src/examples/containerextension.qdoc b/doc/src/examples/containerextension.qdoc
new file mode 100644
index 0000000..a4fbcea
--- /dev/null
+++ b/doc/src/examples/containerextension.qdoc
@@ -0,0 +1,518 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/containerextension
+ \title Container Extension Example
+
+ The Container Extension example shows how to create a custom
+ multi-page plugin for Qt Designer using the
+ QDesignerContainerExtension class.
+
+ \image containerextension-example.png
+
+ To provide a custom widget that can be used with \QD, we need to
+ supply a self-contained implementation. In this example we use a
+ custom multi-page widget designed to show the container extension
+ feature.
+
+ An extension is an object which modifies the behavior of \QD. The
+ QDesignerContainerExtension enables \QD to manage and manipulate a
+ custom multi-page widget, i.e. adding and deleting pages to the
+ widget.
+
+ There are four available types of extensions in \QD:
+
+ \list
+ \o QDesignerMemberSheetExtension provides an extension that allows
+ you to manipulate a widget's member functions which is displayed
+ when configuring connections using Qt Designer's mode for editing
+ signals and slots.
+ \o QDesignerPropertySheetExtension provides an extension that
+ allows you to manipulate a widget's properties which is displayed
+ in Qt Designer's property editor.
+ \o QDesignerTaskMenuExtension provides an extension that allows
+ you to add custom menu entries to \QD's task menu.
+ \o QDesignerContainerExtension provides an extension that allows
+ you to add (and delete) pages to a multi-page container plugin
+ in \QD.
+ \endlist
+
+ You can use all the extensions following the same pattern as in
+ this example, only replacing the respective extension base
+ class. For more information, see the \l {QtDesigner Module}.
+
+ The Container Extension example consists of four classes:
+
+ \list
+ \o \c MultiPageWidget is a custom container widget that lets the user
+ manipulate and populate its pages, and navigate among these
+ using a combobox.
+ \o \c MultiPageWidgetPlugin exposes the \c MultiPageWidget class
+ to \QD.
+ \o \c MultiPageWidgetExtensionFactory creates a
+ \c MultiPageWidgetContainerExtension object.
+ \o \c MultiPageWidgetContainerExtension provides the container
+ extension.
+ \endlist
+
+ The project file for custom widget plugins needs some additional
+ information to ensure that they will work within \QD. For example,
+ custom widget plugins rely on components supplied with \QD, and
+ this must be specified in the project file that we use. We will
+ first take a look at the plugin's project file.
+
+ Then we will continue by reviewing the \c MultiPageWidgetPlugin
+ class, and take a look at the \c MultiPageWidgetExtensionFactory
+ and \c MultiPageWidgetContainerExtension classes. Finally, we will
+ take a quick look at the \c MultiPageWidget class definition.
+
+ \section1 The Project File: containerextension.pro
+
+ The project file must contain some additional information to
+ ensure that the plugin will work as expected:
+
+ \snippet examples/designer/containerextension/containerextension.pro 0
+ \snippet examples/designer/containerextension/containerextension.pro 1
+
+ The \c TEMPLATE variable's value makes \c qmake create the custom
+ widget as a library. Later, we will ensure that the widget will be
+ recognized as a plugin by Qt by using the Q_EXPORT_PLUGIN2() macro
+ to export the relevant widget information.
+
+ The \c CONFIG variable contains two values, \c designer and \c
+ plugin:
+
+ \list
+ \o \c designer: Since custom widgets plugins rely on components
+ supplied with \QD, this value ensures that our plugin links against
+ \QD's library (\c libQtDesigner.so).
+
+ \o \c plugin: We also need to ensure that \c qmake considers the
+ custom widget a \e plugin library.
+ \endlist
+
+ When Qt is configured to build in both debug and release modes,
+ \QD will be built in release mode. When this occurs, it is
+ necessary to ensure that plugins are also built in release
+ mode. For that reason we add a \c debug_and_release value to the
+ \c CONFIG variable. Otherwise, if a plugin is built in a mode that
+ is incompatible with \QD, it won't be loaded and installed.
+
+ The header and source files for the widget are declared in the
+ usual way:
+
+ \snippet examples/designer/containerextension/containerextension.pro 2
+
+ We provide an implementation of the plugin interface so that \QD
+ can use the custom widget. In this particular example we also
+ provide implementations of the container extension interface and
+ the extension factory.
+
+ It is important to ensure that the plugin is installed in a
+ location that is searched by \QD. We do this by specifying a
+ target path for the project and adding it to the list of items to
+ install:
+
+ \snippet doc/src/snippets/code/doc_src_examples_containerextension.qdoc 0
+
+ The container extension is created as a library, and will be
+ installed alongside the other \QD plugins when the project is
+ installed (using \c{make install} or an equivalent installation
+ procedure).
+
+ Note that if you want the plugins to appear in a Visual Studio
+ integration, the plugins must be built in release mode and their
+ libraries must be copied into the plugin directory in the install
+ path of the integration (for an example, see \c {C:/program
+ files/trolltech as/visual studio integration/plugins}).
+
+ For more information about plugins, see the \l {How to Create Qt
+ Plugins} documentation.
+
+ \section1 MultiPageWidgetPlugin Class Definition
+
+ The \c MultiPageWidgetPlugin class exposes the \c MultiPageWidget
+ class to \QD. Its definition is similar to the \l
+ {designer/customwidgetplugin}{Custom Widget Plugin} example's
+ plugin class which is explained in detail. The parts of the class
+ definition that is specific to this particular custom widget is
+ the class name and a couple of private slots:
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.h 0
+
+ The plugin class provides \QD with basic information about our
+ plugin, such as its class name and its include file. Furthermore
+ it knows how to create instances of the \c MultiPageWidget widget.
+ \c MultiPageWidgetPlugin also defines the \l
+ {QDesignerCustomWidgetInterface::initialize()}{initialize()}
+ function which is called after the plugin is loaded into \QD. The
+ function's QDesignerFormEditorInterface parameter provides the
+ plugin with a gateway to all of \QD's API's.
+
+ In the case of a multipage widget such as ours, we must also implement
+ two private slots, currentIndexChanged() and pageTitleChanged(),
+ to be able to update \QD's property editor whenever the user views
+ another page or changes one of the page titles. To be able to give
+ each page their own title, we have chosen to use the
+ QWidget::windowTitle property to store the page title (for more
+ information see the MultiPageWidget class \l
+ {designer/containerextension/multipagewidget.cpp}{implementation}). Note
+ that currently there is no way of adding a custom property (e.g.,
+ a page title) to the pages without using a predefined property as
+ placeholder.
+
+ The \c MultiPageWidgetPlugin class inherits from both QObject and
+ QDesignerCustomWidgetInterface. It is important to remember, when
+ using multiple inheritance, to ensure that all the interfaces
+ (i.e. the classes that doesn't inherit Q_OBJECT) are made known to
+ the meta object system using the Q_INTERFACES() macro. This
+ enables \QD to use \l qobject_cast() to query for supported
+ interfaces using nothing but a QObject pointer.
+
+ \section1 MultiPageWidgetPlugin Class Implementation
+
+ The MultiPageWidgetPlugin class implementation is in most parts
+ equivalent to the \l {designer/customwidgetplugin}{Custom Widget
+ Plugin} example's plugin class:
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 0
+ \codeline
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 3
+
+ One of the functions that differ is the isContainer() function
+ which returns true in this example since our custom widget is
+ intended to be used as a container.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 1
+
+ Another function that differ is the function creating our custom widget:
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 2
+
+ In addition to create and return the widget, we connect our custom
+ container widget's currentIndexChanged() signal to the plugin's
+ currentIndexChanged() slot to ensure that \QD's property editor is
+ updated whenever the user views another page. We also connect the
+ widget's pageTitleChanged() signal to the plugin's
+ pageTitleChanged() slot.
+
+ The currentIndexChanged() slot is called whenever our custom
+ widget's currentIndexChanged() \e signal is emitted, i.e. whenever
+ the user views another page:
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 8
+
+ First, we retrieve the object emitting the signal using the
+ QObject::sender() and qobject_cast() functions. If it's called in
+ a slot activated by a signal, QObject::sender() returns a pointer
+ to the object that sent the signal; otherwise it returns 0.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 9
+
+ Once we have the widget we can update the property editor. \QD
+ uses the QDesignerPropertySheetExtension class to feed its
+ property editor, and whenever a widget is selected in its
+ workspace, Qt Designer will query for the widget's property sheet
+ extension and update the property editor.
+
+ So what we want to achieve is to notify \QD that our widget's \e
+ internal selection has changed: First we use the static
+ QDesignerFormWindowInterface::findFormWindow() function to
+ retrieve the QDesignerFormWindowInterface object containing the
+ widget. The QDesignerFormWindowInterface class allows you to query
+ and manipulate form windows appearing in Qt Designer's
+ workspace. Then, all we have to do is to emit its \l
+ {QDesignerFormWindowInterface::emitSelectionChanged()}{emitSelectionChanged()}
+ signal, forcing an update of the property editor.
+
+ When changing a page title a generic refresh of the property
+ editor is not enough because it is actually the page's property
+ extension that needs to be updated. For that reason we need to
+ access the QDesignerPropertySheetExtension object for the page
+ which title we want to change. The QDesignerPropertySheetExtension
+ class also allows you to manipulate a widget's properties, but to
+ get hold of the extension we must first retrieve access to \QD's
+ extension manager:
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 10
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 11
+
+ Again we first retrieve the widget emitting the signal, using the
+ QObject::sender() and qobject_cast() functions. Then we retrieve
+ the current page from the widget that emitted the signal, and we
+ use the static QDesignerFormWindowInterface::findFormWindow()
+ function to retrieve the form containing our widget.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 12
+
+ Now that we have the form window, the QDesignerFormWindowInterface
+ class provides the \l
+ {QDesignerFormWindowInterface::core()}{core()} function which
+ returns the current QDesignerFormEditorInterface object. The
+ QDesignerFormEditorInterface class allows you to access Qt
+ Designer's various components. In particular, the
+ QDesignerFormEditorInterface::extensionManager() function returns
+ a reference to the current extension manager.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 13
+
+ Once we have the extension manager we can update the extension
+ sheet: First we retrieve the property extension for the page which
+ title we want to change, using the qt_extension() function. Then
+ we retrieve the index for the page title using the
+ QDesignerPropertySheetExtension::indexOf() function. As previously
+ mentioned, we have chosen to use the QWidget::windowTitle property
+ to store the page title (for more information see the
+ MultiPageWidget class \l
+ {designer/containerextension/multipagewidget.cpp}{implementation}).
+ Finally, we implicitly force an update of the page's property
+ sheet by calling the the
+ QDesignerPropertySheetExtension::setChanged() function.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 4
+
+ Note also the initialize() function: The \c initialize() function
+ takes a QDesignerFormEditorInterface object as argument.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 5
+
+ When creating extensions associated with custom widget plugins, we
+ need to access \QD's current extension manager which we retrieve
+ from the QDesignerFormEditorInterface parameter.
+
+ In addition to allowing you to manipulate a widget's properties,
+ the QExtensionManager class provides extension management
+ facilities for \QD. Using \QD's current extension manager you can
+ retrieve the extension for a given object. You can also register
+ and unregister an extension for a given object. Remember that an
+ extension is an object which modifies the behavior of \QD.
+
+ When registrering an extension, it is actually the associated
+ extension factory that is registered. In \QD, extension factories
+ are used to look up and create named extensions as they are
+ required. So, in this example, the container extension itself is
+ not created until \QD must know whether the associated widget is a
+ container, or not.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 6
+
+ We create a \c MultiPageWidgetExtensionFactory object that we
+ register using \QD's current \l {QExtensionManager}{extension
+ manager} retrieved from the QDesignerFormEditorInterface
+ parameter. The first argument is the newly created factory and the
+ second argument is an extension identifier which is a string. The
+ \c Q_TYPEID() macro simply convert the string into a
+ QLatin1String.
+
+ The \c MultiPageWidgetExtensionFactory class is a subclass of
+ QExtensionFactory. When \QD must know whether a widget is a
+ container, or not, \QD's extension manager will run through all
+ its registered factories invoking the first one which is able to
+ create a container extension for that widget. This factory will in
+ turn create a \c MultiPageWidgetExtension object.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 7
+
+ Finally, take a look at the \c domXml() function. This function
+ includes default settings for the widget in the standard XML
+ format used by \QD. In this case, we specify the container's first
+ page; any inital pages of a multi-page widget must be specified
+ within this function.
+
+ \snippet examples/designer/containerextension/multipagewidgetplugin.cpp 14
+
+ Remember to use the Q_EXPORT_PLUGIN2() macro to export the
+ MultiPageWidgetPlugin class for use with Qt's plugin handling
+ classes: This macro ensures that \QD can access and construct the
+ custom widget. Without this macro, there is no way for \QD to use
+ the widget.
+
+ \section1 MultiPageWidgetExtensionFactory Class Definition
+
+ The \c MultiPageWidgetExtensionFactory class inherits QExtensionFactory
+ which provides a standard extension factory for \QD.
+
+ \snippet examples/designer/containerextension/multipagewidgetextensionfactory.h 0
+
+ The subclass's purpose is to reimplement the
+ QExtensionFactory::createExtension() function, making it able to
+ create a \c MultiPageWidget container extension.
+
+
+ \section1 MultiPageWidgetExtensionFactory Class Implementation
+
+ The class constructor simply calls the QExtensionFactory base
+ class constructor:
+
+ \snippet examples/designer/containerextension/multipagewidgetextensionfactory.cpp 0
+
+ As described above, the factory is invoked when \QD must know
+ whether the associated widget is a container, or not.
+
+ \snippet examples/designer/containerextension/multipagewidgetextensionfactory.cpp 1
+
+ \QD's behavior is the same whether the requested extension is
+ associated with a container, a member sheet, a property sheet or a
+ task menu: Its extension manager runs through all its registered
+ extension factories calling \c createExtension() for each until
+ one responds by creating the requested extension.
+
+ So the first thing we do in \c
+ MultiPageWidgetExtensionFactory::createExtension() is to check if
+ the QObject, for which the extension is requested, is in fact a \c
+ MultiPageWidget object. Then we check if the requested extension
+ is a container extension.
+
+ If the object is a MultiPageWidget requesting a container
+ extension, we create and return a \c MultiPageWidgetExtension
+ object. Otherwise, we simply return a null pointer, allowing \QD's
+ extension manager to continue its search through the registered
+ factories.
+
+
+ \section1 MultiPageWidgetContainerExtension Class Definition
+
+ The \c MultiPageWidgetContainerExtension class inherits
+ QDesignerContainerExtension which allows you to add (and delete)
+ pages to a multi-page container plugin in \QD.
+
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.h 0
+
+ It is important to recognize that the QDesignerContainerExtension
+ class only is intended to provide \QD access to your custom
+ multi-page widget's functionality; your custom multi-page widget
+ must implement functionality corresponding to the extension's
+ functions.
+
+ Note also that we implement a constructor that takes \e two
+ arguments: the parent widget, and the \c MultiPageWidget object
+ for which the task menu is requested.
+
+ QDesignerContainerExtension provides a couple of menu entries in
+ \QD's task menu by default, enabling the user to add or delete
+ pages to the associated custom multi-page widget in \QD's
+ workspace.
+
+ \section1 MultiPageWidgetContainerExtension Class Implementation
+
+ In the constructor we save the reference to the \c MultiPageWidget
+ object sent as parameter, i.e the widget associated with the
+ extension. We will need this later to access the custom multi-page
+ widget performing the requested actions.
+
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 0
+
+ To fully enable \QD to manage and manipulate your custom
+ multi-page widget, you must reimplement all the functions of
+ QDesignerContainerExtension:
+
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 1
+ \codeline
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 2
+ \codeline
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 3
+
+ You must reimplement \l
+ {QDesignerContainerExtension::addWidget()}{addWidget()} adding a
+ given page to the container, \l
+ {QDesignerContainerExtension::count()}{count()} returning the
+ number of pages in the container, and \l
+ {QDesignerContainerExtension::currentIndex()}{currentIndex()}
+ returning the index of the currently selected page.
+
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 4
+ \codeline
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 5
+ \codeline
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 6
+ \codeline
+ \snippet examples/designer/containerextension/multipagewidgetcontainerextension.cpp 7
+
+ You must reimplement \l
+ {QDesignerContainerExtension::insertWidget()}{insertWidget()}
+ adding a given page to the container at a given index, \l
+ {QDesignerContainerExtension::remove()}{remove()} deleting the
+ page at a given index, \l
+ {QDesignerContainerExtension::setCurrentIndex()}{setCurrentIndex()}
+ setting the index of the currently selected page, and finally \l
+ {QDesignerContainerExtension::widget()}{widget()} returning the
+ page at a given index.
+
+ \section1 MultiPageWidget Class Definition
+
+ The MultiPageWidget class is a custom container widget that lets
+ the user manipulate and populate its pages, and navigate among
+ these using a combobox.
+
+ \snippet examples/designer/containerextension/multipagewidget.h 0
+
+ The main detail to observe is that your custom multi-page widget
+ must implement functionality corresponding to the
+ QDesignerContainerExtension's member functions since the
+ QDesignerContainerExtension class only is intended to provide Qt
+ Designer access to your custom multi-page widget's functionality.
+
+ In addition, we declare the \c currentIndex and \c pageTitle
+ properties, and their associated set and get functions. By
+ declaring these attributes as properties, we allow \QD to manage
+ them in the same way it manages the properties the MultiPageWidget
+ widget inherits from QWidget and QObject, for example featuring
+ the property editor.
+
+ Note the \c STORED attribute in the declaration of the \c
+ pageTitle property: The \c STORED attribute indicates persistence,
+ i.e. it declares whether the property's value must be remembered
+ when storing an object's state. As mentioned above, we have chosen
+ to store the page title using the QWidget::windowTitle property to
+ be able to give each page their own title. For that reason the \c
+ pageTitle property is a "fake" property, provided for editing
+ purposes, and doesn't need to be stored.
+
+ We must also implement and emit the currentIndexChanged() and
+ pageTitleChanged() signals to ensure that \QD's property editor is
+ updated whenever the user views another page or changes one of the
+ page titles.
+
+ See the MultiPageWidget class \l
+ {designer/containerextension/multipagewidget.cpp}{implementation}
+ for more details.
+*/
diff --git a/doc/src/examples/context2d.qdoc b/doc/src/examples/context2d.qdoc
new file mode 100644
index 0000000..a45b8bb
--- /dev/null
+++ b/doc/src/examples/context2d.qdoc
@@ -0,0 +1,353 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example script/context2d
+ \title Context2D Example
+
+ This Qt Script example is an implementation of the Context2D API.
+
+ \image context2d-example.png
+
+ Context2D is part of the specification for the HTML \c{<canvas>}
+ element. It can be used to draw graphics via scripting. A good
+ resource for learning more about the HTML \c{<canvas>} element is
+ the \l{http://developer.mozilla.org/en/docs/HTML:Canvas}{Mozilla Developer Center}.
+
+ \section1 Using The HTML Canvas Element in a Web Browser
+
+ First, let's look at how the \c{<canvas>} element is typically
+ used in a web browser. The following HTML snippet defines a
+ canvas of size 400x400 pixels with id \c{mycanvas}:
+
+ \code
+ <canvas width="400" height="400" id="mycanvas">Fallback content goes here.</canvas>
+ \endcode
+
+ To draw on the canvas, we must first obtain a reference to the
+ DOM element corresponding to the \c{<canvas>} tag and then call
+ the element's getContext() function. The resulting object
+ implements the Context2D API that we use to draw.
+
+ \code
+ <script>
+ var canvas = document.getElementById("mycanvas");
+ var ctx = canvas.getContext("2d");
+
+ // Draw a face
+ ctx.beginPath();
+ ctx.arc(75,75,50,0,Math.PI*2,true); // Outer circle
+ ctx.moveTo(110,75);
+ ctx.arc(75,75,35,0,Math.PI,false); // Mouth
+ ctx.moveTo(65,65);
+ ctx.arc(60,65,5,0,Math.PI*2,true); // Left eye
+ ctx.moveTo(95,65);
+ ctx.arc(90,65,5,0,Math.PI*2,true); // Right eye
+ ctx.stroke();
+ </script>
+ \endcode
+
+ When the page is rendered by a browser that supports the
+ \c{<canvas>} tag, this would be the result:
+
+ \image context2d-example-smileysmile.png
+
+ \section1 Using Qt Script to script a Canvas
+
+ The goal of this example is to be able to evaluate scripts
+ that use the Context2D API, and render the results. Basic
+ interaction (mouse, keyboard) should also be supported.
+ In other words, we want to present scripts with an execution
+ environment that very much resembles that of a web browser. Of
+ course, our environment is only a small subset of what a browser
+ provides; i.e. we don't provide a full DOM API, only what is
+ needed to run "self-contained" Context2D scripts (i.e. scripts
+ that don't depend on other parts of the DOM document).
+
+ Our "Context2D-browser" is set up through the following steps:
+ \list
+ \o Create an Environment.
+ \o Create a Context2D, and a QContext2DCanvas widget to render it.
+ \o Add the canvas object to the environment; this will enable
+ scripts to obtain a reference to it.
+ \o Evaluate scripts in the environment.
+ \endlist
+
+ Once a script has been evaluated, the application handles any
+ timer events and input events that occur subsequently
+ (i.e. forwards events to their associated script targets).
+
+ \section1 The Context2D Class
+
+ The "heart" of this example is the Context2D C++ class that implements
+ the drawing API. Its interface is defined in terms of properties
+ and slots. Note that this class isn't tied to Qt Script in any
+ way.
+
+ \snippet examples/script/context2d/context2d.h 0
+
+ The properties define various aspects of the Context2D
+ configuration.
+
+ \snippet examples/script/context2d/context2d.h 1
+
+ The slots define the operations that can be performed.
+
+ \snippet examples/script/context2d/context2d.h 2
+
+ The changed() signal is emitted when the contents of the drawing
+ area has changed, so that clients associated with the Context2D
+ object (i.e. the canvas widget that renders it) are notified.
+
+ \section2 Implementation
+
+ Conveniently enough, the concepts, data structures and operations
+ of the Context2D API map more or less directly to Qt's painting
+ API. Conceptually, all we have to do is initialize a QPainter
+ according to the Context2D properties, and use functions like
+ QPainter::strokePath() to do the painting. Painting is done on a
+ QImage.
+
+ \snippet examples/script/context2d/context2d.cpp 0
+
+ The property accessors and most of the slots manipulate the
+ internal Context2D state in some way. For the \c{lineCap}
+ property, Context2D uses a string representation; we therefore
+ have to map it from/to a Qt::PenCapStyle. The \c{lineJoin}
+ property is handled in the same fashion. All the property setters
+ also set a \e{dirty flag} for the property; this is used to
+ decide which aspects of the QPainter that need to be updated
+ before doing the next painting operation.
+
+ \snippet examples/script/context2d/context2d.cpp 3
+
+ The implementation of the \c{fillStyle} property is interesting,
+ since the value can be either a string or a \c{CanvasGradient}.
+ We handle this by having the property be of type QVariant,
+ and check the actual type of the value to see how to handle the
+ write.
+
+ \snippet examples/script/context2d/context2d.cpp 1
+
+ Context2D does not have a concept of a paint event; painting
+ operations can happen at any time. We would like to be efficient,
+ and not have to call QPainter::begin() and QPainter::end() for
+ every painting operation, since typically many painting operations
+ will follow in quick succession. The implementations of the
+ painting operations use a helper function, beginPainting(), that
+ activates the QPainter if it isn't active already, and updates
+ the state of the QPainter (brush, pen, etc.) so that it reflects
+ the current Context2D state.
+
+ \snippet examples/script/context2d/context2d.cpp 2
+
+ The implementation of each painting operation ends by calling
+ scheduleChange(), which will post a zero-timer event if one is
+ not already pending. When the application returns to the event
+ loop later (presumably after all the drawing operations have
+ finished), the timer will trigger, QPainter::end() will be
+ called, and the changed() signal is emitted with the new
+ image as argument. The net effect is that there will typically
+ be only a single (QPainter::begin(), QPainter::end()) pair
+ executed for the full sequence of painting operations.
+
+ \section1 The Canvas Widget
+
+ \snippet examples/script/context2d/qcontext2dcanvas.h 0
+
+ The QContext2DCanvas class provides a widget that renders
+ the contents of a Context2D object. It also provides a
+ minimal scripting API, most notably the getContext() function.
+
+ \snippet examples/script/context2d/qcontext2dcanvas.cpp 3
+
+ The constructor connects to the changed() signal of the
+ Context2D object, so that the widget can update itself
+ when it needs to do so. Mouse tracking is enabled so that
+ mouse move events will be received even when no mouse
+ buttons are depressed.
+
+ \snippet examples/script/context2d/qcontext2dcanvas.cpp 0
+
+ The getContext() function asks the environment to wrap the
+ Context2D object; the resulting proxy object makes the
+ Context2D API available to scripts.
+
+ \snippet examples/script/context2d/qcontext2dcanvas.cpp 1
+
+ The paintEvent() function simply paints the contents that
+ was last received from the Context2D object.
+
+ \snippet examples/script/context2d/qcontext2dcanvas.cpp 2
+
+ The canvas widget reimplements mouse and key event handlers, and
+ forwards these events to the scripting environment. The
+ environment will take care of delivering the event to the proper
+ script target, if any.
+
+ \section1 The Environment
+
+ \snippet examples/script/context2d/environment.h 0
+
+ The Environment class provides a scripting environment where a
+ Canvas C++ object can be registered, looked up by ID (name),
+ and where scripts can be evaluated. The environment has a
+ \c{document} property, just like the scripting environment of a
+ web browser, so that scripts can call
+ \c{document.getElementById()} to obtain a reference to a canvas.
+
+ \snippet examples/script/context2d/environment.h 1
+
+ The Environment class provides the timer attributes of the DOM
+ Window Object interface. This enables us to support scripts that
+ do animation, for example.
+
+ \snippet examples/script/context2d/environment.h 2
+
+ The scriptError() signal is emitted when evaluation of a script
+ causes a script exception. For example, if a mouse press handler
+ or timeout handler causes an exception, the environment's client(s)
+ will be notified of this and can report the error.
+
+ \snippet examples/script/context2d/environment.cpp 0
+
+ The constructor initializes the environment. First it creates
+ the QScriptEngine that will be used to evaluate scripts. It
+ creates the Document object that provides the getElementById()
+ function. Note that the QScriptEngine::ExcludeSuperClassContents
+ flag is specified to avoid the wrapper objects from exposing properties
+ and methods inherited from QObject. Next, the environment wraps
+ a pointer to \e{itself}; this is to prepare for setting this object
+ as the script engine's Global Object. The properties of the standard
+ Global Object are copied, so that these will also be available in
+ our custom Global Object. We also create two self-references to the
+ object; again, this is to provide a minimal level of compabilitity
+ with the scripting environment that web browsers provide.
+
+ \snippet examples/script/context2d/environment.cpp 5
+
+ The addCanvas() function adds the given canvas to the list of
+ registered canvas objects. The canvasByName() function looks up
+ a canvas by QObject::objectName(). This function is used to
+ implement the \c{document.getElementById()} script function.
+
+ \snippet examples/script/context2d/environment.cpp 1
+
+ The setInterval() and clearInterval() implementations use a QHash
+ to map from timer ID to the QScriptValue that holds the expression
+ to evaluate when the timer is triggered. A helper function,
+ maybeEmitScriptError(), is called after invoking the script handler;
+ it will emit the scriptError() signal if the script engine has an
+ uncaught exception.
+
+ \snippet examples/script/context2d/environment.cpp 2
+
+ The toWrapper() functions creates a QScriptValue that wraps the
+ given QObject. Note that the QScriptEngine::PreferExistingWrapperObject
+ flag is specified; this guarantees that a single, unique wrapper
+ object will be returned, even if toWrapper() is called several times
+ with the same argument. This is important, since it is possible that
+ a script can set new properties on the resulting wrapper object (e.g.
+ event handlers like \c{onmousedown}), and we want these to persist.
+
+ \snippet examples/script/context2d/environment.cpp 3
+
+ The handleEvent() function determines if there exists a handler
+ for the given event in the environment, and if so, invokes that
+ handler. Since the script expects a DOM event, the Qt C++ event
+ must be converted to a DOM event before it is passed to the
+ script. This mapping is relatively straightforward, but again,
+ we only implement a subset of the full DOM API; just enough to
+ get most scripts to work.
+
+ \snippet examples/script/context2d/environment.cpp 4
+
+ The newFakeDomEvent() function is a helper function that creates
+ a new script object and initializes it with default values for
+ the attributes defined in the DOM Event and DOM UIEvent
+ interfaces.
+
+ \snippet examples/script/context2d/environment.h 3
+
+ The Document class defines two slots that become available to
+ scripts: getElementById() and getElementsByTagName().
+ When the tag name is "canvas", getElementsByTagName() will
+ return a list of all canvas objects that are registered in
+ the environment.
+
+ \section1 The Application Window
+
+ \snippet examples/script/context2d/window.cpp 0
+
+ The Window constructor creates an Environment object and
+ connects to its scriptError() signal. It then creates a
+ Context2D object, and a QContext2DCanvas widget to hold it.
+ The canvas widget is given the name \c{tutorial}, and added to the
+ environment; scripts can access the canvas by e.g.
+ \c{document.getElementById('tutorial')}.
+
+ \snippet examples/script/context2d/window.cpp 1
+
+ The window contains a list widget that is populated with
+ available scripts (read from a \c{scripts/} folder).
+
+ \snippet examples/script/context2d/window.cpp 2
+
+ When an item is selected, the corresponding script is
+ evaluated in the environment.
+
+ \snippet examples/script/context2d/window.cpp 3
+
+ When the "Run in Debugger" button is clicked, the Qt Script debugger will
+ automatically be invoked when the first statement of the script is
+ reached. This enables the user to inspect the scripting environment and
+ control further execution of the script; e.g. he can single-step through
+ the script and/or set breakpoints. It is also possible to enter script
+ statements in the debugger's console widget, e.g. to perform custom
+ Context2D drawing operations, interactively.
+
+ \snippet examples/script/context2d/window.cpp 4
+
+ If the evaluation of a script causes an uncaught exception, the Qt Script
+ debugger will automatically be invoked; this enables the user to get an
+ idea of what went wrong.
+
+*/
diff --git a/doc/src/examples/customcompleter.qdoc b/doc/src/examples/customcompleter.qdoc
new file mode 100644
index 0000000..8d0404a
--- /dev/null
+++ b/doc/src/examples/customcompleter.qdoc
@@ -0,0 +1,201 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/customcompleter
+ \title Custom Completer Example
+
+ The Custom Completer example shows how to provide string-completion
+ facilities for an input widget based on data provided by a model. The
+ completer pops up suggestions for possible words based on the first three
+ characters input by the user and the user's choice of word is inserted
+ into the \c TextEdit using QTextCursor.
+
+ \image customcompleter-example.png
+
+ \section1 Setting Up The Resource File
+
+ The Custom Completer example requires a resource file, \e wordlist.txt,
+ that has a list of words to help QCompleter complete words. This file
+ contains the following:
+
+ \quotefile examples/tools/customcompleter/customcompleter.qrc
+
+ \section1 TextEdit Class Definition
+
+ The \c TextEdit class is a subclass of QTextEdit with a custom
+ \c insertCompletion() slot and it reimplements the
+ \l{QAbstractScrollArea::keyPressEvent()}{keyPressEvent()} and the
+ \l{QWidget::focusInEvent()}{focusInEvent()} functions. \c TextEdit also
+ contains a private function \c textUnderCursor() and a private instance
+ of QCompleter, \c c.
+
+ \snippet examples/tools/customcompleter/textedit.h 0
+
+ \section1 TextEdit Class Implementation
+
+ The constructor for \c TextEdit constructs a \c TextEdit with a parent and
+ initializes \c c. The instructions to use the completer is displayed on
+ the \c TextEdit object, using the
+ \l{QTextEdit::setPlainText()}{setPlainText()} function.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 0
+
+ In addition, \c TextEdit also includes a default destructor:
+
+ \snippet examples/tools/customcompleter/textedit.cpp 1
+
+ The \c setCompleter() function accepts a \a completer and sets it up.
+ We use \c{if (c)} to check if \c c has been initialized. If it has been
+ initialized, the QObject::disconnect() function is invoked to disconnect
+ the signal from the slot. This is to ensure that no previous completer
+ object is still connected to the slot.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 2
+
+ We then instantiate \c c with \a completer and set it as \c{TextEdit}'s
+ widget. The completion mode and case sensitivity are also set and then
+ we connect the \l{QCompleter::activated()}{activated()} signal to the
+ \c insertCompletion() slot.
+
+ The \c completer() function is a getter function that returns \c c.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 3
+
+ The completer pops up the options available, based on the contents of
+ \e wordlist.txt, but the text cursor is responsible for filling in the
+ missing characters, according to the user's choice of word.
+
+ Suppose the user inputs "ACT" and accepts the completer's suggestion of
+ "ACTUAL". The \c completion string is then sent to \c insertCompletion()
+ by the completer's \l{QCompleter::activated()}{activated()} signal.
+
+ The \c insertCompletion() function is responsible for completing the word
+ using a QTextCursor object, \c tc. It validates to ensure that the
+ completer's widget is \c TextEdit before using \c tc to insert the extra
+ characters to complete the word.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 4
+
+ The figure below illustrates this process:
+
+ \image customcompleter-insertcompletion.png
+
+ \c{completion.length()} = 6
+
+ \c{c->completionPrefix().length()}=3
+
+ The difference between these two values is \c extra, which is 3. This
+ means that the last three characters from the right, "U", "A", and "L",
+ will be inserted by \c tc.
+
+ The \c textUnderCursor() function uses a QTextCursor, \c tc, to select a
+ word under the cursor and return it.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 5
+
+ The \c TextEdit class reimplements \l{QWidget::focusInEvent()}
+ {focusInEvent()} function, which is an event handler used to receive
+ keyboard focus events for the widget.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 6
+
+ The \l{QAbstractScrollArea::keyPressEvent()}{keyPressEvent()} is
+ reimplemented to ignore key events like Qt::Key_Enter, Qt::Key_Return,
+ Qt::Key_Escape, Qt::Key_Tab, and Qt::Key_Backtab so the completer can
+ handle them.
+
+ If there is an active completer, we cannot process the shortcut, Ctrl+E.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 7
+
+ We also handle other modifiers and shortcuts for which we do not want the
+ completer to respond to.
+
+ \snippet examples/tools/customcompleter/textedit.cpp 8
+
+ Finally, we pop up the completer.
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class is a subclass of QMainWindow and implements a
+ private slot, \c about(). This class also has two private functions,
+ \c createMenu() and \c modelFromFile() as well as private instances of
+ QCompleter and \c TextEdit.
+
+ \snippet examples/tools/customcompleter/mainwindow.h 0
+
+ \section1 MainWindow Class Implementation
+
+ The constructor constructs a \c MainWindow with a parent and initializes
+ the \c completer. It also instantiates a \c TextEdit and sets its
+ completer. A QStringListModel, obtained from \c modelFromFile(), is used
+ to populate the \c completer. The \c{MainWindow}'s central widget is set
+ to \c TextEdit and its size is set to 500 x 300.
+
+ \snippet examples/tools/customcompleter/mainwindow.cpp 0
+
+ The \c createMenu() function creates the necessary QAction objects needed
+ for the "File" and "Help" menu and their \l{QAction::triggered()}
+ {triggered()} signals are connected to the \c quit(), \c about(), and
+ \c aboutQt() slots respectively.
+
+ \snippet examples/tools/customcompleter/mainwindow.cpp 1
+
+ The \c modelFromFile() function accepts a \a fileName and attempts to
+ extract the contents of this file into a QStringListModel. We display the
+ Qt::WaitCursor when we are populating the QStringList, \c words, and
+ restore the mouse cursor when we are done.
+
+ \snippet examples/tools/customcompleter/mainwindow.cpp 2
+
+ The \c about() function provides a brief description about the Custom
+ Completer example.
+
+ \snippet examples/tools/customcompleter/mainwindow.cpp 3
+
+ \section1 \c main() Function
+
+ The \c main() function instantiates \c MainWindow and invokes the
+ \l{QWidget::show()}{show()} function.
+
+ \snippet examples/tools/customcompleter/main.cpp 0
+*/
diff --git a/doc/src/examples/customsortfiltermodel.qdoc b/doc/src/examples/customsortfiltermodel.qdoc
new file mode 100644
index 0000000..5778581
--- /dev/null
+++ b/doc/src/examples/customsortfiltermodel.qdoc
@@ -0,0 +1,303 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/customsortfiltermodel
+ \title Custom Sort/Filter Model Example
+
+ The Custom Sort/Filter Model example illustrates how to subclass
+ QSortFilterProxyModel to perform advanced sorting and filtering.
+
+ \image customsortfiltermodel-example.png Screenshot of the Custom Sort/Filter Model Example
+
+ The QSortFilterProxyModel class provides support for sorting and
+ filtering data passed between another model and a view.
+
+ The model transforms the structure of a source model by mapping
+ the model indexes it supplies to new indexes, corresponding to
+ different locations, for views to use. This approach allows a
+ given source model to be restructured as far as views are
+ concerned, without requiring any transformations on the underlying
+ data and without duplicating the data in memory.
+
+ The Custom Sort/Filter Model example consists of two classes:
+
+ \list
+
+ \o The \c MySortFilterProxyModel class provides a custom proxy
+ model.
+
+ \o The \c Window class provides the main application window,
+ using the custom proxy model to sort and filter a standard
+ item model.
+
+ \endlist
+
+ We will first take a look at the \c MySortFilterProxyModel class
+ to see how the custom proxy model is implemented, then we will
+ take a look at the \c Window class to see how the model is
+ used. Finally we will take a quick look at the \c main() function.
+
+ \section1 MySortFilterProxyModel Class Definition
+
+ The \c MySortFilterProxyModel class inherits the
+ QSortFilterProxyModel class.
+
+ Since QAbstractProxyModel and its subclasses are derived from
+ QAbstractItemModel, much of the same advice about subclassing
+ normal models also applies to proxy models.
+
+ On the other hand, it is worth noting that many of
+ QSortFilterProxyModel's default implementations of functions are
+ written so that they call the equivalent functions in the relevant
+ source model. This simple proxying mechanism may need to be
+ overridden for source models with more complex behavior; in this
+ example we derive from the QSortFilterProxyModel class to ensure
+ that our filter can recognize a valid range of dates, and to
+ control the sorting behavior.
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.h 0
+
+ We want to be able to filter our data by specifying a given period
+ of time. For that reason, we implement the custom \c
+ setFilterMinimumDate() and \c setFilterMaximumDate() functions as
+ well as the corresponding \c filterMinimumDate() and \c
+ filterMaximumDate() functions. We reimplement
+ QSortFilterProxyModel's \l
+ {QSortFilterProxyModel::filterAcceptsRow()}{filterAcceptsRow()}
+ function to only accept rows with valid dates, and
+ QSortFilterProxyModel::lessThan() to be able to sort the senders
+ by their email adresses. Finally, we implement a \c dateInRange()
+ convenience function that we will use to determine if a date is
+ valid.
+
+ \section1 MySortFilterProxyModel Class Implementation
+
+ The \c MySortFilterProxyModel constructor is trivial, passing the
+ parent parameter on to the base class constructor:
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 0
+
+ The most interesting parts of the \c MySortFilterProxyModel
+ implementation are the reimplementations of
+ QSortFilterProxyModel's \l
+ {QSortFilterProxyModel::filterAcceptsRow()}{filterAcceptsRow()}
+ and \l {QSortFilterProxyModel::lessThan()}{lessThan()}
+ functions. Let's first take a look at our customized \c lessThan()
+ function.
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 4
+
+ We want to sort the senders by their email adresses. The \l
+ {QSortFilterProxyModel::}{lessThan()} function is used as the <
+ operator when sorting. The default implementation handles a
+ collection of types including QDateTime and String, but in order
+ to be able to sort the senders by their email adresses we must
+ first identify the adress within the given string:
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 6
+
+ We use QRegExp to define a pattern for the adresses we are looking
+ for. The QRegExp::indexIn() function attempts to find a match in
+ the given string and returns the position of the first match, or
+ -1 if there was no match. If the given string contains the
+ pattern, we use QRegExp's \l {QRegExp::cap()}{cap()} function to
+ retrieve the actual adress. The \l {QRegExp::cap()}{cap()}
+ function returns the text captured by the \e nth
+ subexpression. The entire match has index 0 and the parenthesized
+ subexpressions have indexes starting from 1 (excluding
+ non-capturing parentheses).
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 3
+
+ The \l
+ {QSortFilterProxyModel::filterAcceptsRow()}{filterAcceptsRow()}
+ function, on the other hand, is expected to return true if the
+ given row should be included in the model. In our example, a row
+ is accepted if either the subject or the sender contains the given
+ regular expression, and the date is valid.
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 7
+
+ We use our custom \c dateInRange() function to determine if a date
+ is valid.
+
+ To be able to filter our data by specifying a given period of
+ time, we also implement functions for getting and setting the
+ minimum and maximum dates:
+
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 1
+ \codeline
+ \snippet examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp 2
+
+ The get functions, \c filterMinimumDate() and \c
+ filterMaximumDate(), are trivial and implemented as inline
+ function in the header file.
+
+ This completes our custom proxy model. Let's see how we can use it
+ in an application.
+
+ \section1 Window Class Definition
+
+ The \c CustomFilter class inherits QWidget, and provides this
+ example's main application window:
+
+ \snippet examples/itemviews/customsortfiltermodel/window.h 0
+
+ We implement two private slots, \c textFilterChanged() and \c
+ dateFilterChanged(), to respond to the user changing the filter
+ pattern, case sensitivity or any of the dates. In addition, we
+ implement a public \c setSourceModel() convenience function to set
+ up the model/ view relation.
+
+ \section1 Window Class Implementation
+
+ In this example, we have chosen to create and set the source model
+ in the \c main () function (which we will come back to later). So
+ when constructing the main application window, we assume that a
+ source model already exists and start by creating an instance of
+ our custom proxy model:
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 0
+
+ We set the \l
+ {QSortFilterProxyModel::dynamicSortFilter}{dynamicSortFilter}
+ property that holds whether the proxy model is dynamically sorted
+ and filtered. By setting this property to true, we ensure that the
+ model is sorted and filtered whenever the contents of the source
+ model change.
+
+ The main application window shows views of both the source model
+ and the proxy model. The source view is quite simple:
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 1
+
+ The QTreeView class provides a default model/view implementation
+ of a tree view; our view implements a tree representation of items
+ in the application's source model.
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 2
+
+ The QTreeView class provides a default model/view implementation
+ of a tree view; our view implements a tree representation of items
+ in the application's source model. We add our view widget to a
+ layout that we install on a corresponding group box.
+
+ The proxy model view, on the other hand, contains several widgets
+ controlling the various aspects of transforming the source model's
+ data structure:
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 3
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 4
+
+ Note that whenever the user changes one of the filtering options,
+ we must explicitly reapply the filter. This is done by connecting
+ the various editors to functions that update the proxy model.
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 5
+
+ The sorting will be handled by the view. All we have to do is to
+ enable sorting for our proxy view by setting the
+ QTreeView::sortingEnabled property (which is false by
+ default). Then we add all the filtering widgets and the proxy view
+ to a layout that we install on a corresponding group box.
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 6
+
+ Finally, after putting our two group boxes into another layout
+ that we install on our main application widget, we customize the
+ application window.
+
+ As mentioned above, we create the source model in the \c main ()
+ function, calling the \c Window::setSourceModel() function to make
+ the application use it:
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 7
+
+ The QSortFilterProxyModel::setSourceModel() function makes the
+ proxy model process the data in the given model, in this case out
+ mail model. The \l {QAbstractItemView::}{setModel()} that the
+ view widget inherits from the QAbstractItemModel class, sets the
+ model for the view to present. Note that the latter function will
+ also create and set a new selection model.
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 8
+
+ The \c textFilterChanged() function is called whenever the user
+ changes the filter pattern or the case sensitivity.
+
+ We first retrieve the preferred syntax (the QRegExp::PatternSyntax
+ enum is used to interpret the meaning of the given pattern), then
+ we determine the preferred case sensitivity. Based on these
+ preferences and the current filter pattern, we set the proxy
+ model's \l {QSortFilterProxyModel::}{filterRegExp} property. The
+ \l {QSortFilterProxyModel::}{filterRegExp} property holds the
+ regular expression used to filter the contents of the source
+ model. Note that calling QSortFilterProxyModel's \l
+ {QSortFilterProxyModel::}{setFilterRegExp()} function also updates
+ the model.
+
+ \snippet examples/itemviews/customsortfiltermodel/window.cpp 9
+
+ The \c dateFilterChanged() function is called whenever the user
+ modifies the range of valid dates. We retrieve the new dates from
+ the user interface, and call the corresponding functions (provided
+ by our custom proxy model) to set the proxy model's minimum and
+ maximum dates. As we explained above, calling these functions also
+ updates the model.
+
+ \section1 The Main() Function
+
+ In this example, we have separated the application from the source
+ model by creating the model in the \c main () function. First we
+ create the application, then we create the source model:
+
+ \snippet examples/itemviews/customsortfiltermodel/main.cpp 0
+
+ The \c createMailModel() function is a convenience function
+ provided to simplify the constructor. All it does is to create and
+ return a model describing a collection of emails. The model is an
+ instance of the QStandardItemModel class, i.e., a generic model
+ for storing custom data typically used as a repository for
+ standard Qt data types. Each mail description is added to the
+ model using \c addMail(), another convenience function. See \l
+ {itemviews/customsortfiltermodel/main.cpp}{main.cpp} for details.
+*/
diff --git a/doc/src/examples/customtype.qdoc b/doc/src/examples/customtype.qdoc
new file mode 100644
index 0000000..ffeccc3
--- /dev/null
+++ b/doc/src/examples/customtype.qdoc
@@ -0,0 +1,157 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/customtype
+ \title Custom Type Example
+
+ The Custom Type example shows how to integrate a custom type into Qt's
+ meta-object system.
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Overview
+
+ Qt provides a range of standard value types that are used to provide
+ rich and meaningful APIs. These types are integrated with the meta-object
+ system, enabling them to be stored in QVariant objects, written out in
+ debugging information and sent between components in signal-slot
+ communication.
+
+ Custom types can also be integrated with the meta-object system as long as
+ they are written to conform to some simple guidelines. In this example, we
+ introduce a simple \c Message class, we describe how we make it work with
+ QVariant, and we show how it can be extended to generate a printable
+ representation of itself for use in debugging output.
+
+ \section1 The Message Class Definition
+
+ The \c Message class is a simple value class that contains two pieces
+ of information (a QString and a QStringList), each of which can be read
+ using trivial getter functions:
+
+ \snippet examples/tools/customtype/message.h custom type definition
+
+ The default constructor, copy constructor and destructor are
+ all required, and must be public, if the type is to be integrated into the
+ meta-object system. Other than this, we are free to implement whatever we
+ need to make the type do what we want, so we also include a constructor
+ that lets us set the type's data members.
+
+ To enable the type to be used with QVariant, we declare it using the
+ Q_DECLARE_METATYPE() macro:
+
+ \snippet examples/tools/customtype/message.h custom type meta-type declaration
+
+ We do not need to write any additional code to accompany this macro.
+
+ To allow us to see a readable description of each \c Message object when it
+ is sent to the debug output stream, we define a streaming operator:
+
+ \snippet examples/tools/customtype/message.h custom type streaming operator
+
+ This facility is useful if you need to insert tracing statements in your
+ code for debugging purposes.
+
+ \section1 The Message Class Implementation
+
+ The implementation of the default constructor, copy constructor and destructor
+ are straightforward for the \c Message class:
+
+ \snippet examples/tools/customtype/message.cpp Message class implementation
+
+ The streaming operator is implemented in the following way:
+
+ \snippet examples/tools/customtype/message.cpp custom type streaming operator
+
+ Here, we want to represent each value depending on how many lines are stored
+ in the message body. We stream text to the QDebug object passed to the
+ operator and return the QDebug object obtained from its maybeSpace() member
+ function; this is described in more detail in the
+ \l{Creating Custom Qt Types#Making the Type Printable}{Creating Custom Qt Types}
+ document.
+
+ We include the code for the getter functions for completeness:
+
+ \snippet examples/tools/customtype/message.cpp getter functions
+
+ With the type fully defined, implemented, and integrated with the
+ meta-object system, we can now use it.
+
+ \section1 Using the Message
+
+ In the example's \c{main()} function, we show how a \c Message object can
+ be printed to the console by sending it to the debug stream:
+
+ \snippet examples/tools/customtype/main.cpp printing a custom type
+
+ You can use the type with QVariant in exactly the same way as you would
+ use standard Qt value types. Here's how to store a value using the
+ QVariant::setValue() function:
+
+ \snippet examples/tools/customtype/main.cpp storing a custom value
+
+ Alternatively, the qVariantFromValue() and qVariantSetValue() functions
+ can be used if you are using a compiler without support for member template
+ functions.
+
+ The value can be retrieved using the QVariant::value() member template
+ function:
+
+ \snippet examples/tools/customtype/main.cpp retrieving a custom value
+
+ Alternatively, the qVariantValue() template function can be used if
+ you are using a compiler without support for member template functions.
+
+ \section1 Further Reading
+
+ The custom \c Message type can also be used with direct signal-slot
+ connections; see the \l{Custom Type Sending Example} for a demonstration
+ of this.
+ To register a custom type for use with queued signals and slots, such as
+ those used in cross-thread communication, see the
+ \l{Queued Custom Type Example}.
+
+ More information on using custom types with Qt can be found in the
+ \l{Creating Custom Qt Types} document.
+*/
diff --git a/doc/src/examples/customtypesending.qdoc b/doc/src/examples/customtypesending.qdoc
new file mode 100644
index 0000000..d335c28
--- /dev/null
+++ b/doc/src/examples/customtypesending.qdoc
@@ -0,0 +1,128 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/customtypesending
+ \title Custom Type Sending Example
+
+ The Custom Type Sending example shows how to use a custom type with signals
+ and slots.
+
+ \image customtypesending-example.png
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Overview
+
+ In the \l{Custom Type Example}, we showed how to integrate custom types
+ with the meta-object system, enabling them to be stored in QVariant
+ objects, written out in debugging information and used in signal-slot
+ communication.
+
+ In this example, we demonstrate that the preparations made to the
+ \c Message class and its declaration with Q_DECLARE_METATYPE() enable it
+ to be used with direct signal-slot connections. We do this by creating
+ a \c Window class containing signals and slots whose signatures include
+ \c Message arguments.
+
+ \section1 The Window Class Definition
+
+ We define a simple \c Window class with a signal and public slot that
+ allow a \c Message object to be sent via a signal-slot connection:
+
+ \snippet examples/tools/customtypesending/window.h Window class definition
+
+ The window will contain a text editor to show the contents of a message
+ and a push button that the user can click to send a message. To facilitate
+ this, we also define the \c sendMessage() slot. We also keep a \c Message
+ instance in the \c thisMessage private variable which holds the actual
+ message to be sent.
+
+ \section1 The Window Class Implementation
+
+ The \c Window constructor sets up a user interface containing a text
+ editor and a push button.
+
+ \snippet examples/tools/customtypesending/window.cpp Window constructor
+
+ The button's \l{QPushButton::}{clicked()} signal is connected to the
+ window's \c{sendMessage()} slot, which emits the \c{messageSent(Message)}
+ signal with the \c Message held by the \c thisMessage variable:
+
+ \snippet examples/tools/customtypesending/window.cpp sending a message
+
+ We implement a slot to allow the message to be received, and this also
+ lets us set the message in the window programatically:
+
+ \snippet examples/tools/customtypesending/window.cpp receiving a message
+
+ In this function, we simply assign the new message to \c thisMessage
+ and update the text in the editor.
+
+ \section1 Making the Connection
+
+ In the example's \c{main()} function, we perform the connection between
+ two instances of the \c Window class:
+
+ \snippet examples/tools/customtypesending/main.cpp main function
+
+ We set the message for the first window and connect the
+ \c{messageSent(Message)} signal from each window to the other's
+ \c{setMessage(Message)} slot. Since the signals and slots mechanism is only
+ concerned with the type, we can simplify the signatures of both the
+ signal and slot when we make the connection.
+
+ When the user clicks on the \gui{Send message} button in either window,
+ the message shown will be emitted in a signal that the other window will
+ receive and display.
+
+ \section1 Further Reading
+
+ Although the custom \c Message type can be used with direct signals and
+ slots, an additional registration step needs to be performed if you want
+ to use it with queued signal-slot connections. See the
+ \l{Queued Custom Type Example} for details.
+
+ More information on using custom types with Qt can be found in the
+ \l{Creating Custom Qt Types} document.
+*/
diff --git a/doc/src/examples/customwidgetplugin.qdoc b/doc/src/examples/customwidgetplugin.qdoc
new file mode 100644
index 0000000..31ad65b
--- /dev/null
+++ b/doc/src/examples/customwidgetplugin.qdoc
@@ -0,0 +1,252 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/customwidgetplugin
+ \title Custom Widget Plugin Example
+
+ The Custom Widget example shows how to create a custom widget plugin for \QD.
+
+ \image customwidgetplugin-example.png
+
+ In this example, the custom widget used is based on the
+ \l{widgets/analogclock}{Analog Clock example}, and does not provide any custom
+ signals or slots.
+
+ \section1 Preparation
+
+ To provide a custom widget that can be used with \QD, we need to supply a
+ self-contained implementation and provide a plugin interface. In this
+ example, we reuse the \l{widgets/analogclock}{Analog Clock example} for
+ convenience.
+
+ Since custom widgets plugins rely on components supplied with \QD, the
+ project file that we use needs to contain information about \QD's
+ library components:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.pro 2
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.pro 0
+
+ The \c TEMPLATE variable's value makes \c qmake create the custom
+ widget as a library. Later, we will ensure that the widget will be
+ recognized as a plugin by Qt by using the Q_EXPORT_PLUGIN2() macro
+ to export the relevant widget information.
+
+ The \c CONFIG variable contains two values, \c designer and \c
+ plugin:
+
+ \list
+
+ \o \c designer: Since custom widgets plugins rely on components
+ supplied with \QD, this value ensures that our plugin links
+ against \QD's library (\c libQtDesigner.so).
+
+ \o \c plugin: We also need to ensure that \c qmake considers the
+ custom widget a plugin library.
+
+ \endlist
+
+ When Qt is configured to build in both debug and release modes,
+ \QD will be built in release mode. When this occurs, it is
+ necessary to ensure that plugins are also built in release
+ mode. For that reason we add the \c debug_and_release value to the
+ \c CONFIG variable. Otherwise, if a plugin is built in a mode that
+ is incompatible with \QD, it won't be loaded and
+ installed.
+
+ The header and source files for the widget are declared in the usual way,
+ and we provide an implementation of the plugin interface so that \QD can
+ use the custom widget:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.pro 3
+
+ It is also important to ensure that the plugin is installed in a
+ location that is searched by \QD. We do this by specifying a
+ target path for the project and adding it to the list of items to
+ install:
+
+ \snippet doc/src/snippets/code/doc_src_examples_customwidgetplugin.qdoc 0
+
+ The custom widget is created as a library, and will be installed
+ alongside the other \QD plugins when the project is installed
+ (using \c{make install} or an equivalent installation procedure).
+ Later, we will ensure that it is recognized as a plugin by \QD by
+ using the Q_EXPORT_PLUGIN2() macro to export the relevant widget
+ information.
+
+ Note that if you want the plugins to appear in a Visual Studio
+ integration, the plugins must be built in release mode and their
+ libraries must be copied into the plugin directory in the install
+ path of the integration (for an example, see \c {C:/program
+ files/trolltech as/visual studio integration/plugins}).
+
+ For more information about plugins, see the \l {How to
+ Create Qt Plugins} documentation.
+
+ \section1 AnalogClock Class Definition and Implementation
+
+ The \c AnalogClock class is defined and implemented in exactly the same
+ way as described in the \l{widgets/analogclock}{Analog Clock example}.
+ Since the class is self-contained, and does not require any external
+ configuration, it can be used without modification as a custom widget in
+ \QD.
+
+ \section1 AnalogClockPlugin Class Definition
+
+ The \c AnalogClock class is exposed to \QD through the \c
+ AnalogClockPlugin class. This class inherits from both QObject and
+ the QDesignerCustomWidgetInterface class, and implements an
+ interface defined by QDesignerCustomWidgetInterface:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.h 0
+
+ The functions provide information about the widget that \QD can use in
+ the \l{Getting to Know Qt Designer#WidgetBox}{widget box}.
+ The \c initialized private member variable is used to record whether
+ the plugin has been initialized by \QD.
+
+ Note that the only part of the class definition that is specific to
+ this particular custom widget is the class name.
+
+ \section1 AnalogClockPlugin Implementation
+
+ The class constructor simply calls the QObject base class constructor
+ and sets the \c initialized variable to \c false.
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 0
+
+ \QD will initialize the plugin when it is required by calling the
+ \c initialize() function:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 1
+
+ In this example, the \c initialized private variable is tested, and only
+ set to \c true if the plugin is not already initialized. Although, this
+ plugin does not require any special code to be executed when it is
+ initialized, we could include such code after the test for initialization.
+
+ The \c isInitialized() function lets \QD know whether the plugin is
+ ready for use:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 2
+
+ Instances of the custom widget are supplied by the \c createWidget()
+ function. The implementation for the analog clock is straightforward:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 3
+
+ In this case, the custom widget only requires a \c parent to be specified.
+ If other arguments need to be supplied to the widget, they can be
+ introduced here.
+
+ The following functions provide information for \QD to use to represent
+ the widget in the widget box.
+ The \c name() function returns the name of class that provides the
+ custom widget:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 4
+
+ The \c group() function is used to describe the type of widget that the
+ custom widget belongs to:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 5
+
+ The widget plugin will be placed in a section identified by its
+ group name in \QD's widget box. The icon used to represent the
+ widget in the widget box is returned by the \c icon() function:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 6
+
+ In this case, we return a null icon to indicate that we have no icon
+ that can be used to represent the widget.
+
+ A tool tip and "What's This?" help can be supplied for the custom widget's
+ entry in the widget box. The \c toolTip() function should return a short
+ message describing the widget:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 7
+
+ The \c whatsThis() function can return a longer description:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 8
+
+ The \c isContainer() function tells \QD whether the widget is supposed to
+ be used as a container for other widgets. If not, \QD will not allow the
+ user to place widgets inside it.
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 9
+
+ Most widgets in Qt can contain child widgets, but it only makes sense
+ to use dedicated container widgets for this purpose in \QD. By returning
+ \c false, we indicate that the custom widget cannot hold other widgets;
+ if we returned true, \QD would allow other widgets to be placed inside
+ the analog clock and a layout to be defined.
+
+ The \c domXml() function provides a way to include default settings for
+ the widget in the standard XML format used by \QD. In this case, we only
+ specify the widget's geometry:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 10
+
+ If the widget provides a reasonable size hint, it is not necessary to
+ define it here. In addition, returning an empty string instead of a
+ \c{<widget>} element will tell \QD not to install the widget in the
+ widget box.
+
+ To make the analog clock widget usable by applications, we implement
+ the \c includeFile() function to return the name of the header file
+ containing the custom widget class definition:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 12
+
+ Finally, we use the Q_EXPORT_PLUGIN2() macro to export the \c
+ AnalogClockPlugin class for use with \QD:
+
+ \snippet examples/designer/customwidgetplugin/customwidgetplugin.cpp 13
+
+ This macro ensures that \QD can access and construct the custom widget.
+ Without this macro, there is no way for \QD to use the widget.
+
+ It is important to note that you can only use the Q_EXPORT_PLUGIN2()
+ macro once in any implementation. If you have several custom widgets in
+ an implementation that you wish to make available to \QD, you will need
+ to implement \l{QDesignerCustomWidgetCollectionInterface}.
+*/
diff --git a/doc/src/examples/dbscreen.qdoc b/doc/src/examples/dbscreen.qdoc
new file mode 100644
index 0000000..88f6d51
--- /dev/null
+++ b/doc/src/examples/dbscreen.qdoc
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qws/dbscreen
+ \title Double Buffered Graphics Driver Example
+
+ The Double Buffered Graphics Driver example shows how to write your own
+ double buffered graphics driver and add it to Qt for Embedded Linux.
+
+ Similar to the \l{Accelerated Graphics Driver Example}, there are three steps
+ to writing and implementing this graphics driver:
+
+ \list 1
+ \o \l {Step 1: Creating a Custom Graphics Driver}
+ {Creating a Custom Graphics Driver}
+
+ \o \l {Step 2: Implementing the Back Buffer}
+ {Implementing the Back Buffer}
+
+ \o \l {Step 3: Creating the Driver Plugin}
+ {Creating the Driver Plugin}
+
+ \endlist
+
+ After compiling the example code, install the graphics driver plugin with
+ the command \c {make install}. To start an application using the graphics
+ driver, you can either set the environment variable \l QWS_DISPLAY and
+ then run the application, or you can just run the application using the
+ \c -display switch.
+
+ Note that this is a minimal example and this driver will not work well
+ with widgets painting themself directly to the screen (e.g. widgets with
+ the Qt::WA_PaintOnScreen window attribute set). Also, the example requires
+ the Linux framebuffer to be set up correctly and with the correct device
+ permissions. For further information, refer to
+ \l{Testing the Linux Framebuffer}.
+
+ \section1 Step 1: Creating a Custom Graphics Driver
+
+ Usually, a custom graphics driver is created by subclassing the QScreen
+ class, the base class for implementing screen or graphics drivers in
+ Qt for Embedded Linux. In this example, however, we subclass the QLinuxFbScreen
+ class instead, to ensure that our driver uses the Linux framebuffer.
+
+ For our graphics driver, the \c DBScreen class, we reimplement five
+ functions belonging to QScreen:
+
+ \list
+ \o \l{QScreen::initDevice()}{initDevice()},
+ \o \l{QScreen::shutdownDevice()}{shutdownDevice()},
+ \o \l{QScreen::blit()}{blit()},
+ \o \l{QScreen::solidFill()}{solidFill()}, and
+ \o \l{QScreen::exposeRegion()}{exposeRegion()}.
+ \endlist
+
+ \snippet examples/qws/dbscreen/dbscreen.h 0
+
+ In addition to the abovementioned functions, there is a private instance
+ of QPainter and QImage - \c painter, used for drawing operations on
+ the back buffer, and \c image, the back buffer itself.
+
+ \section1 Step 2: Implementing the Back Buffer
+
+ The graphics driver must carry out three main functions:
+
+ \list 1
+ \o Allocate the back buffer on startup and deallocate it on shutdown.
+ \o Draw to the back buffer instead of directly to the screen
+ (which is what QLinuxFbScreen does).
+ \o Copy the back buffer to the screen whenever a screen update is
+ done.
+ \endlist
+
+ \section2 Device initializing and shutdown
+
+ We first reimplement \c initDevice() and \c shutdownDevice().
+
+ The \c initDevice() function initializes the framebuffer. We reimplement
+ this function to enable accelerated drivers to set up the graphic card.
+ For this example, we first call the super class' implementation to set up
+ the Linux framebuffer. If this call returns \c false, we return \c false.
+ Otherwise, we initialize the screen cursor with
+ QScreenCursor::initSoftwareCursor() as well as instantiate \c image and
+ \c painter. Then, we return \c true.
+
+ \snippet examples/qws/dbscreen/dbscreen.cpp 0
+
+ The \c shutdownDevice() function's default implementation only hides the
+ mouse cursor. Hence, we reimplement it to carry out the necessary cleanup
+ before the Qt for Embedded Linux server exits.
+
+ \snippet examples/qws/dbscreen/dbscreen.cpp 1
+
+ Again, we call the super class implementation to shutdown the Linux
+ framebuffer prior to deleting \c image and \c painter.
+
+ \section2 Drawing to the back buffer
+
+ We move on to the drawing functions - \c solidFill() and \c blit(). In
+ QLinuxFbScreen, these functions draw directly to the Linux framebuffer;
+ but in our driver we reimplement them to draw to the back buffer instead.
+
+ \snippet examples/qws/dbscreen/dbscreen.cpp 2
+
+ The \c solidFill() function is called from \c exposeRegion() to fill the
+ given \c region of the screen with the specified \c color. In this
+ example, we use \c painter to fill rectangles in \c image, the back
+ buffer, according to the given region.
+
+ \snippet examples/qws/dbscreen/dbscreen.cpp 3
+
+ The \c blit() function is also called from \c exposeRegion() to copy the
+ given QRegion object, \c region, in the given QImage object, \c image, to
+ the QPoint object specified by \c topLeft. Once again we use \c painter
+ to draw in the back buffer, \c image.
+
+ \section2 Displaying the buffer on the screen
+
+ The \c exposeRegion() function is called by the Qt for Embedded Linux server
+ whenever a screen update is required. The given \c region is the screen
+ region that needs to be updated and \c changing is is the index into
+ QWSServer::clientWindows() of the window that caused the update.
+
+ \snippet examples/qws/dbscreen/dbscreen.cpp 4
+
+ In our implementation, we first call the super class implementation to
+ ensure that \c solidFill() and \c blit() will be called correctly. This
+ causes the changed areas to be updated in the back buffer. We then call
+ the super class' implementation of \c blit() to copy the updated region
+ from the back buffer into the Linux framebuffer.
+
+ \section1 Step 3: Creating the Driver Plugin
+
+ Qt provides a high level API for writing Qt extentions. One of the plugin
+ base classes provided is QScreenDriverPlugin, which we use in this example
+ to create our screen driver plugin.
+
+ \snippet examples/qws/dbscreen/dbscreendriverplugin.cpp 0
+
+ There are only two functions to reimplement:
+
+ \list
+ \o \l{QScreenDriverPlugin::create()}{create()} - creates a driver
+ matching the given key
+ \o \l{QScreenDriverPlugin::create()}{keys()} - returns a list of
+ valid keys representing the drivers supported by the plugin
+ \endlist
+
+ \snippet examples/qws/dbscreen/dbscreendriverplugin.cpp 1
+ \codeline
+ \snippet examples/qws/dbscreen/dbscreendriverplugin.cpp 2
+
+ Our plugin will only support one driver, \c dbscreen.
+
+ Lastly, we export the plugin.
+
+ \snippet examples/qws/dbscreen/dbscreendriverplugin.cpp 3
+
+ For detailed information about the Qt plugin system see
+ \l{How to Create Qt Plugins.}
+*/
diff --git a/doc/src/examples/dbus-chat.qdoc b/doc/src/examples/dbus-chat.qdoc
new file mode 100644
index 0000000..f062c23
--- /dev/null
+++ b/doc/src/examples/dbus-chat.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dbus/dbus-chat
+ \title D-Bus Chat Example
+
+ The D-Bus Chat example shows how to use D-Bus to communicate between two
+ applications.
+
+ \image dbus-chat-example.png
+*/
diff --git a/doc/src/examples/dbus-listnames.qdoc b/doc/src/examples/dbus-listnames.qdoc
new file mode 100644
index 0000000..5b13abe
--- /dev/null
+++ b/doc/src/examples/dbus-listnames.qdoc
@@ -0,0 +1,47 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dbus/listnames
+ \title D-Bus List Names Example
+
+ The D-Bus List Names examples shows how to query D-Bus for a list of service names.
+*/
diff --git a/doc/src/examples/dbus-pingpong.qdoc b/doc/src/examples/dbus-pingpong.qdoc
new file mode 100644
index 0000000..6b15978
--- /dev/null
+++ b/doc/src/examples/dbus-pingpong.qdoc
@@ -0,0 +1,9 @@
+/*!
+ \example dbus/pingpong
+ \title D-Bus Ping Pong Example
+
+ The D-Bus Ping Pong example provides a basic demonstration of D-Bus
+ interfaces.
+
+ \quotefile doc/src/snippets/dbus-pingpong-example.qdoc
+*/
diff --git a/doc/src/examples/dbus-remotecontrolledcar.qdoc b/doc/src/examples/dbus-remotecontrolledcar.qdoc
new file mode 100644
index 0000000..ef31bd2
--- /dev/null
+++ b/doc/src/examples/dbus-remotecontrolledcar.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dbus/remotecontrolledcar
+ \title D-Bus Remote Controlled Car Example
+
+ The Remote Controlled Car example shows how to use D-Bus to control one
+ application using another.
+
+ \image remotecontrolledcar-car-example.png
+*/
diff --git a/doc/src/examples/defaultprototypes.qdoc b/doc/src/examples/defaultprototypes.qdoc
new file mode 100644
index 0000000..dc65902
--- /dev/null
+++ b/doc/src/examples/defaultprototypes.qdoc
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example script/defaultprototypes
+ \title Default Prototypes Example
+
+ This Qt Script example shows how to use default prototypes
+ to make a non-QObject-based type scriptable.
+
+ \image defaultprototypes-example.png
+
+ With QScriptEngine::setDefaultPrototype() you can specify
+ a QtScript object that defines a scripting interface for
+ a C++ type; Qt Script operations on values of such types
+ will then be delegated to your prototype object. In this
+ example, a simple scripting interface for QListWidgetItem is
+ defined, so that the text of items can easily be accessed from
+ script code.
+
+ To define a scripting API for QListWidgetItem in terms of
+ Qt properties and slots, we subclass QObject and QScriptable.
+
+ \snippet examples/script/defaultprototypes/prototypes.h 0
+
+ A single property, \c{text}, is defined, along with a slot,
+ \c{toString}.
+
+ \snippet examples/script/defaultprototypes/prototypes.cpp 0
+
+ The implementation of the property accessors use
+ the qscriptvalue_cast() function to cast the script object
+ to a QListWidgetItem pointer. The normal C++ QListWidgetItem
+ API is then used to implement the desired functionality.
+
+ Although not shown here, it is possible to throw a script
+ exception from a prototype function; for example, you could throw
+ a TypeError exception if the qscriptvalue_cast() fails.
+
+ QListWidgetItems are usually added to a QListWidget. While
+ QListWidget is a QObject-based class, not all the functionality
+ needed for this example are present. We can solve this by creating
+ a default prototype for the QListWidget class as well. The
+ prototype will augment the functionality already provided by the
+ Qt Script QObject integration; i.e. if a property or slot is not
+ found in the QListWidget object itself, the prototype will be used
+ as a fallback.
+
+ \snippet examples/script/defaultprototypes/prototypes.h 1
+
+ The additional slots will make it possible to add items to
+ a QListWidget from script code, and to set the background
+ color of the widget from a string.
+
+ \snippet examples/script/defaultprototypes/prototypes.cpp 1
+
+ Again, we use qscriptvalue_cast() to cast the script object
+ to the relevant C++ type, in this case a QListWidget pointer.
+ The addItem() and addItems() functions simply forward their
+ arguments to the corresponding functions in the QListWidget
+ class. setBackgroundColor() gets the widget's palette, creates
+ a QColor from the given string argument and changes the palette
+ accordingly.
+
+ \snippet examples/script/defaultprototypes/main.cpp 0
+
+ The relevant C++ types must be made known to Qt's meta type
+ system.
+
+ \snippet examples/script/defaultprototypes/main.cpp 1
+
+ For each type that we want to associate a prototype object with,
+ we create an instance of the prototype class, pass it to
+ QScriptEngine::newQObject(), and then create the link between
+ the C++ type and the resulting script object by calling
+ QScriptEngine::setDefaultPrototype().
+
+ \snippet examples/script/defaultprototypes/main.cpp 2
+
+ In this example, a single QListWidget object is added as
+ a global script variable, called \c{listWidget}. Script code
+ can add items to this widget by calling addItem() or addItems().
+
+ \snippet examples/script/defaultprototypes/code.js 0
+
+ Script code can connect to signals of the QListWidget object;
+ signal handlers can use the interface defined in
+ the QListWidgetItem prototype to manipulate item arguments.
+
+ \snippet examples/script/defaultprototypes/code.js 1
+
+ Not shown in this example is how to make QListWidgetItem
+ constructible from Qt Script code, i.e. to be able to
+ write "new QListWidgetItem()" in a script. In order to do
+ this, you have to define your own script constructor for
+ the type. The constructor would just be a factory function
+ that constructs a new C++ QListWidgetItem and returns it
+ back to the script. See QScriptEngine::newFunction() for more
+ information.
+*/
diff --git a/doc/src/examples/delayedencoding.qdoc b/doc/src/examples/delayedencoding.qdoc
new file mode 100644
index 0000000..cd1c4ae
--- /dev/null
+++ b/doc/src/examples/delayedencoding.qdoc
@@ -0,0 +1,125 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example draganddrop/delayedencoding
+ \title Delayed Encoding Example
+
+ The Delayed Encoding example shows how to delay preparing of data
+ for drag and drop operations until a drop target is found.
+
+ \image delayedecoding-example.png
+
+ The \gui Export push button is pressed down to start the drag.
+ The data for the drag and drop operation is not processed until
+ the user of the application has found a valid drop target. This
+ removes redundant processing if the operation is aborted. In our
+ case, we have an SVG image that we wish to send as the \c {
+ "image/png" } MIME type. It is the conversion from SVG to PNG we
+ wish to delay - it can be quite expensive.
+
+ The example is implemented in two classes: \c SourceWidget and \c
+ MimeData. The \c SourceWidget class sets up the GUI and starts the
+ drag operation on request. The \c MimeData class, which inherits
+ QMimeData, sends a signal when a drop target is found. This signal
+ is connected to a slot in \c SourceWidget, which does the
+ conversion from SVG to PNG.
+
+ \section1 SourceWidget Class Definition
+
+ The \c SourceWidget class starts drag and drop operations and also
+ does the image conversion.
+
+ \snippet examples/draganddrop/delayedencoding/sourcewidget.h 0
+
+ The \gui Export push button is connected to the \c startDrag()
+ slot. The \c createData() slot will be invoked when data for the
+ drag and drop operation is to be created.
+
+ \section1 SourceWidget Class Implementation
+
+ Let's start our code tour with a look at the \c startDrag() slot.
+
+ \snippet examples/draganddrop/delayedencoding/sourcewidget.cpp 0
+
+ We emit \c dataRequested() from \c MimeData when the operation has
+ found a valid drop target.
+
+ We gallop along to \c createData():
+
+ \snippet examples/draganddrop/delayedencoding/sourcewidget.cpp 1
+
+ Fortunately, Qt provides QSvgRenderer, which can render the SVG
+ image to any QPaintDevice. Also, QImage has no problems saving to
+ the PNG format.
+
+ Finally, we can give the data to \c MimeData.
+
+ \section1 MimeData Class Definition
+
+ The \c MimeData class inherits QMimeData and makes it possible to
+ delay preparing of the data for a drag and drop operation.
+
+ \snippet examples/draganddrop/delayedencoding/mimedata.h 0
+
+ We will look closer at \c retrieveData() and \c formats() in the
+ next section.
+
+ \section1 MimeData Class Implementation
+
+ \snippet examples/draganddrop/delayedencoding/mimedata.cpp 0
+
+ In the \c formats() function, we return the format of the
+ data we provide. This is the \c { image/png } MIME type.
+
+ \snippet examples/draganddrop/delayedencoding/mimedata.cpp 1
+
+ \c retrieveData() is reimplemented from QMimeData and is
+ called when the data is requested by the drag and drop
+ operation. Fortunately for us, this happens when the operation
+ is finishing, i.e., when a drop target has been found.
+
+ We emit the \c dataRequested() signal, which is picked up by
+ \c SourceWidget. The \c SourceWidget (as already explained)
+ sets the data on \c MimeData with \l{QMimeData::}{setData()}.
+
+*/
+
diff --git a/doc/src/examples/diagramscene.qdoc b/doc/src/examples/diagramscene.qdoc
new file mode 100644
index 0000000..ebf93e2
--- /dev/null
+++ b/doc/src/examples/diagramscene.qdoc
@@ -0,0 +1,846 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/diagramscene
+ \title Diagram Scene Example
+
+ This example shows use of Qt's graphics framework.
+
+ \image diagramscene.png
+
+ The Diagram Scene example is an application in which you can
+ create a flowchart diagram. It is possible to add flowchart shapes
+ and text and connect the shapes by arrows as shown in the image
+ above. The shapes, arrows, and text can be given different
+ colors, and it is possible to change the font, style, and
+ underline of the text.
+
+ The Qt graphics view framework is designed to manage and
+ display custom 2D graphics items. The main classes of the
+ framework are QGraphicsItem, QGraphicsScene and QGraphicsView. The
+ graphics scene manages the items and provides a surface for them.
+ QGraphicsView is a widget that is used to render a scene on the
+ screen. See the \l{The Graphics View Framework}{overview document}
+ for a more detailed description of the framework.
+
+ In this example we show how to create such custom graphics
+ scenes and items by implementing classes that inherit
+ QGraphicsScene and QGraphicsItem.
+
+ In particular we show how to:
+
+ \list
+ \o Create custom graphics items.
+ \o Handle mouse events and movement of items.
+ \o Implement a graphics scene that can manage our custom items.
+ \o Custom painting of items.
+ \o Create a movable and editable text item.
+ \endlist
+
+ The example consists of the following classes:
+ \list
+ \o \c MainWindow creates the widgets and display
+ them in a QMainWindow. It also manages the interaction
+ between the widgets and the graphics scene, view and
+ items.
+ \o \c DiagramItem inherits QGraphicsPolygonItem and
+ represents a flowchart shape.
+ \o \c TextDiagramItem inherits QGraphicsTextItem and
+ represents text items in the diagram. The class adds
+ support for moving the item with the mouse, which is not
+ supported by QGraphicsTextItem.
+ \o \c Arrow inherits QGraphicsLineItem and is an arrow
+ that connect two DiagramItems.
+ \o \c DiagramScene inherits QGraphicsDiagramScene and
+ provides support for \c DiagramItem, \c Arrow and
+ \c DiagramTextItem (In addition to the support already
+ handled by QGraphicsScene).
+ \endlist
+
+ \section1 MainWindow Class Definition
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.h 0
+
+ The \c MainWindow class creates and lays out the widgets in a
+ QMainWindow. The class forwards input from the widgets to the
+ DiagramScene. It also updates its widgets when the diagram
+ scene's text item changes, or a diagram item or a diagram text item
+ is inserted into the scene.
+
+ The class also deletes items from the scene and handles the
+ z-ordering, which decides the order in which items are drawn when
+ they overlap each other.
+
+ \section1 MainWindow Class Implementation
+
+
+ We start with a look at the constructor:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 0
+
+ In the constructor we call methods to create the widgets and
+ layouts of the example before we create the diagram scene.
+ The toolbars must be created after the scene as they connect
+ to its signals. We then lay the widgets out in the window.
+
+ We connect to the \c itemInserted() and \c textInserted() slots of
+ the diagram scenes as we want to uncheck the buttons in the tool
+ box when an item is inserted. When an item is selected in
+ the scene we receive the \c itemSelected() signal. We use this to
+ update the widgets that display font properties if the item
+ selected is a \c DiagramTextItem.
+
+ The \c createToolBox() function creates and lays out the widgets
+ of the \c toolBox QToolBox. We will not examine it with a
+ high level of detail as it does not deal with graphics framework
+ specific functionality. Here is its implementation:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 21
+
+ This part of the function sets up the tabbed widget item that
+ contains the flowchart shapes. An exclusive QButtonGroup always
+ keeps one button checked; we want the group to allow all buttons
+ to be unchecked.
+ We still use a button group since we can associate user
+ data, which we use to store the diagram type, with each button.
+ The \c createCellWidget() function sets up the buttons in the
+ tabbed widget item and is examined later.
+
+ The buttons of the background tabbed widget item is set up in the
+ same way, so we skip to the creation of the tool box:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 22
+
+ We set the preferred size of the toolbox as its maximum. This
+ way, more space is given to the graphics view.
+
+ Here is the \c createActions() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 23
+
+ We show an example of the creation of an action. The
+ functionality the actions trigger is discussed in the slots we
+ connect the actions to. You can see the \l{Application
+ Example}{application example} if you need a high-level
+ introduction to actions.
+
+ The is the \c createMenus() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 24
+
+ We create the three menus' of the example.
+
+ The \c createToolbars() function sets up the examples tool
+ bars. The three \l{QToolButton}s in the \c colorToolBar, the \c
+ fontColorToolButton, \c fillColorToolButton, and \c
+ lineColorToolButton, are interesting as we create icons for them
+ by drawing on a QPixmap with a QPainter. We show how the \c
+ fillColorToolButton is created. This button lets the user select a
+ color for the diagram items.
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 25
+ \dots
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 26
+
+ We set the menu of the tool button with
+ \l{QToolButton::}{setMenu()}. We need the \c fillAction QAction
+ object to always be pointing to the selected action of the menu.
+ The menu is created with the \c createColorMenu() function and, as
+ we shall see later, contains one menu item for each color that the
+ items can have. When the user presses the button, which trigger
+ the \l{QToolButton::}{clicked()} signal, we can set the color of
+ the selected item to the color of \c fillAction. It is with \c
+ createColorToolButtonIcon() we create the icon for the button.
+
+ \dots
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 27
+
+ Here is the \c createBackgroundCellWidget() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 28
+
+ This function creates \l{QWidget}s containing a tool button
+ and a label. The widgets created with this function are used for
+ the background tabbed widget item in the tool box.
+
+ Here is the \c createCellWidget() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 29
+
+ This function returns a QWidget containing a QToolButton with
+ an image of one of the \c DiagramItems, i.e., flowchart shapes.
+ The image is created by the \c DiagramItem through the \c image()
+ function. The QButtonGroup class lets us attach a QVariant with
+ each button; we store the diagram's type, i.e., the
+ DiagramItem::DiagramType enum. We use the stored diagram type when
+ we create new diagram items for the scene. The widgets created
+ with this function is used in the tool box.
+
+ Here is the \c createColorMenu() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 30
+
+ This function creates a color menu that is used as the
+ drop-down menu for the tool buttons in the \c colorToolBar. We
+ create an action for each color that we add to the menu. We fetch
+ the actions data when we set the color of items, lines, and text.
+
+ Here is the \c createColorToolButtonIcon() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 31
+
+ This function is used to create the QIcon of the \c
+ fillColorToolButton, \c fontColorToolButton, and \c
+ lineColorToolButton. The \a imageFile string is either the text,
+ flood-fill, or line symbol that is used for the buttons. Beneath
+ the image we draw a filled rectangle using \a color.
+
+ Here is the \c createColorIcon() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 32
+
+ This function creates an icon with a filled rectangle in the
+ color of \a color. It is used for creating icons for the color
+ menus in the \c fillColorToolButton, \c fontColorToolButton, and
+ \c lineColorToolButton.
+
+ Here is the \c backgroundButtonGroupClicked() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 1
+
+ In this function we set the QBrush that is used to draw the
+ background of the diagramscene. The background can be a grid of
+ squares of blue, gray, or white tiles, or no grid at all. We have
+ \l{QPixmap}s of the tiles from png files that we create the brush
+ with.
+
+ When one of the buttons in the background tabbed widget item is
+ clicked we change the brush; we find out which button it is by
+ checking its text.
+
+ Here is the implementation of \c buttonGroupClicked():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 2
+
+ This slot is called when a button in \c buttonGroup is checked.
+ When a button is checked the user can click on the graphics view
+ and a \c DiagramItem of the selected type will be inserted into
+ the \c DiagramScene. We must loop through the buttons in the group
+ to uncheck other buttons as only one button is allowed to be
+ checked at a time.
+
+ \c QButtonGroup assigns an id to each button. We have set the id
+ of each button to the diagram type, as given by DiagramItem::DiagramType
+ that will be inserted into the scene when it is clicked. We can
+ then use the button id when we set the diagram type with
+ \c setItemType(). In the case of text we assigned an id that has a
+ value that is not in the DiagramType enum.
+
+ Here is the implementation of \c deleteItem():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 3
+
+ This slot deletes the selected item, if any, from the scene. If
+ the item to be deleted is a \c DiagramItem, we also need to delete
+ arrows connected to it; we don't want arrows in the scene that
+ aren't connected to items in both ends.
+
+ This is the implementation of pointerGroupClicked():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 4
+
+ The \c pointerTypeGroup decides whether the scene is in ItemMove
+ or InsertLine mode. This button group is exclusive, i.e., only
+ one button is checked at any time. As with the \c buttonGroup above
+ we have assigned an id to the buttons that matches values of the
+ DiagramScene::Mode enum, so that we can use the id to set the
+ correct mode.
+
+ Here is the \c bringToFront() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 5
+
+ Several items may collide, i.e., overlap, with each other in
+ the scene. This slot is called when the user requests that an
+ item should be placed on top of the items it collides with.
+ \l{QGraphicsItem}{QGrapicsItems} have a z-value that decides the
+ order in which items are stacked in the scene; you can think of it
+ as the z-axis in a 3D coordinate system. When items collide the
+ items with higher z-values will be drawn on top of items with
+ lower values. When we bring an item to the front we can loop
+ through the items it collides with and set a z-value that is
+ higher than all of them.
+
+ Here is the \c sendToBack() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 6
+
+ This slot works in the same way as \c bringToFront() described
+ above, but sets a z-value that is lower than items the item that
+ should be send to the back collides with.
+
+ This is the implementation of \c itemInserted():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 7
+
+ This slot is called from the \c DiagramScene when an item has been
+ added to the scene. We set the mode of the scene back to the mode
+ before the item was inserted, which is ItemMove or InsertText
+ depending on which button is checked in the \c pointerTypeGroup.
+ We must also uncheck the button in the in the \c buttonGroup.
+
+ Here is the implementation of \c textInserted():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 8
+
+ We simply set the mode of the scene back to the mode it had before
+ the text was inserted.
+
+ Here is the \c currentFontChanged() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 9
+
+ When the user requests a font change, by using one of the
+ widgets in the \c fontToolBar, we create a new QFont object and
+ set its properties to match the state of the widgets. This is done
+ in \c handleFontChange(), so we simply call that slot.
+
+ Here is the \c fontSizeChanged() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 10
+
+ When the user requests a font change, by using one of the
+ widgets in the \c fontToolBar, we create a new QFont object and
+ set its properties to match the state of the widgets. This is done
+ in \c handleFontChange(), so we simply call that slot.
+
+ Here is the implementation of \c sceneScaleChanged():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 11
+
+ The user can increase or decrease the scale, with the \c
+ sceneScaleCombo, the scene is drawn in.
+ It is not the scene itself that changes its scale, but only the
+ view.
+
+ Here is the \c textColorChanged() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 12
+
+ This slot is called when an item in the drop-down menu of the \c
+ fontColorToolButton is pressed. We need to change the icon on
+ the button to the color of the selected QAction. We keep a pointer
+ to the selected action in \c textAction. It is in \c
+ textButtonTriggered() we change the text color to the color of \c
+ textAction, so we call that slot.
+
+ Here is the \c itemColorChanged() implementation:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 13
+
+ This slot handles requests for changing the color of \c
+ DiagramItems in the same manner as \c textColorChanged() does for
+ \c DiagramTextItems.
+
+ Here is the implementation of \c lineColorChanged():
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 14
+
+ This slot handles requests for changing the color of \c Arrows in
+ the same manner that \c textColorChanged() does it for \c
+ DiagramTextItems.
+
+ Here is the \c textButtonTriggered() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 15
+
+ \c textAction points to the QAction of the currently selected menu item
+ in the \c fontColorToolButton's color drop-down menu. We have set
+ the data of the action to the QColor the action represents, so we
+ can simply fetch this when we set the color of text with \c
+ setTextColor().
+
+ Here is the \c fillButtonTriggered() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 16
+
+ \c fillAction points to the selected menu item in the drop-down
+ menu of \c fillColorToolButton(). We can therefore use the data of
+ this action when we set the item color with \c setItemColor().
+
+ Here is the \c lineButtonTriggered() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 17
+
+ \c lineAction point to the selected item in the drop-down menu of
+ \c lineColorToolButton. We use its data when we set the arrow
+ color with \c setLineColor().
+
+ Here is the \c handleFontChange() function:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 18
+
+ \c handleFontChange() is called when any of the widgets that show
+ font properties changes. We create a new QFont object and set its
+ properties based on the widgets. We then call the \c setFont()
+ function of \c DiagramScene; it is the scene that set the font of
+ the \c DiagramTextItems it manages.
+
+ Here is the \c itemSelected() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 19
+
+ This slot is called when an item in the \c DiagramScene is
+ selected. In the case of this example it is only text items that
+ emit signals when they are selected, so we do not need to check
+ what kind of graphics \a item is.
+
+ We set the state of the widgets to match the properties of the
+ font of the selected text item.
+
+ This is the \c about() slot:
+
+ \snippet examples/graphicsview/diagramscene/mainwindow.cpp 20
+
+ This slot displays an about box for the example when the user
+ selects the about menu item from the help menu.
+
+ \section1 DiagramScene Class Definition
+
+ The \c DiagramScene class inherits QGraphicsScene and adds
+ functionality to handle \c DiagramItems, \c Arrows, and \c
+ DiagramTextItems in addition to the items handled by its super
+ class.
+
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.h 0
+
+ In the \c DiagramScene a mouse click can give three different
+ actions: the item under the mouse can be moved, an item may be
+ inserted, or an arrow may be connected between to diagram items.
+ Which action a mouse click has depends on the mode, given by the
+ Mode enum, the scene is in. The mode is set with the \c setMode()
+ function.
+
+ The scene also sets the color of its items and the font of its
+ text items. The colors and font used by the scene can be set with
+ the \c setLineColor(), \c setTextColor(), \c setItemColor() and \c
+ setFont() functions. The type of \c DiagramItem, given by the
+ DiagramItem::DiagramType function, to be created when an item is
+ inserted is set with the \c setItemType() slot.
+
+ The \c MainWindow and \c DiagramScene share responsibility for
+ the examples functionality. \c MainWindow handles the following
+ tasks: the deletion of items, text, and arrows; moving diagram
+ items to the back and front; and setting the scale of the scene.
+
+ \section1 DiagramScene Class Implementation
+
+
+ We start with the constructor:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 0
+
+ The scene uses \c myItemMenu to set the context menu when it
+ creates \c DiagramItems. We set the default mode to \c
+ DiagramScene::MoveItem as this gives the default behavior of
+ QGraphicsScene.
+
+ Here is the \c setLineColor() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 1
+
+ The \c isItemChange function returns true if an \c Arrow item is
+ selected in the scene in which case we want to change its color.
+ When the \c DiagramScene creates and adds new arrows to the scene
+ it will also use the new \a color.
+
+ Here is the \c setTextColor() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 2
+
+ This function sets the color of \c DiagramTextItems equal to the
+ way \c setLineColor() sets the color of \c Arrows.
+
+ Here is the \c setItemColor() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 3
+
+ This function sets the color the scene will use when creating
+ \c DiagramItems. It also changes the color of a selected \c
+ DiagramItem.
+
+ This is the implementation of \c setFont():
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 4
+
+ Set the font to use for new and selected, if a text item is
+ selected, \c DiagramTextItems.
+
+ This is the implementation of \c editorLostFocus() slot:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 5
+
+ \c DiagramTextItems emit a signal when they loose focus, which is
+ connected to this slot. We remove the item if it has no text.
+ If not, we would leak memory and confuse the user as the items
+ will be edited when pressed on by the mouse.
+
+ The \c mousePressEvent() function handles mouse press event's
+ different depending on which mode the \c DiagramScene is in. We
+ examine its implementation for each mode:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 6
+
+ We simply create a new \c DiagramItem and add it to the scene at
+ the position the mouse was pressed. Note that the origin of its
+ local coordinate system will be under the mouse pointer position.
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 7
+
+ The user adds \c Arrows to the scene by stretching a line between
+ the items the arrow should connect. The start of the line is fixed
+ in the place the user clicked the mouse and the end follows the
+ mouse pointer as long as the button is held down. When the user
+ releases the mouse button an \c Arrow will be added to the scene
+ if there is a \c DiagramItem under the start and end of the line.
+ We will see how this is implemented later; here we simply add the
+ line.
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 8
+
+ The \c DiagramTextItem is editable when the
+ Qt::TextEditorInteraction flag is set, else it is movable by the
+ mouse. We always want the text to be drawn on top of the other
+ items in the scene, so we set the value to a number higher
+ than other items in the scene.
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 9
+
+ We are in MoveItem mode if we get to the default switch; we
+ can then call the QGraphicsScene implementation, which
+ handles movement of items with the mouse. We make this call even
+ if we are in another mode making it possible to add an item and
+ then keep the mouse button pressed down and start moving
+ the item. In the case of text items, this is not possible as they
+ do not propagate mouse events when they are editable.
+
+ This is the \c mouseMoveEvent() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 10
+
+ We must draw the line if we are in InsertMode and the mouse button
+ is pressed down (the line is not 0). As discussed in \c
+ mousePressEvent() the line is drawn from the position the mouse
+ was pressed to the current position of the mouse.
+
+ If we are in MoveItem mode, we call the QGraphicsScene
+ implementation, which handles movement of items.
+
+ In the \c mouseReleaseEvent() function we need to check if an arrow
+ should be added to the scene:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 11
+
+ First we need to get the items (if any) under the line's start
+ and end points. The line itself is the first item at these points,
+ so we remove it from the lists. As a precaution, we check if the
+ lists are empty, but this should never happen.
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 12
+
+ Now we check if there are two different \c DiagramItems under
+ the lines start and end points. If there are we can create an \c
+ Arrow with the two items. The arrow is then added to each item and
+ finally the scene. The arrow must be updated to adjust its start
+ and end points to the items. We set the z-value of the arrow to
+ -1000.0 because we always want it to be drawn under the items.
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 13
+
+ Here is the \c isItemChange() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramscene.cpp 14
+
+ The scene has single selection, i.e., only one item can be
+ selected at any given time. The foreach will then loop one time
+ with the selected item or none if no item is selected. \c
+ isItemChange() is used to check whether a selected item exists
+ and also is of the specified diagram \a type.
+
+ \section1 DiagramItem Class Definition
+
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.h 0
+
+ The \c DiagramItem represents a flowchart shape in the \c
+ DiagramScene. It inherits QGraphicsPolygonItem and has a polygon
+ for each shape. The enum DiagramType has a value for each of the
+ flowchart shapes.
+
+ The class has a list of the arrows that are connected to it.
+ This is necessary because only the item knows when it is being
+ moved (with the \c itemChanged() function) at which time the
+ arrows must be updated. The item can also draw itself onto a
+ QPixmap with the \c image() function. This is used for the tool
+ buttons in \c MainWindow, see \c createColorToolButtonIcon() in
+ \c MainWindow.
+
+ The Type enum is a unique identifier of the class. It is used by
+ \c qgraphicsitem_cast(), which does dynamic casts of graphics
+ items. The UserType constant is the minimum value a custom
+ graphics item type can be.
+
+ \section1 DiagramItem Class Implementation
+
+
+ We start with a look at the constructor:
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 0
+
+ In the constructor we create the items polygon according to
+ \a diagramType. \l{QGraphicsItem}s are not movable or selectable
+ by default, so we must set these properties.
+
+ Here is the \c removeArrow() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 1
+
+ \c removeArrow() is used to remove \c Arrow items when they
+ or \c DiagramItems they are connected to are removed from the
+ scene.
+
+ Here is the \c removeArrows() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 2
+
+ This function is called when the item is removed from the scene
+ and removes all arrows that are connected to this item. The arrow
+ must be removed from the \c arrows list of both its start and end
+ item.
+
+ Here is the \c addArrow() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 3
+
+ This function simply adds the \a arrow to the items \c arrows list.
+
+ Here is the \c image() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 4
+
+ This function draws the polygon of the item onto a QPixmap. In
+ this example we use this to create icons for the tool buttons in
+ the tool box.
+
+ Here is the \c contextMenuEvent() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 5
+
+ We show the context menu. As right mouse clicks, which shows the
+ menu, don't select items by default we set the item selected with
+ \l{QGraphicsItem::}{setSelected()}. This is necessary since an
+ item must be selected to change its elevation with the
+ \c bringToFront and \c sendToBack actions.
+
+ This is the implementation of \c itemChange():
+
+ \snippet examples/graphicsview/diagramscene/diagramitem.cpp 6
+
+ If the item has moved, we need to update the positions of the
+ arrows connected to it. The implementation of QGraphicsItem does
+ nothing, so we just return \a value.
+
+ \section1 DiagramTextItem Class Definition
+
+ The \c TextDiagramItem class inherits QGraphicsTextItem and
+ adds the possibility to move editable text items. Editable
+ QGraphicsTextItems are designed to be fixed in place and editing
+ starts when the user single clicks on the item. With \c
+ DiagramTextItem the editing starts with a double click leaving
+ single click available to interact with and move it.
+
+ \snippet examples/graphicsview/diagramscene/diagramtextitem.h 0
+
+ We use \c itemChange() and \c focusOutEvent() to notify the
+ \c DiagramScene when the text item loses focus and gets selected.
+
+ Vi reimplement the functions that handle mouse events to make it
+ possible to alter the mouse behavior of QGraphicsTextItem.
+
+ \section1 DiagramTextItem Implementation
+
+ We start with the constructor:
+
+ \snippet examples/graphicsview/diagramscene/diagramtextitem.cpp 0
+
+ We simply set the item movable and selectable, as these flags are
+ off by default.
+
+ Here is the \c itemChange() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramtextitem.cpp 1
+
+ When the item is selected we emit the selectedChanged signal. The
+ \c MainWindow uses this signal to update the widgets that display
+ font properties to the font of the selected text item.
+
+ Here is the \c focusOutEvent() function:
+
+ \snippet examples/graphicsview/diagramscene/diagramtextitem.cpp 2
+
+ \c DiagramScene uses the signal emitted when the text item looses
+ remove the item if it is empty, i.e., it contains no text.
+
+ This is the implementation of \c mouseDoubleClickEvent():
+
+ \snippet examples/graphicsview/diagramscene/diagramtextitem.cpp 5
+
+ When we receive a double click event, we make the item editable by calling
+ QGraphicsTextItem::setTextInteractionFlags(). We then forward the
+ double-click to the item itself.
+
+ \section1 Arrow Class Definition
+
+ The \c Arrow class is a graphics item that connects two \c
+ DiagramItems. It draws an arrow head to one of the items. To
+ achieve this the item needs to paint itself and also re implement
+ methods used by the graphics scene to check for collisions and
+ selections. The class inherits QGraphicsLine item, and draws the
+ arrowhead and moves with the items it connects.
+
+ \snippet examples/graphicsview/diagramscene/arrow.h 0
+
+ The item's color can be set with \c setColor().
+
+ \c boundingRect() and \c shape() are reimplemented
+ from QGraphicsLineItem and are used by the scene
+ to check for collisions and selections.
+
+ Calling \c updatePosition() causes the arrow to recalculate its
+ position and arrow head angle. \c paint() is reimplemented so that
+ we can paint an arrow rather than just a line between items.
+
+ \c myStartItem and \c myEndItem are the diagram items that the
+ arrow connects. The arrow is drawn with its head to the end item.
+ \c arrowHead is a polygon with three vertices's we use to draw the
+ arrow head.
+
+ \section1 Arrow Class Implementation
+
+ The constructor of the \c Arrow class looks like this:
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 0
+
+ We set the start and end diagram items of the arrow. The arrow
+ head will be drawn where the line intersects the end item.
+
+ Here is the \c boundingRect() function:
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 1
+
+ We need to reimplement this function because the arrow is
+ larger than the bounding rectangle of the QGraphicsLineItem. The
+ graphics scene uses the bounding rectangle to know which regions
+ of the scene to update.
+
+ Here is the \c shape() function:
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 2
+
+ The shape function returns a QPainterPath that is the exact
+ shape of the item. The QGraphicsLineItem::shape() returns a path
+ with a line drawn with the current pen, so we only need to add
+ the arrow head. This function is used to check for collisions and
+ selections with the mouse.
+
+ Here is the \c updatePosition() slot:
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 3
+
+ This slot updates the arrow by setting the start and end
+ points of its line to the center of the items it connects.
+
+ Here is the \c paint() function:
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 4
+
+ If the start and end items collide we do not draw the arrow; the
+ algorithm we use to find the point the arrow should be drawn at
+ may fail if the items collide.
+
+ We first set the pen and brush we will use for drawing the arrow.
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 5
+
+ We then need to find the position at which to draw the
+ arrowhead. The head should be drawn where the line and the end
+ item intersects. This is done by taking the line between each
+ point in the polygon and check if it intersects with the line of
+ the arrow. Since the line start and end points are set to the
+ center of the items the arrow line should intersect one and only
+ one of the lines of the polygon. Note that the points in the
+ polygon are relative to the local coordinate system of the item.
+ We must therefore add the position of the end item to make the
+ coordinates relative to the scene.
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 6
+
+ We calculate the angle between the x-axis and the line of the
+ arrow. We need to turn the arrow head to this angle so that it
+ follows the direction of the arrow. If the angle is negative we
+ must turn the direction of the arrow.
+
+ We can then calculate the three points of the arrow head polygon.
+ One of the points is the end of the line, which now is the
+ intersection between the arrow line and the end polygon. Then we
+ clear the \c arrowHead polygon from the previous calculated arrow
+ head and set these new points.
+
+ \snippet examples/graphicsview/diagramscene/arrow.cpp 7
+
+ If the line is selected we draw to dotted lines that are
+ parallel with the line of the arrow. We do not use the default
+ implementation, which uses \l{QGraphicsItem::}{boundingRect()}
+ because the QRect bounding rectangle is considerably larger than
+ the line.
+*/
diff --git a/doc/src/examples/digitalclock.qdoc b/doc/src/examples/digitalclock.qdoc
new file mode 100644
index 0000000..0ff4642
--- /dev/null
+++ b/doc/src/examples/digitalclock.qdoc
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/digitalclock
+ \title Digital Clock Example
+
+ The Digital Clock example shows how to use QLCDNumber to display a
+ number with LCD-like digits.
+
+ \image digitalclock-example.png Screenshot of the Digital Clock example
+
+ This example also demonstrates how QTimer can be used to update a widget
+ at regular intervals.
+
+ \section1 DigitalClock Class Definition
+
+ The \c DigitalClock class provides a clock widget showing the time with
+ hours and minutes separated by a blinking colon. We subclass QLCDNumber
+ and implement a private slot called \c showTime() to update the clock
+ display:
+
+ \snippet examples/widgets/digitalclock/digitalclock.h 0
+
+ \section1 DigitalClock Class Implementation
+
+ \snippet examples/widgets/digitalclock/digitalclock.cpp 0
+
+ In the constructor, we first change the look of the LCD numbers. The
+ QLCDNumber::Filled style produces raised segments filled with the
+ foreground color (typically black). We also set up a one-second timer
+ to keep track of the current time, and we connect
+ its \l{QTimer::timeout()}{timeout()} signal to the private \c showTime() slot
+ so that the display is updated every second. Then, we
+ call the \c showTime() slot; without this call, there would be a one-second
+ delay at startup before the time is shown.
+
+ \snippet examples/widgets/digitalclock/digitalclock.cpp 1
+ \snippet examples/widgets/digitalclock/digitalclock.cpp 2
+
+ The \c showTime() slot is called whenever the clock display needs
+ to be updated.
+
+ The current time is converted into a string with the format "hh:mm".
+ When QTime::second() is a even number, the colon in the string is
+ replaced with a space. This makes the colon appear and vanish every
+ other second.
+
+ Finally, we call QLCDNumber::display() to update the widget.
+*/
diff --git a/doc/src/examples/dirview.qdoc b/doc/src/examples/dirview.qdoc
new file mode 100644
index 0000000..2cbfcfe
--- /dev/null
+++ b/doc/src/examples/dirview.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/dirview
+ \title Dir View Example
+
+ The Dir View example shows a tree view onto the local filing system. It uses the
+ QDirModel class to provide supply file and directory information.
+
+ \image dirview-example.png
+*/
diff --git a/doc/src/examples/dockwidgets.qdoc b/doc/src/examples/dockwidgets.qdoc
new file mode 100644
index 0000000..bc9f5f1
--- /dev/null
+++ b/doc/src/examples/dockwidgets.qdoc
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example mainwindows/dockwidgets
+ \title Dock Widgets Example
+
+ The Dock Widgets example shows how to add dock windows to an
+ application. It also shows how to use Qt's rich text engine.
+
+ \image dockwidgets-example.png Screenshot of the Dock Widgets example
+
+ The application presents a simple business letter template, and has
+ a list of customer names and addresses and a list of standard
+ phrases in two dock windows. The user can click a customer to have
+ their name and address inserted into the template, and click one or
+ more of the standard phrases. Errors can be corrected by clicking
+ the Undo button. Once the letter has been prepared it can be printed
+ or saved as HTML.
+
+ \section1 MainWindow Class Definition
+
+ Here's the class definition:
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.h 0
+
+ We will now review each function in turn.
+
+ \section1 MainWindow Class Implementation
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 0
+
+ We start by including \c <QtGui>, a header file that contains the
+ definition of all classes in the \l QtCore and \l QtGui
+ libraries. This saves us from having to include
+ every class individually and is especially convenient if we add new
+ widgets. We also include \c mainwindow.h.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 1
+
+ In the constructor, we start by creating a QTextEdit widget. Then we call
+ QMainWindow::setCentralWidget(). This function passes ownership of
+ the QTextEdit to the \c MainWindow and tells the \c MainWindow that
+ the QTextEdit will occupy the \c MainWindow's central area.
+
+ Then we call \c createActions(), \c createMenus(), \c
+ createToolBars(), \c createStatusBar(), and \c createDockWindows()
+ to set up the user interface. Finally we call \c setWindowTitle() to
+ give the application a title, and \c newLetter() to create a new
+ letter template.
+
+ We won't quote the \c createActions(), \c createMenus(), \c
+ createToolBars(), and \c createStatusBar() functions since they
+ follow the same pattern as all the other Qt examples.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 9
+
+ We create the customers dock window first, and in addition to a
+ window title, we also pass it a \c this pointer so that it becomes a
+ child of \c MainWindow. Normally we don't have to pass a parent
+ because widgets are parented automatically when they are laid out:
+ but dock windows aren't laid out using layouts.
+
+ We've chosen to restrict the customers dock window to the left and
+ right dock areas. (So the user cannot drag the dock window to the
+ top or bottom dock areas.) The user can drag the dock window out of
+ the dock areas entirely so that it becomes a free floating window.
+ We can change this (and whether the dock window is moveable or
+ closable) using QDockWidget::setFeatures().
+
+ Once we've created the dock window we create a list widget with the
+ dock window as parent, then we populate the list and make it the
+ dock window's widget. Finally we add the dock widget to the \c
+ MainWindow using \c addDockWidget(), choosing to put it in the right
+ dock area.
+
+ We undertake a similar process for the paragraphs dock window,
+ except that we don't restrict which dock areas it can be dragged to.
+
+ Finally we set up the signal-slot connections. If the user clicks a
+ customer or a paragraph their \c currentTextChanged() signal will be
+ emitted and we connect these to \c insertCustomer() and
+ addParagraph() passing the text that was clicked.
+
+ We briefly discuss the rest of the implementation, but have now
+ covered everything relating to dock windows.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 2
+
+ In this function we clear the QTextEdit so that it is empty. Next we
+ create a QTextCursor on the QTextEdit. We move the cursor to the
+ start of the document and create and format a frame. We then create
+ some character formats and a table format. We insert a table into
+ the document and insert the company's name and address into a table
+ using the table and character formats we created earlier. Then we
+ insert the skeleton of the letter including two markers \c NAME and
+ \c ADDRESS. We will also use the \c{Yours sincerely,} text as a marker.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 6
+
+ If the user clicks a customer we split the customer details into
+ pieces. We then look for the \c NAME marker using the \c find()
+ function. This function selects the text it finds, so when we call
+ \c insertText() with the customer's name the name replaces the marker.
+ We then look for the \c ADDRESS marker and replace it with each line
+ of the customer's address. Notice that we wrapped all the insertions
+ between a \c beginEditBlock() and \c endEditBlock() pair. This means
+ that the entire name and address insertion is treated as a single
+ operation by the QTextEdit, so a single undo will revert all the
+ insertions.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 7
+
+ This function works in a similar way to \c insertCustomer(). First
+ we look for the marker, in this case, \c {Yours sincerely,}, and then
+ replace it with the standard paragraph that the user clicked. Again
+ we use a \c beginEditBlock() ... \c endEditBlock() pair so that the
+ insertion can be undone as a single operation.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 3
+
+ Qt's QTextDocument class makes printing documents easy. We simply
+ take the QTextEdit's QTextDocument, set up the printer and print the
+ document.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 4
+
+ QTextEdit can output its contents in HTML format, so we prompt the
+ user for the name of an HTML file and if they provide one we simply
+ write the QTextEdit's contents in HTML format to the file.
+
+ \snippet examples/mainwindows/dockwidgets/mainwindow.cpp 5
+
+ If the focus is in the QTextEdit, pressing \key Ctrl+Z undoes as
+ expected. But for the user's convenience we provide an
+ application-wide undo function that simply calls the QTextEdit's
+ undo: this means that the user can undo regardless of where the
+ focus is in the application.
+*/
diff --git a/doc/src/examples/dombookmarks.qdoc b/doc/src/examples/dombookmarks.qdoc
new file mode 100644
index 0000000..f3944ef
--- /dev/null
+++ b/doc/src/examples/dombookmarks.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xml/dombookmarks
+ \title DOM Bookmarks Example
+
+ The DOM Bookmarks example provides a reader for XML Bookmark Exchange Language (XBEL)
+ files that uses Qt's DOM-based XML API to read and parse the files. The SAX Bookmarks
+ example provides an alternative way to read this type of file.
+
+ \image dombookmarks-example.png
+
+ See the \l{http://pyxml.sourceforge.net/topics/xbel/}{XML Bookmark Exchange Language
+ Resource Page} for more information about XBEL files.
+*/
diff --git a/doc/src/examples/draganddroppuzzle.qdoc b/doc/src/examples/draganddroppuzzle.qdoc
new file mode 100644
index 0000000..0e6ed09
--- /dev/null
+++ b/doc/src/examples/draganddroppuzzle.qdoc
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example draganddrop/puzzle
+ \title Drag and Drop Puzzle Example
+
+ The Drag and Drop Puzzle example demonstrates a way of using the drag and drop system with
+ item view widgets.
+
+ \image draganddroppuzzle-example.png
+
+ This example is an implementation of a simple jigsaw puzzle game using Qt's
+ drag and drop API.
+ The \l{Item Views Puzzle Example}{Item View Puzzle} example shows
+ many of the same features, but takes an alternative approach that uses Qt's
+ model/view framework to manage drag and drop operations.
+*/
diff --git a/doc/src/examples/dragdroprobot.qdoc b/doc/src/examples/dragdroprobot.qdoc
new file mode 100644
index 0000000..d3f97b0
--- /dev/null
+++ b/doc/src/examples/dragdroprobot.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/dragdroprobot
+ \title Drag and Drop Robot Example
+
+ This GraphicsView example shows how to implement drag and drop in
+ a QGraphicsItem subclass, as well as how to animate items using
+ QGraphicsItemAnimation and QTimeLine.
+
+ \image dragdroprobot-example.png
+*/
diff --git a/doc/src/examples/draggableicons.qdoc b/doc/src/examples/draggableicons.qdoc
new file mode 100644
index 0000000..23150f9
--- /dev/null
+++ b/doc/src/examples/draggableicons.qdoc
@@ -0,0 +1,104 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example draganddrop/draggableicons
+ \title Draggable Icons Example
+
+ The Draggable Icons example shows how to drag and drop image data between widgets
+ in the same application, and between different applications.
+
+ \image draggableicons-example.png
+
+ In many situations where drag and drop is used, the user starts dragging from
+ a particular widget and drops the payload onto another widget. In this example,
+ we subclass QLabel to create labels that we use as drag sources, and place them
+ inside \l{QWidget}s that serve as both containers and drop sites.
+
+ In addition, when a drag and drop operation occurs, we want to send more than
+ just an image. We also want to send information about where the user clicked in
+ the image so that the user can place it precisely on the drop target. This level
+ of detail means that we must create a custom MIME type for our data.
+
+ \section1 DragWidget Class Definition
+
+ The icon widgets that we use to display icons are subclassed from QLabel:
+
+ \snippet examples/draganddrop/draggableicons/dragwidget.h 0
+
+ Since the QLabel class provides most of what we require for the icon, we
+ only need to reimplement the \l QWidget::mousePressEvent() to provide
+ drag and drop facilities.
+
+ \section1 DragWidget Class Implementation
+
+ The \c DragWidget constructor sets an attribute on the widget that ensures
+ that it will be deleted when it is closed:
+
+ \snippet examples/draganddrop/draggableicons/dragwidget.cpp 0
+
+ To enable dragging from the icon, we need to act on a mouse press event.
+ We do this by reimplementing \l QWidget::mousePressEvent() and setting up
+ a QDrag object.
+
+ \snippet examples/draganddrop/draggableicons/dragwidget.cpp 1
+
+ Since we will be sending pixmap data for the icon and information about the
+ user's click in the icon widget, we construct a QByteArray and package up the
+ details using a QDataStream.
+
+ For interoperability, drag and drop operations describe the data they contain
+ using MIME types. In Qt, we describe this data using a QMimeData object:
+
+ \snippet examples/draganddrop/draggableicons/dragwidget.cpp 2
+
+ We choose an unofficial MIME type for this purpose, and supply the QByteArray
+ to the MIME data object.
+
+ The drag and drop operation itself is handled by a QDrag object:
+
+ \snippet examples/draganddrop/draggableicons/dragwidget.cpp 3
+
+ Here, we pass the data to the drag object, set a pixmap that will be shown
+ alongside the cursor during the operation, and define the position of a hot
+ spot that places the position of this pixmap under the cursor.
+
+*/
diff --git a/doc/src/examples/draggabletext.qdoc b/doc/src/examples/draggabletext.qdoc
new file mode 100644
index 0000000..4d3d89d
--- /dev/null
+++ b/doc/src/examples/draggabletext.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example draganddrop/draggabletext
+ \title Draggable Text Example
+
+ The Draggable Text example shows how to drag and drop textual data between widgets
+ in the same application, and between different applications.
+
+ \image draggabletext-example.png
+*/
diff --git a/doc/src/examples/drilldown.qdoc b/doc/src/examples/drilldown.qdoc
new file mode 100644
index 0000000..344b9e7
--- /dev/null
+++ b/doc/src/examples/drilldown.qdoc
@@ -0,0 +1,552 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/drilldown
+ \title Drill Down Example
+
+ The Drill Down example shows how to read data from a database as
+ well as submit changes, using the QSqlRelationalTableModel and
+ QDataWidgetMapper classes.
+
+ \image drilldown-example.png Screenshot of the Drill Down Example
+
+ When running the example application, a user can retrieve
+ information about each of Nokia's Qt Software offices by clicking the
+ corresponding image. The application pops up an information window
+ displaying the data, and allows the users to alter the location
+ description as well as the image. The main view will be updated
+ when the users submit their changes.
+
+ The example consists of three classes:
+
+ \list
+ \o \c ImageItem is a custom graphics item class used to
+ display the office images.
+
+ \o \c View is the main application widget allowing the user to
+ browse through the various locations.
+
+ \o \c InformationWindow displays the requested information,
+ allowing the users to alter it and submit their changes to the
+ database.
+ \endlist
+
+ We will first take a look at the \c InformationWindow class to see
+ how you can read and modify data from a database. Then we will
+ review the main application widget, i.e., the \c View class, and
+ the associated \c ImageItem class.
+
+ \section1 InformationWindow Class Definition
+
+ The \c InformationWindow class is a custom widget inheriting
+ QWidget:
+
+ \snippet examples/sql/drilldown/informationwindow.h 0
+
+ When we create an information window, we pass the associated
+ location ID, a parent, and a pointer to the database, to the
+ constructor. We will use the database pointer to populate our
+ window with data, while passing the parent parameter on to the
+ base class. The ID is stored for future reference.
+
+ Once a window is created, we will use the public \c id() function
+ to locate it whenever information for the given location is
+ requested. We will also use the ID to update the main application
+ widget when the users submit their changes to the database, i.e.,
+ we will emit a signal carrying the ID and file name as parameters
+ whenever the users changes the associated image.
+
+ \snippet examples/sql/drilldown/informationwindow.h 1
+
+ Since we allow the users to alter some of the location data, we
+ must provide functionality for reverting and submitting their
+ changes. The \c enableButtons() slot is provided for convenience
+ to enable and disable the various buttons when required.
+
+ \snippet examples/sql/drilldown/informationwindow.h 2
+
+ The \c createButtons() function is also a convenience function,
+ provided to simplify the constructor. As mentioned above we store
+ the location ID for future reference. We also store the name of
+ the currently displayed image file to be able to determine when to
+ emit the \c imageChanged() signal.
+
+ The information window uses the QLabel class to display the office
+ location and the country. The associated image file is displayed
+ using a QComboBox instance while the description is displayed using
+ QTextEdit. In addition, the window has three buttons to control
+ the data flow and whether the window is shown or not.
+
+ Finally, we declare a \e mapper. The QDataWidgetMapper class
+ provides mapping between a section of a data model to widgets. We
+ will use the mapper to extract data from the given database,
+ updating the database whenever the user modifies the data.
+
+ \section1 InformationWindow Class Implementation
+
+ The constructor takes three arguments: a location ID, a database
+ pointer and a parent widget. The database pointer is actually a
+ pointer to a QSqlRelationalTableModel object providing an editable
+ data model (with foreign key support) for our database table.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 0
+ \snippet examples/sql/drilldown/informationwindow.cpp 1
+
+ First we create the various widgets required to display the data
+ contained in the database. Most of the widgets are created in a
+ straight forward manner. But note the combobox displaying the
+ name of the image file:
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 2
+
+ In this example, the information about the offices are stored in a
+ database table called "offices". When creating the model,
+ we will use a foreign key to establish a relation between this
+ table and a second data base table, "images", containing the names
+ of the available image files. We will get back to how this is done
+ when reviewing the \c View class. The rationale for creating such
+ a relation though, is that we want to ensure that the user only
+ can choose between predefined image files.
+
+ The model corresponding to the "images" database table, is
+ available through the QSqlRelationalTableModel's \l
+ {QSqlRelationalTableModel::}{relationModel()} function, requiring
+ the foreign key (in this case the "imagefile" column number) as
+ argument. We use QComboBox's \l {QComboBox::}{setModel()} function
+ to make the combobox use the "images" model. And, since this model
+ has two columns ("locationid" and "file"), we also specify which
+ column we want to be visible using the QComboBox::setModelColumn()
+ function.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 3
+
+ Then we create the mapper. The QDataWidgetMapper class allows us
+ to create data-aware widgets by mapping them to sections of an
+ item model.
+
+ The \l {QDataWidgetMapper::}{addMapping()} function adds a mapping
+ between the given widget and the specified section of the
+ model. If the mapper's orientation is horizontal (the default) the
+ section is a column in the model, otherwise it is a row. We call
+ the \l {QDataWidgetMapper::}{setCurrentIndex()} function to
+ initialize the widgets with the data associated with the given
+ location ID. Every time the current index changes, all the widgets
+ are updated with the contents from the model.
+
+ We also set the mapper's submit policy to
+ QDataWidgetMapper::ManualSubmit. This means that no data is
+ submitted to the database until the user expliclity requests a
+ submit (the alternative is QDataWidgetMapper::AutoSubmit,
+ automatically submitting changes when the corresponding widget
+ looses focus). Finally, we specify the item delegate the mapper
+ view should use for its items. The QSqlRelationalDelegate class
+ represents a delegate that unlike the default delegate, enables
+ combobox functionality for fields that are foreign keys into other
+ tables (like "imagefile" in our "trolltechoffices" table).
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 4
+
+ Finally, we connect the "something's changed" signals in the
+ editors to our custom \c enableButtons() slot, enabling the users
+ to either submit or revert their changes. We add all the widgets
+ into a layout, store the location ID and the name of the displayed
+ image file for future reference, and set the window title and
+ initial size.
+
+ Note that we also set the Qt::Window window flag to indicate that
+ our widget is in fact a window, with a window system frame and a
+ title bar.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 5
+
+ When a window is created, it is not deleted until the main
+ application exits (i.e., if the user closes the information
+ window, it is only hidden). For this reason we do not want to
+ create more than one \c InformationWindow object for each
+ location, and we provide the public \c id() function to be able to
+ determine whether a window already exists for a given location
+ when the user requests information about it.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 6
+
+ The \c revert() slot is triggered whenever the user hits the \gui
+ Revert button.
+
+ Since we set the QDataWidgetMapper::ManualSubmit submit policy,
+ none of the user's changes are written back to the model unless
+ the user expliclity choose to submit all of them. Nevertheless, we
+ can use the QDataWidgetMapper's \l {QDataWidgetMapper::}{revert()}
+ slot to reset the editor widgets, repopulating all widgets with
+ the current data of the model.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 7
+
+ Likewise, the \c submit() slot is triggered whenever the users
+ decide to submit their changes by pressing the \gui Submit button.
+
+ We use QDataWidgetMapper's \l {QDataWidgetMapper::}{submit()} slot
+ to submit all changes from the mapped widgets to the model,
+ i.e. to the database. For every mapped section, the item delegate
+ will then read the current value from the widget and set it in the
+ model. Finally, the \e model's \l {QAbstractItemModel::}{submit()}
+ function is invoked to let the model know that it should submit
+ whatever it has cached to the permanent storage.
+
+ Note that before any data is submitted, we check if the user has
+ chosen another image file using the previously stored \c
+ displayedImage variable as reference. If the current and stored
+ file names differ, we store the new file name and emit the \c
+ imageChanged() signal.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 8
+
+ The \c createButtons() function is provided for convenience, i.e.,
+ to simplify the constructor.
+
+ We make the \gui Close button the default button, i.e., the button
+ that is pressed when the user presses \gui Enter, and connect its
+ \l {QPushButton::}{clicked()} signal to the widget's \l
+ {QWidget::}{close()} slot. As mentioned above closing the window
+ only hides the widget; it is not deleted. We also connect the \gui
+ Submit and \gui Revert buttons to the corresponding \c submit()
+ and \c revert() slots.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 9
+
+ The QDialogButtonBox class is a widget that presents buttons in a
+ layout that is appropriate to the current widget style. Dialogs
+ like our information window, typically present buttons in a layout
+ that conforms to the interface guidelines for that
+ platform. Invariably, different platforms have different layouts
+ for their dialogs. QDialogButtonBox allows us to add buttons,
+ automatically using the appropriate layout for the user's desktop
+ environment.
+
+ Most buttons for a dialog follow certain roles. We give the \gui
+ Submit and \gui Revert buttons the \l
+ {QDialogButtonBox::ButtonRole}{reset} role, i.e., indicating that
+ pressing the button resets the fields to the default values (in
+ our case the information contained in the database). The \l
+ {QDialogButtonBox::ButtonRole}{reject} role indicates that
+ clicking the button causes the dialog to be rejected. On the other
+ hand, since we only hide the information window, any changes that
+ the user has made wil be preserved until the user expliclity
+ revert or submit them.
+
+ \snippet examples/sql/drilldown/informationwindow.cpp 10
+
+ The \c enableButtons() slot is called to enable the buttons
+ whenever the user changes the presented data. Likewise, when the
+ data the user choose to submit the changes, the buttons are
+ disabled to indicate that the current data is stored in the
+ database.
+
+ This completes the \c InformationWindow class. Let's take a look
+ at how we have used it in our example application.
+
+ \section1 View Class Definition
+
+ The \c View class represents the main application window and
+ inherits QGraphicsView:
+
+ \snippet examples/sql/drilldown/view.h 0
+ \codeline
+ \snippet examples/sql/drilldown/view.h 1
+
+ The QGraphicsView class is part of the \l {The Graphics View
+ Framework} which we will use to display the images of Nokia's
+ Qt Software offices. To be able to respond to user interaction;
+ i.e., showing the
+ appropriate information window whenever the user clicks one of the
+ office images, we reimplement QGraphicsView's \l
+ {QGraphicsView::}{mouseReleaseEvent()} function.
+
+ Note that the constructor expects the names of two database
+ tables: One containing the detailed information about the offices,
+ and another containing the names of the available image files. We
+ also provide a private \c updateImage() slot to catch \c
+ {InformationWindow}'s \c imageChanged() signal that is emitted
+ whenever the user changes a location's image.
+
+ \snippet examples/sql/drilldown/view.h 2
+
+ The \c addItems() function is a convenience function provided to
+ simplify the constructor. It is called only once, creating the
+ various items and adding them to the view.
+
+ The \c findWindow() function, on the other hand, is frequently
+ used. It is called from the \c showInformation() function to
+ detemine whether a window is already created for the given
+ location (whenever we create an \c InformationWindow object, we
+ store a reference to it in the \c informationWindows list). The
+ latter function is in turn called from our custom \c
+ mouseReleaseEvent() implementation.
+
+ \snippet examples/sql/drilldown/view.h 3
+
+ Finally we declare a QSqlRelationalTableModel pointer. As
+ previously mentioned, the QSqlRelationalTableModel class provides
+ an editable data model with foreign key support. There are a
+ couple of things you should keep in mind when using the
+ QSqlRelationalTableModel class: The table must have a primary key
+ declared and this key cannot contain a relation to another table,
+ i.e., it cannot be a foreign key. Note also that if a relational
+ table contains keys that refer to non-existent rows in the
+ referenced table, the rows containing the invalid keys will not be
+ exposed through the model. It is the user's or the database's
+ responsibility to maintain referential integrity.
+
+ \section1 View Class Implementation
+
+ Although the constructor requests the names of both the table
+ containing office details as well as the table containing the
+ names of the available image files, we only have to create a
+ QSqlRelationalTableModel object for the office table:
+
+ \snippet examples/sql/drilldown/view.cpp 0
+
+ The reason is that once we have a model with the office details,
+ we can create a relation to the available image files using
+ QSqlRelationalTableModel's \l
+ {QSqlRelationalTableModel::}{setRelation()} function. This
+ function creates a foreign key for the given model column. The key
+ is specified by the provided QSqlRelation object constructed by
+ the name of the table the key refers to, the field the key is
+ mapping to and the field that should be presented to the user.
+
+ Note that setting the table only specifies which table the model
+ operates on, i.e., we must explicitly call the model's \l
+ {QSqlRelationalTableModel::}{select()} function to populate our
+ model.
+
+ \snippet examples/sql/drilldown/view.cpp 1
+
+ Then we create the contents of our view, i.e., the scene and its
+ items. The location labels are regular QGraphicsTextItem objects,
+ and the "Qt" logo is represented by a QGraphicsPixmapItem
+ object. The images, on the other hand, are instances of the \c
+ ImageItem class (derived from QGraphicsPixmapItem). We will get
+ back to this shortly when reviewing the \c addItems() function.
+
+ Finally, we set the main application widget's size constraints and
+ window title.
+
+ \snippet examples/sql/drilldown/view.cpp 3
+
+ The \c addItems() function is called only once, i.e., when
+ creating the main application window. For each row in the database
+ table, we first extract the corresponding record using the model's
+ \l {QSqlRelationalTableModel::}{record()} function. The QSqlRecord
+ class encapsulates both the functionality and characteristics of a
+ database record, and supports adding and removing fields as well
+ as setting and retrieving field values. The QSqlRecord::value()
+ function returns the value of the field with the given name or
+ index as a QVariant object.
+
+ For each record, we create a label item as well as an image item,
+ calculate their position and add them to the scene. The image
+ items are represented by instances of the \c ImageItem class. The
+ reason we must create a custom item class is that we want to catch
+ the item's hover events, animating the item when the mouse cursor
+ is hovering over the image (by default, no items accept hover
+ events). Please see the \l{The Graphics View Framework}
+ documentation and the
+ \l{Qt Examples#Graphics View}{Graphics View examples} for more
+ details.
+
+ \snippet examples/sql/drilldown/view.cpp 5
+
+ We reimplement QGraphicsView's \l
+ {QGraphicsView::}{mouseReleaseEvent()} event handler to respond to
+ user interaction. If the user clicks any of the image items, this
+ function calls the private \c showInformation() function to pop up
+ the associated information window.
+
+ \l {The Graphics View Framework} provides the qgraphicsitem_cast()
+ function to determine whether the given QGraphicsItem instance is
+ of a given type. Note that if the event is not related to any of
+ our image items, we pass it on to the base class implementation.
+
+ \snippet examples/sql/drilldown/view.cpp 6
+
+ The \c showInformation() function is given an \c ImageItem object
+ as argument, and starts off by extracting the item's location
+ ID. Then it determines if there already is created an information
+ window for this location. If it is, and the window is visible, it
+ ensures that the window is raised to the top of the widget stack
+ and activated. If the window exists but is hidden, calling its \l
+ {QWidget::}{show()} slot gives the same result.
+
+ If no window for the given location exists, we create one by
+ passing the location ID, a pointer to the model, and our view as a
+ parent, to the \c InformationWindow constructor. Note that we
+ connect the information window's \c imageChanged() signal to \e
+ this widget's \c updateImage() slot, before we give it a suitable
+ position and add it to the list of existing windows.
+
+ \snippet examples/sql/drilldown/view.cpp 7
+
+ The \c updateImage() slot takes a location ID and the name of an
+ image files as arguments. It filters out the image items, and
+ updates the one that correspond to the given location ID, with the
+ provided image file.
+
+ \snippet examples/sql/drilldown/view.cpp 8
+
+ The \c findWindow() function simply searches through the list of
+ existing windows, returning a pointer to the window that matches
+ the given location ID, or 0 if the window doesn't exists.
+
+ Finally, let's take a quick look at our custom \c ImageItem class:
+
+ \section1 ImageItem Class Definition
+
+ The \c ImageItem class is provided to facilitate animation of the
+ image items. It inherits QGraphicsPixmapItem and reimplements its
+ hover event handlers:
+
+ \snippet examples/sql/drilldown/imageitem.h 0
+
+ In addition, we implement a public \c id() function to be able to
+ identify the associated location and a public \c adjust() function
+ that can be called to ensure that the image item is given the
+ preferred size regardless of the original image file.
+
+ The animation is implemented using the QTimeLine class together
+ with the event handlers and the private \c setFrame() slot: The
+ image item will expand when the mouse cursor hovers over it,
+ returning back to its orignal size when the cursor leaves its
+ borders.
+
+ Finally, we store the location ID that this particular record is
+ associated with as well as a z-value. In the \l {The Graphics View
+ Framework}, an item's z-value determines its position in the item
+ stack. An item of high Z-value will be drawn on top of an item
+ with a lower z-value if they share the same parent item. We also
+ provide an \c updateItemPosition() function to refresh the view
+ when required.
+
+ \section1 ImageItem Class Implementation
+
+ The \c ImageItem class is really only a QGraphicsPixmapItem with
+ some additional features, i.e., we can pass most of the
+ constructor's arguments (the pixmap, parent and scene) on to the
+ base class constructor:
+
+ \snippet examples/sql/drilldown/imageitem.cpp 0
+
+ Then we store the ID for future reference, and ensure that our
+ item will accept hover events. Hover events are delivered when
+ there is no current mouse grabber item. They are sent when the
+ mouse cursor enters an item, when it moves around inside the item,
+ and when the cursor leaves an item. As we mentioned earlier, none
+ of the \l {The Graphics View Framework}'s items accept hover
+ event's by default.
+
+ The QTimeLine class provides a timeline for controlling
+ animations. Its \l {QTimeLine::}{duration} property holds the
+ total duration of the timeline in milliseconds. By default, the
+ time line runs once from the beginning and towards the end. The
+ QTimeLine::setFrameRange() function sets the timeline's frame
+ counter; when the timeline is running, the \l
+ {QTimeLine::}{frameChanged()} signal is emitted each time the
+ frame changes. We set the duration and frame range for our
+ animation, and connect the time line's \l
+ {QTimeLine::}{frameChanged()} and \l {QTimeLine::}{finished()}
+ signals to our private \c setFrame() and \c updateItemPosition()
+ slots.
+
+ Finally, we call \c adjust() to ensure that the item is given the
+ preferred size.
+
+ \snippet examples/sql/drilldown/imageitem.cpp 1
+ \codeline
+ \snippet examples/sql/drilldown/imageitem.cpp 2
+
+ Whenever the mouse cursor enters or leave the image item, the
+ corresponding event handlers are triggered: We first set the time
+ line's direction, making the item expand or shrink,
+ respectively. Then we alter the item's z-value if it is not already
+ set to the expected value.
+
+ In the case of hover \e enter events, we immediately update the
+ item's position since we want the item to appear on top of all
+ other items as soon as it starts expanding. In the case of hover
+ \e leave events, on the other hand, we postpone the actual update
+ to achieve the same result. But remember that when we constructed
+ our item, we connected the time line's \l
+ {QTimeLine::}{finished()} signal to the \c updateItemPosition()
+ slot. In this way the item is given the correct position in the
+ item stack once the animation is completed. Finally, if the time
+ line is not already running, we start it.
+
+ \snippet examples/sql/drilldown/imageitem.cpp 3
+
+ When the time line is running, it triggers the \c setFrame() slot
+ whenever the current frame changes due to the connection we
+ created in the item constructor. It is this slot that controls the
+ animation, expanding or shrinking the image item step by step.
+
+ We first call the \c adjust() function to ensure that we start off
+ with the item's original size. Then we scale the item with a
+ factor depending on the animation's progress (using the \c frame
+ parameter). Note that by default, the transformation will be
+ relative to the item's top-left corner. Since we want the item to
+ be transformed relative to its center, we must translate the
+ coordinate system before we scale the item.
+
+ In the end, only the following convenience functions remain:
+
+ \snippet examples/sql/drilldown/imageitem.cpp 4
+ \codeline
+ \snippet examples/sql/drilldown/imageitem.cpp 5
+ \codeline
+ \snippet examples/sql/drilldown/imageitem.cpp 6
+
+ The \c adjust() function defines and applies a transformation
+ matrix, ensuring that our image item appears with the preferred
+ size regardless of the size of the source image. The \c id()
+ function is trivial, and is simply provided to be able to identify
+ the item. In the \c updateItemPosition() slot we call the
+ QGraphicsItem::setZValue() function, setting the elevation (i.e.,
+ the position) of the item.
+*/
diff --git a/doc/src/examples/dropsite.qdoc b/doc/src/examples/dropsite.qdoc
new file mode 100644
index 0000000..4780b82
--- /dev/null
+++ b/doc/src/examples/dropsite.qdoc
@@ -0,0 +1,263 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example draganddrop/dropsite
+ \title Drop Site Example
+
+ The example shows how to distinguish the various MIME formats available
+ in a drag and drop operation.
+
+ \image dropsite-example.png Screenshot of the Drop Site example
+
+ The Drop Site example accepts drops from other applications, and displays
+ the MIME formats provided by the drag object.
+
+ There are two classes, \c DropArea and \c DropSiteWindow, and a \c main()
+ function in this example. A \c DropArea object is instantiated in
+ \c DropSiteWindow; a \c DropSiteWindow object is then invoked in the
+ \c main() function.
+
+ \section1 DropArea Class Definition
+
+ The \c DropArea class is a subclass of QLabel with a public slot,
+ \c clear(), and a \c changed() signal.
+
+ \snippet draganddrop/dropsite/droparea.h DropArea header part1
+
+ In addition, \c DropArea also contains a private instance of QLabel and
+ reimplementations of four \l{QWidget} event handlers:
+
+ \list 1
+ \o \l{QWidget::dragEnterEvent()}{dragEnterEvent()}
+ \o \l{QWidget::dragMoveEvent()}{dragMoveEvent()}
+ \o \l{QWidget::dragLeaveEvent()}{dragLeaveEvent()}
+ \o \l{QWidget::dropEvent()}{dropEvent()}
+ \endlist
+
+ These event handlers are further explained in the implementation of the
+ \c DropArea class.
+
+ \snippet draganddrop/dropsite/droparea.h DropArea header part2
+
+ \section1 DropArea Class Implementation
+
+ In the \c DropArea constructor, we set the \l{QWidget::setMinimumSize()}
+ {minimum size} to 200x200 pixels, the \l{QFrame::setFrameStyle()}
+ {frame style} to both QFrame::Sunken and QFrame::StyledPanel, and we align
+ its contents to the center.
+
+ \snippet draganddrop/dropsite/droparea.cpp DropArea constructor
+
+ Also, we enable drop events in \c DropArea by setting the
+ \l{QWidget::acceptDrops()}{acceptDrops} property to \c true. Then,
+ we enable the \l{QWidget::autoFillBackground()}{autoFillBackground}
+ property and invoke the \c clear() function.
+
+ The \l{QWidget::dragEnterEvent()}{dragEnterEvent()} event handler is
+ called when a drag is in progress and the mouse enters the \c DropArea
+ object. For the \c DropSite example, when the mouse enters \c DropArea,
+ we set its text to "<drop content>" and highlight its background.
+
+ \snippet draganddrop/dropsite/droparea.cpp dragEnterEvent() function
+
+ Then, we invoke \l{QDropEvent::acceptProposedAction()}
+ {acceptProposedAction()} on \a event, setting the drop action to the one
+ proposed. Lastly, we emit the \c changed() signal, with the data that was
+ dropped and its MIME type information as a parameter.
+
+ For \l{QWidget::dragMoveEvent()}{dragMoveEvent()}, we just accept the
+ proposed QDragMoveEvent object, \a event, with
+ \l{QDropEvent::acceptProposedAction()}{acceptProposedAction()}.
+
+ \snippet draganddrop/dropsite/droparea.cpp dragMoveEvent() function
+
+ The \c DropArea class's implementation of \l{QWidget::dropEvent()}
+ {dropEvent()} extracts the \a{event}'s mime data and displays it
+ accordingly.
+
+ \snippet draganddrop/dropsite/droparea.cpp dropEvent() function part1
+
+ The \c mimeData object can contain one of the following objects: an image,
+ HTML text, plain text, or a list of URLs.
+
+ \snippet draganddrop/dropsite/droparea.cpp dropEvent() function part2
+
+ \list
+ \o If \c mimeData contains an image, we display it in \c DropArea with
+ \l{QLabel::setPixmap()}{setPixmap()}.
+ \o If \c mimeData contains HTML, we display it with
+ \l{QLabel::setText()}{setText()} and set \c{DropArea}'s text format
+ as Qt::RichText.
+ \o If \c mimeData contains plain text, we display it with
+ \l{QLabel::setText()}{setText()} and set \c{DropArea}'s text format
+ as Qt::PlainText. In the event that \c mimeData contains URLs, we
+ iterate through the list of URLs to display them on individual
+ lines.
+ \o If \c mimeData contains other types of objects, we set
+ \c{DropArea}'s text, with \l{QLabel::setText()}{setText()} to
+ "Cannot display data" to inform the user.
+ \endlist
+
+ We then set \c{DropArea}'s \l{QWidget::backgroundRole()}{backgroundRole} to
+ QPalette::Dark and we accept \c{event}'s proposed action.
+
+ \snippet draganddrop/dropsite/droparea.cpp dropEvent() function part3
+
+ The \l{QWidget::dragLeaveEvent()}{dragLeaveEvent()} event handler is
+ called when a drag is in progress and the mouse leaves the widget.
+
+ \snippet draganddrop/dropsite/droparea.cpp dragLeaveEvent() function
+
+ For \c{DropArea}'s implementation, we clear invoke \c clear() and then
+ accept the proposed event.
+
+ The \c clear() function sets the text in \c DropArea to "<drop content>"
+ and sets the \l{QWidget::backgroundRole()}{backgroundRole} to
+ QPalette::Dark. Lastly, it emits the \c changed() signal.
+
+ \snippet draganddrop/dropsite/droparea.cpp clear() function
+
+ \section1 DropSiteWindow Class Definition
+
+ The \c DropSiteWindow class contains a constructor and a public slot,
+ \c updateFormatsTable().
+
+ \snippet draganddrop/dropsite/dropsitewindow.h DropSiteWindow header
+
+ The class also contains a private instance of \c DropArea, \c dropArea,
+ QLabel, \c abstractLabel, QTableWidget, \c formatsTable, QDialogButtonBox,
+ \c buttonBox, and two QPushButton objects, \c clearButton and
+ \c quitButton.
+
+ \section1 DropSiteWindow Class Implementation
+
+ In the constructor of \c DropSiteWindow, we instantiate \c abstractLabel
+ and set its \l{QLabel::setWordWrap()}{wordWrap} property to \c true. We
+ also call the \l{QLabel::adjustSize()}{adjustSize()} function to adjust
+ \c{abstractLabel}'s size according to its contents.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp constructor part1
+
+ Then we instantiate \c dropArea and connect its \c changed() signal to
+ \c{DropSiteWindow}'s \c updateFormatsTable() slot.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp constructor part2
+
+ We now set up the QTableWidget object, \c formatsTable. Its
+ horizontal header is set using a QStringList object, \c labels. The number
+ of columms are set to two and the table is not editable. Also, the
+ \c{formatTable}'s horizontal header is formatted to ensure that its second
+ column stretches to occupy additional space available.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp constructor part3
+
+ Two QPushButton objects, \c clearButton and \c quitButton, are instantiated
+ and added to \c buttonBox - a QDialogButtonBox object. We use
+ QDialogButtonBox here to ensure that the push buttons are presented in a
+ layout that conforms to the platform's style.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp constructor part4
+
+ The \l{QPushButton::clicked()}{clicked()} signals for \c quitButton and
+ \c clearButton are connected to \l{QWidget::close()}{close()} and
+ \c clear(), respectively.
+
+ For the layout, we use a QVBoxLayout, \c mainLayout, to arrange our widgets
+ vertically. We also set the window title to "Drop Site" and the minimum
+ size to 350x500 pixels.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp constructor part5
+
+ We move on to the \c updateFormatsTable() function. This function updates
+ the \c formatsTable, displaying the MIME formats of the object dropped onto
+ the \c DropArea object. First, we set \l{QTableWidget}'s
+ \l{QTableWidget::setRowCount()}{rowCount} property to 0. Then, we validate
+ to ensure that the QMimeData object passed in is a valid object.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp updateFormatsTable() part1
+
+ Once we are sure that \c mimeData is valid, we iterate through its
+ supported formats using the \l{The foreach Keyword}{foreach keyword}.
+ This keyword has the following format:
+
+ \snippet doc/src/snippets/code/doc_src_examples_dropsite.qdoc 0
+
+ In our example, \c format is the \a variable and the \a container is a
+ QStringList, obtained from \c mimeData->formats().
+
+ \note The \l{QMimeData::formats()}{formats()} function returns a
+ QStringList object, containing all the formats supported by the
+ \c mimeData.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp updateFormatsTable() part2
+
+ Within each iteration, we create a QTableWidgetItem, \c formatItem and we
+ set its \l{QTableWidgetItem::setFlags()}{flags} to Qt::ItemIsEnabled, and
+ its \l{QTableWidgetItem::setTextAlignment()}{text alignment} to Qt::AlignTop
+ and Qt::AlignLeft.
+
+ A QString object, \c text, is customized to display data according to the
+ contents of \c format. We invoke {QString}'s \l{QString::simplified()}
+ {simplified()} function on \c text, to obtain a string that has no
+ additional space before, after or in between words.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp updateFormatsTable() part3
+
+ If \c format contains a list of URLs, we iterate through them, using spaces
+ to separate them. On the other hand, if \c format contains an image, we
+ display the data by converting the text to hexadecimal.
+
+ \snippet draganddrop/dropsite/dropsitewindow.cpp updateFormatsTable() part4
+
+ Once \c text has been customized to contain the appropriate data, we insert
+ both \c format and \c text into \c formatsTable with
+ \l{QTableWidget::setItem()}{setItem()}. Lastly, we invoke
+ \l{QTableView::resizeColumnToContents()}{resizeColumnToContents()} on
+ \c{formatsTable}'s first column.
+
+ \section1 The main() Function
+
+ Within the \c main() function, we instantiate \c DropSiteWindow and invoke
+ its \l{QWidget::show()}{show()} function.
+
+ \snippet draganddrop/dropsite/main.cpp main() function
+*/
diff --git a/doc/src/examples/dynamiclayouts.qdoc b/doc/src/examples/dynamiclayouts.qdoc
new file mode 100644
index 0000000..96b791b
--- /dev/null
+++ b/doc/src/examples/dynamiclayouts.qdoc
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example layouts/dynamiclayouts
+ \title Dynamic Layouts Example
+
+ The Dynamic Layouts example shows how to move widgets around in
+ existing layouts.
+*/
diff --git a/doc/src/examples/echoplugin.qdoc b/doc/src/examples/echoplugin.qdoc
new file mode 100644
index 0000000..32ad15b
--- /dev/null
+++ b/doc/src/examples/echoplugin.qdoc
@@ -0,0 +1,222 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/echoplugin
+ \title Echo Plugin Example
+
+ This example shows how to create a Qt plugin.
+
+ \image echopluginexample.png
+
+ There are two kinds of plugins in Qt: plugins that extend Qt
+ itself and plugins that extend applications written in Qt. In this
+ example, we show the procedure of implementing plugins that extend
+ applications. When you create a plugin you declare an interface,
+ which is a class with only pure virtual functions. This interface
+ is inherited by the class that implements the plugin. The class is
+ stored in a shared library and can therefore be loaded by
+ applications at run-time. When loaded, the plugin is dynamically
+ cast to the interface using Qt's \l{Meta-Object
+ System}{meta-object system}. The plugin \l{How to Create Qt
+ Plugins}{overview document} gives a high-level introduction to
+ plugins.
+
+ We have implemented a plugin, the \c EchoPlugin, which implements
+ the \c EchoInterface. The interface consists of \c echo(), which
+ takes a QString as argument. The \c EchoPlugin returns the string
+ unaltered (i.e., it works as the familiar echo command found in
+ both Unix and Windows).
+
+ We test the plugin in \c EchoWindow: when you push the QPushButton
+ (as seen in the image above), the application sends the text in
+ the QLineEdit to the plugin, which echoes it back to the
+ application. The answer from the plugin is displayed in the
+ QLabel.
+
+
+ \section1 EchoWindow Class Definition
+
+ The \c EchoWindow class lets us test the \c EchoPlugin through a
+ GUI.
+
+ \snippet examples/tools/echoplugin/echowindow/echowindow.h 0
+
+ We load the plugin in \c loadPlugin() and cast it to \c
+ EchoInterface. When the user clicks the \c button we take the
+ text in \c lineEdit and call the interface's \c echo() with it.
+
+
+ \section1 EchoWindow Class Implementation
+
+ We start with a look at the constructor:
+
+ \snippet examples/tools/echoplugin/echowindow/echowindow.cpp 0
+
+ We create the widgets and set a title for the window. We then load
+ the plugin. \c loadPlugin() returns false if the plugin could not
+ be loaded, in which case we disable the widgets. If you wish a
+ more detailed error message, you can use
+ \l{QPluginLoader::}{errorString()}; we will look more closely at
+ QPluginLoader later.
+
+ Here is the implementation of \c sendEcho():
+
+ \snippet examples/tools/echoplugin/echowindow/echowindow.cpp 1
+
+ This slot is called when the user pushes \c button or presses
+ enter in \c lineEdit. We call \c echo() of the echo interface. In
+ our example this is the \c EchoPlugin, but it could be any plugin
+ that inherit the \c EchoInterface. We take the QString returned
+ from \c echo() and display it in the \c label.
+
+ Here is the implementation of \c createGUI():
+
+ \snippet examples/tools/echoplugin/echowindow/echowindow.cpp 2
+
+ We create the widgets and lay them out in a grid layout. We
+ connect the label and line edit to our \c sendEcho() slot.
+
+ Here is the \c loadPlugin() function:
+
+ \snippet examples/tools/echoplugin/echowindow/echowindow.cpp 3
+
+ Access to plugins at run-time is provided by QPluginLoader. You
+ supply it with the filename of the shared library the plugin is
+ stored in and call \l{QPluginLoader::}{instance()}, which loads
+ and returns the root component of the plugin (i.e., it resolves
+ the type of the plugin and creates a QObject instance of it). If
+ the plugin was not successfully loaded, it will be null, so we
+ return false. If it was loaded correctly, we can cast the plugin
+ to our \c EchoInterface and return true. In the case that the
+ plugin loaded does not implement the \c EchoInterface, \c
+ instance() will return null, but this cannot happen in our
+ example. Notice that the location of the plugin is not the same
+ for all platforms.
+
+
+ \section1 EchoInterface Class Definition
+
+ The \c EchoInterface defines the functions that the plugin will
+ provide. An interface is a class that only consists of pure
+ virtual functions. If non virtual functions were present in the
+ class you would get misleading compile errors in the moc files.
+
+ \snippet examples/tools/echoplugin/echowindow/echointerface.h 0
+
+ We declare \c echo(). In our \c EchoPlugin we use this method to
+ return, or echo, \a message.
+
+ We use the Q_DECLARE_INTERFACE macro to let \l{Meta-Object
+ System}{Qt's meta object system} aware of the interface. We do
+ this so that it will be possible to identify plugins that
+ implements the interface at run-time. The second argument is a
+ string that must identify the interface in a unique way.
+
+
+ \section1 EchoPlugin Class Definition
+
+ We inherit both QObject and \c EchoInterface to make this class a
+ plugin. The Q_INTERFACES macro tells Qt which interfaces the class
+ implements. In our case we only implement the \c EchoInterface.
+ If a class implements more than one interface, they are given as
+ a comma separated list.
+
+ \snippet examples/tools/echoplugin/plugin/echoplugin.h 0
+
+
+ \section1 EchoPlugin Class Implementation
+
+ Here is the implementation of \c echo():
+
+ \snippet examples/tools/echoplugin/plugin/echoplugin.cpp 0
+
+ We simply return the functions parameter.
+
+ \snippet examples/tools/echoplugin/plugin/echoplugin.cpp 1
+
+ We use the Q_EXPORT_PLUGIN2 macro to let Qt know that the \c
+ EchoPlugin class is a plugin. The first parameter is the name of
+ the plugin; it is usual to give the plugin and the library file it
+ is stored in the same name.
+
+ \section1 The \c main() function
+
+ \snippet examples/tools/echoplugin/echowindow/main.cpp 0
+
+ We create an \c EchoWindow and display it as a top-level window.
+
+ \section1 The Profiles
+
+ When creating plugins the profiles need to be adjusted.
+ We show here what changes need to be done.
+
+ The profile in the echoplugin directory uses the \c subdirs
+ template and simply includes includes to directories in which
+ the echo window and echo plugin lives:
+
+ \snippet examples/tools/echoplugin/echoplugin.pro 0
+
+ The profile for the echo window does not need any plugin specific
+ settings. We move on to the plugin profile:
+
+ \snippet examples/tools/echoplugin/plugin/plugin.pro 0
+
+ We need to set the TEMPLATE as we now want to make a library
+ instead of an executable. We also need to tell qmake that we are
+ creating a plugin. The \c EchoInterface that the plugin implements
+ lives in the \c echowindow directory, so we need to add that
+ directory to the include path. We set the TARGET of the project,
+ which is the name of the library file in which the plugin will be
+ stored; qmake appends the appropriate file extension depending on
+ the platform. By convention the target should have the same name
+ as the plugin (set with Q_EXPORT_PLUGIN2)
+
+ \section1 Further reading and examples
+
+ You can find an overview of the macros needed to create plugins
+ \l{Macros for Defining Plugins}{here}.
+
+ We give an example of a plugin that extend Qt in the \l{Style
+ Plugin Example}{style plugin} example. The \l{Plug & Paint
+ Example}{plug and paint} example shows how to create static
+ plugins.
+*/
diff --git a/doc/src/examples/editabletreemodel.qdoc b/doc/src/examples/editabletreemodel.qdoc
new file mode 100644
index 0000000..da01830
--- /dev/null
+++ b/doc/src/examples/editabletreemodel.qdoc
@@ -0,0 +1,459 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/editabletreemodel
+ \title Editable Tree Model Example
+
+ This example shows how to implement a simple item-based tree model that can
+ be used with other classes the model/view framework.
+
+ \image itemviews-editabletreemodel.png
+
+ The model supports editable items, custom headers, and the ability to
+ insert and remove rows and columns. With these features, it is also
+ possible to insert new child items, and this is shown in the supporting
+ example code.
+
+ \note The model only shows the basic principles used when creating an
+ editable, hierarchical model. You may wish to use the \l{ModelTest}
+ project to test production models.
+
+ \section1 Overview
+
+ As described in the \l{Model Subclassing Reference}, models must
+ provide implementations for the standard set of model functions:
+ \l{QAbstractItemModel::}{flags()}, \l{QAbstractItemModel::}{data()},
+ \l{QAbstractItemModel::}{headerData()}, and
+ \l{QAbstractItemModel::}{rowCount()}. In addition, hierarchical models,
+ such as this one, need to provide implementations of
+ \l{QAbstractItemModel::}{index()} and \l{QAbstractItemModel::}{parent()}.
+
+ An editable model needs to provide implementations of
+ \l{QAbstractItemModel::}{setData()} and
+ \l{QAbstractItemModel::}{headerData()}, and must return a suitable
+ combination of flags from its \l{QAbstractItemModel::}{flags()} function.
+
+ Since this example allows the dimensions of the model to be changed,
+ we must also implement \l{QAbstractItemModel::}{insertRows()},
+ \l{QAbstractItemModel::}{insertColumns()},
+ \l{QAbstractItemModel::}{removeRows()}, and
+ \l{QAbstractItemModel::}{removeColumns()}.
+
+ \section1 Design
+
+ As with the \l{itemviews/simpletreemodel}{Simple Tree Model} example,
+ the model simply acts as a wrapper around a collection
+ of instances of a \c TreeItem class. Each \c TreeItem is designed to
+ hold data for a row of items in a tree view, so it contains a list of
+ values corresponding to the data shown in each column.
+
+ Since QTreeView provides a row-oriented view onto a model, it is
+ natural to choose a row-oriented design for data structures that
+ will supply data via a model to this kind of view. Although this makes
+ the tree model less flexible, and possibly less useful for use with
+ more sophisticated views, it makes it less complex to design and easier
+ to implement.
+
+ \target Relations-between-internal-items
+ \table
+ \row \o \inlineimage itemviews-editabletreemodel-items.png
+ \o \bold{Relations between internal items}
+
+ When designing a data structure for use with a custom model, it is useful
+ to expose each item's parent via a function like
+ \l{TreeItem::parent}{TreeItem::parent()} because it will make
+ writing the model's own \l{QAbstractItemModel::}{parent()} function easier.
+ Similarly, a function like \l{TreeItem::child}{TreeItem::child()} is
+ helpful when implementing the model's \l{QAbstractItemModel::}{index()}
+ function. As a result, each \c TreeItem maintains information about
+ its parent and children, making it possible for us to traverse the tree
+ structure.
+
+ The diagram shows how \c TreeItem instances are connected via their
+ \l{TreeItem::parent}{parent()} and \l{TreeItem::child}{child()}
+ functions.
+
+ In the example shown, two top-level items, \bold{A} and
+ \bold{B}, can be obtained from the root item by calling its child()
+ function, and each of these items return the root node from their
+ parent() functions, though this is only shown for item \bold{A}.
+ \endtable
+
+ Each \c TreeItem stores data for each column in the row it represents
+ in its \c itemData private member (a list of QVariant objects).
+ Since there is a one-to-one mapping between each column in the view
+ and each entry in the list, we provide a simple
+ \l{TreeItem::data}{data()} function to read entries in the \c itemData
+ list and a \l{TreeItem::setData}{setData()} function to allow them to
+ be modified.
+ As with other functions in the item, this simplifies the implemention
+ of the model's \l{QAbstractItemModel::}{data()} and
+ \l{QAbstractItemModel::}{setData()} functions.
+
+ We place an item at the root of the tree of items. This root item
+ corresponds to the null model index, \l{QModelIndex::}{QModelIndex()},
+ that is used to represent the parent of a top-level item when handling
+ model indexes.
+ Although the root item does not have a visible representation in any of
+ the standard views, we use its internal list of QVariant objects to
+ store a list of strings that will be passed to views for use as
+ horizontal header titles.
+
+ \table
+ \row \o \inlineimage itemviews-editabletreemodel-model.png
+ \o \bold{Accessing data via the model}
+
+ In the case shown in the diagram, the piece of information represented
+ by \bold{a} can be obtained using the standard model/view API:
+
+ \snippet doc/src/snippets/code/doc_src_examples_editabletreemodel.qdoc 0
+
+ Since each items holds pieces of data for each column in a given row,
+ there can be many model indexes that map to the same \c TreeItem object.
+ For example, the information represented by \bold{b} can be obtained
+ using the following code:
+
+ \snippet doc/src/snippets/code/doc_src_examples_editabletreemodel.qdoc 1
+
+ The same underlying \c TreeItem would be accessed to obtain information
+ for the other model indexes in the same row as \bold{b}.
+ \endtable
+
+ In the model class, \c TreeModel, we relate \c TreeItem objects to
+ model indexes by passing a pointer for each item when we create its
+ corresponding model index with QAbstractItemModel::createIndex() in
+ our \l{TreeModel::index}{index()} and \l{TreeModel::parent}{parent()}
+ implementations.
+ We can retrieve pointers stored in this way by calling the
+ \l{QModelIndex::}{internalPointer()} function on the relevant model
+ index - we create our own \l{TreeModel::getItem}{getItem()} function to
+ do this work for us, and call it from our \l{TreeModel::data}{data()}
+ and \l{TreeModel::parent}{parent()} implementations.
+
+ Storing pointers to items is convenient when we control how they are
+ created and destroyed since we can assume that an address obtained from
+ \l{QModelIndex::}{internalPointer()} is a valid pointer.
+ However, some models need to handle items that are obtained from other
+ components in a system, and in many cases it is not possible to fully
+ control how items are created or destroyed. In such situations, a pure
+ pointer-based approach needs to be supplemented by safeguards to ensure
+ that the model does not attempt to access items that have been deleted.
+
+ \table
+ \row \o \bold{Storing information in the underlying data structure}
+
+ Several pieces of data are stored as QVariant objects in the \c itemData
+ member of each \c TreeItem instance
+
+ The diagram shows how pieces of information,
+ represented by the labels \bold{a}, \bold{b} and \bold{c} in the
+ previous two diagrams, are stored in items \bold{A}, \bold{B} and
+ \bold{C} in the underlying data structure. Note that pieces of
+ information from the same row in the model are all obtained from the
+ same item. Each element in a list corresponds to a piece of information
+ exposed by each column in a given row in the model.
+
+ \o \inlineimage itemviews-editabletreemodel-values.png
+ \endtable
+
+ Since the \c TreeModel implementation has been designed for use with
+ QTreeView, we have added a restriction on the way it uses \c TreeItem
+ instances: each item must expose the same number of columns of data.
+ This makes viewing the model consistent, allowing us to use the root
+ item to determine the number of columns for any given row, and only
+ adds the requirement that we create items containing enough data for
+ the total number of columns. As a result, inserting and removing
+ columns are time-consuming operations because we need to traverse the
+ entire tree to modify every item.
+
+ An alternative approach would be to design the \c TreeModel class so
+ that it truncates or expands the list of data in individual \c TreeItem
+ instances as items of data are modified. However, this "lazy" resizing
+ approach would only allow us to insert and remove columns at the end of
+ each row and would not allow columns to be inserted or removed at
+ arbitrary positions in each row.
+
+ \target Relating-items-using-model-indexes
+ \table
+ \row
+ \o \inlineimage itemviews-editabletreemodel-indexes.png
+ \o \bold{Relating items using model indexes}
+
+ As with the \l{itemviews/simpletreemodel}{Simple Tree Model} example,
+ the \c TreeModel needs to be able to take a model index, find the
+ corresponding \c TreeItem, and return model indexes that correspond to
+ its parents and children.
+
+ In the diagram, we show how the model's \l{TreeModel::parent()}{parent()}
+ implementation obtains the model index corresponding to the parent of
+ an item supplied by the caller, using the items shown in a
+ \l{Relations-between-internal-items}{previous diagram}.
+
+ A pointer to item \bold{C} is obtained from the corresponding model index
+ using the \l{QModelIndex::internalPointer()} function. The pointer was
+ stored internally in the index when it was created. Since the child
+ contains a pointer to its parent, we use its \l{TreeItem::parent}{parent()}
+ function to obtain a pointer to item \bold{B}. The parent model index is
+ created using the QAbstractItemModel::createIndex() function, passing
+ the pointer to item \bold{B} as the internal pointer.
+ \endtable
+
+ \section1 TreeItem Class Definition
+
+ The \c TreeItem class provides simple items that contain several
+ pieces of data, and which can provide information about their parent
+ and child items:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.h 0
+
+ We have designed the API to be similar to that provided by
+ QAbstractItemModel by giving each item functions to return the number
+ of columns of information, read and write data, and insert and remove
+ columns. However, we make the relationship between items explicit by
+ providing functions to deal with "children" rather than "rows".
+
+ Each item contains a list of pointers to child items, a pointer to its
+ parent item, and a list of QVariant objects that correspond to
+ information held in columns in a given row in the model.
+
+ \section1 TreeItem Class Implementation
+
+ Each \c TreeItem is constructed with a list of data and an optional
+ parent item:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 0
+
+ Initially, each item has no children. These are added to the item's
+ internal \c childItems member using the \c insertChildren() function
+ described later.
+
+ The destructor ensures that each child added to the item is deleted
+ when the item itself is deleted:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 1
+
+ \target TreeItem::parent
+ Since each item stores a pointer to its parent, the \c parent() function
+ is trivial:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 9
+
+ \target TreeItem::child
+ Three functions provide information about the children of an item.
+ \c child() returns a specific child from the internal list of children:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 2
+
+ The \c childCount() function returns the total number of children:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 3
+
+ The \c childNumber() function is used to determine the index of the child
+ in its parent's list of children. It accesses the parent's \c childItems
+ member directly to obtain this information:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 4
+
+ The root item has no parent item; for this item, we return zero to be
+ consistent with the other items.
+
+ The \c columnCount() function simply returns the number of elements in
+ the internal \c itemData list of QVariant objects:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 5
+
+ \target TreeItem::data
+ Data is retrieved using the \c data() function, which accesses the
+ appropriate element in the \c itemData list:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 6
+
+ \target TreeItem::setData
+ Data is set using the \c setData() function, which only stores values
+ in the \c itemData list for valid list indexes, corresponding to column
+ values in the model:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 11
+
+ To make implementation of the model easier, we return true to indicate
+ whether the data was set successfully, or false if an invalid column
+
+ Editable models often need to be resizable, enabling rows and columns to
+ be inserted and removed. The insertion of rows beneath a given model index
+ in the model leads to the insertion of new child items in the corresponding
+ item, handled by the \c insertChildren() function:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 7
+
+ This ensures that new items are created with the required number of columns
+ and inserted at a valid position in the internal \c childItems list.
+ Items are removed with the \c removeChildren() function:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 10
+
+ As discussed above, the functions for inserting and removing columns are
+ used differently to those for inserting and removing child items because
+ they are expected to be called on every item in the tree. We do this by
+ recursively calling this function on each child of the item:
+
+ \snippet examples/itemviews/editabletreemodel/treeitem.cpp 8
+
+ \section1 TreeModel Class Definition
+
+ The \c TreeModel class provides an implementation of the QAbstractItemModel
+ class, exposing the necessary interface for a model that can be edited and
+ resized.
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.h 0
+
+ The constructor and destructor are specific to this model.
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.h 1
+
+ Read-only tree models only need to provide the above functions. The
+ following public functions provide support for editing and resizing:
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.h 2
+
+ To simplify this example, the data exposed by the model is organized into
+ a data structure by the model's \l{TreeModel::setupModelData}{setupModelData()}
+ function. Many real world models will not process the raw data at all, but
+ simply work with an existing data structure or library API.
+
+ \section1 TreeModel Class Implementation
+
+ The constructor creates a root item and initializes it with the header
+ data supplied:
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 0
+
+ We call the internal \l{TreeModel::setupModelData}{setupModelData()}
+ function to convert the textual data supplied to a data structure we can
+ use with the model. Other models may be initialized with a ready-made
+ data structure, or use an API to a library that maintains its own data.
+
+ The destructor only has to delete the root item; all child items will
+ be recursively deleted by the \c TreeItem destructor.
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 1
+
+ \target TreeModel::getItem
+ Since the model's interface to the other model/view components is based
+ on model indexes, and the internal data structure is item-based, many of
+ the functions implemented by the model need to be able to convert any
+ given model index to its corresponding item. For convenience and
+ consistency, we have defined a \c getItem() function to perform this
+ repetitive task:
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 4
+
+ This function assumes that each model index it is passed corresponds to
+ a valid item in memory. If the index is invalid, or its internal pointer
+ does not refer to a valid item, the root item is returned instead.
+
+ The model's \c rowCount() implementation is simple: it first uses the
+ \c getItem() function to obtain the relevant item, then returns the
+ number of children it contains:
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 8
+
+ By contrast, the \c columnCount() implementation does not need to look
+ for a particular item because all items are defined to have the same
+ number of columns associated with them.
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 2
+
+ As a result, the number of columns can be obtained directly from the root
+ item.
+
+ To enable items to be edited and selected, the \c flags() function needs
+ to be implemented so that it returns a combination of flags that includes
+ the Qt::ItemIsEditable and Qt::ItemIsSelectable flags as well as
+ Qt::ItemIsEnabled:
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 3
+
+ \target TreeModel::index
+ The model needs to be able to generate model indexes to allow other
+ components to request data and information about its structure. This task
+ is performed by the \c index() function, which is used to obtain model
+ indexes corresponding to children of a given parent item:
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 5
+
+ In this model, we only return model indexes for child items if the parent
+ index is invalid (corresponding to the root item) or if it has a zero
+ column number.
+
+ We use the custom \l{TreeModel::getItem}{getItem()} function to obtain
+ a \c TreeItem instance that corresponds to the model index supplied, and
+ request its child item that corresponds to the specified row.
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 6
+
+ Since each item contains information for an entire row of data, we create
+ a model index to uniquely identify it by calling
+ \l{QAbstractItemModel::}{createIndex()} it with the row and column numbers
+ and a pointer to the item. In the \l{TreeModel::data}{data()} function,
+ we will use the item pointer and column number to access the data
+ associated with the model index; in this model, the row number is not
+ needed to identify data.
+
+ \target TreeModel::parent
+ The \c parent() function supplies model indexes for parents of items
+ by finding the corresponding item for a given model index, using its
+ \l{TreeItem::parent}{parent()} function to obtain its parent item,
+ then creating a model index to represent the parent. (See
+ \l{Relating-items-using-model-indexes}{the above diagram}).
+
+ \snippet examples/itemviews/editabletreemodel/treemodel.cpp 7
+
+ Items without parents, including the root item, are handled by returning
+ a null model index. Otherwise, a model index is created and returned as
+ in the \l{TreeModel::index}{index()} function, with a suitable row number,
+ but with a zero column number to be consistent with the scheme used in
+ the \l{TreeModel::index}{index()} implementation.
+
+ \target TreeModel::data
+ \target TreeModel::setupModelData
+
+*/
diff --git a/doc/src/examples/elasticnodes.qdoc b/doc/src/examples/elasticnodes.qdoc
new file mode 100644
index 0000000..90f2f01
--- /dev/null
+++ b/doc/src/examples/elasticnodes.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/elasticnodes
+ \title Elastic Nodes Example
+
+ This GraphicsView example shows how to implement edges between nodes in a graph.
+
+ \image elasticnodes-example.png
+*/
diff --git a/doc/src/examples/extension.qdoc b/doc/src/examples/extension.qdoc
new file mode 100644
index 0000000..8a0ca3a
--- /dev/null
+++ b/doc/src/examples/extension.qdoc
@@ -0,0 +1,153 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/extension
+ \title Extension Example
+
+ The Extension example shows how to add an extension to a QDialog
+ using the QAbstractButton::toggled() signal and the
+ QWidget::setVisible() slot.
+
+ \image extension-example.png Screenshot of the Extension example
+
+ The Extension application is a dialog that allows the user to
+ perform a simple search as well as a more advanced search.
+
+ The simple search has two options: \gui {Match case} and \gui
+ {Search from start}. The advanced search options include the
+ possibilities to search for \gui {Whole words}, \gui {Search
+ backward} and \gui {Search selection}. Only the simple search is
+ visible when the application starts. The advanced search options
+ are located in the application's extension part, and can be made
+ visible by pressing the \gui More button:
+
+ \image extension_more.png Screenshot of the Extension example
+
+ \section1 FindDialog Class Definition
+
+ The \c FindDialog class inherits QDialog. The QDialog class is the
+ base class of dialog windows. A dialog window is a top-level
+ window mostly used for short-term tasks and brief communications
+ with the user.
+
+ \snippet examples/dialogs/extension/finddialog.h 0
+
+ The \c FindDialog widget is the main application widget, and
+ displays the application's search options and controlling
+ buttons.
+
+ In addition to a constructor, we declare the several child
+ widgets: We need a QLineEdit with an associated QLabel to let the
+ user type a word to search for, we need several \l
+ {QCheckBox}{QCheckBox}es to facilitate the search options, and we
+ need three \l {QPushButton}{QPushButton}s: the \gui Find button to
+ start a search, the \gui More button to enable an advanced search,
+ and the \gui Close button to exit the application. Finally, we
+ need a QWidget representing the application's extension part.
+
+ \section1 FindDialog Class Implementation
+
+ In the constructor we first create the standard child widgets for
+ the simple search: the QLineEdit with the associated QLabel, two
+ of the \l {QCheckBox}{QCheckBox}es and all the \l
+ {QPushButton}{QPushButton}s.
+
+ \snippet examples/dialogs/extension/finddialog.cpp 0
+
+ We give the options and buttons a shortcut key using the &
+ character. In the \gui {Find what} option's case, we also need to
+ use the QLabel::setBuddy() function to make the shortcut key work
+ as expected; then, when the user presses the shortcut key
+ indicated by the label, the keyboard focus is transferred to the
+ label's buddy widget, the QLineEdit.
+
+ We set the \gui Find button's default property to true, using the
+ QPushButton::setDefault() function. Then the push button will be
+ pressed if the user presses the Enter (or Return) key. Note that a
+ QDialog can only have one default button.
+
+ \snippet examples/dialogs/extension/finddialog.cpp 2
+
+ Then we create the extension widget, and the \l
+ {QCheckBox}{QCheckBox}es associated with the advanced search
+ options.
+
+ \snippet examples/dialogs/extension/finddialog.cpp 3
+
+ Now that the extension widget is created, we can connect the \gui
+ More button's \l{QAbstractButton::toggled()}{toggled()} signal to
+ the extension widget's \l{QWidget::setVisible()}{setVisible()} slot.
+
+ The QAbstractButton::toggled() signal is emitted whenever a
+ checkable button changes its state. The signal's argument is true
+ if the button is checked, or false if the button is unchecked. The
+ QWidget::setVisible() slot sets the widget's visible status. If
+ the status is true the widget is shown, otherwise the widget is
+ hidden.
+
+ Since we made the \gui More button checkable when we created it,
+ the connection makes sure that the extension widget is shown
+ depending on the state of \gui More button.
+
+ We also connect the \gui Close button to the QWidget::close()
+ slot, and we put the checkboxes associated with the advanced
+ search options into a layout we install on the extension widget.
+
+ \snippet examples/dialogs/extension/finddialog.cpp 4
+
+ Before we create the main layout, we create several child layouts
+ for the widgets: First we allign the QLabel ans its buddy, the
+ QLineEdit, using a QHBoxLayout. Then we vertically allign the
+ QLabel and QLineEdit with the checkboxes associated with the
+ simple search, using a QVBoxLayout. We also create a QVBoxLayout
+ for the buttons. In the end we lay out the two latter layouts and
+ the extension widget using a QGridLayout.
+
+ \snippet examples/dialogs/extension/finddialog.cpp 5
+
+ Finally, we hide the extension widget using the QWidget::hide()
+ function, making the application only show the simple search
+ options when it starts. When the user wants to access the advanced
+ search options, the dialog only needs to change the visibility of
+ the extension widget. Qt's layout management takes care of the
+ dialog's appearance.
+*/
diff --git a/doc/src/examples/fetchmore.qdoc b/doc/src/examples/fetchmore.qdoc
new file mode 100644
index 0000000..5434098
--- /dev/null
+++ b/doc/src/examples/fetchmore.qdoc
@@ -0,0 +1,84 @@
+/*!
+ \example itemviews/fetchmore
+ \title Fetch More Example
+
+ The Fetch More example shows how two add items to an item view
+ model on demand.
+
+ \image fetchmore-example.png
+
+ The user of the example can enter a directory in the \gui
+ Directory line edit. The contents of the directory will
+ be listed in the list view below.
+
+ When you have large - or perhaps even infinite - data sets, you
+ will need to add items to the model in batches, and preferably only
+ when the items are needed by the view (i.e., when they are visible
+ in the view).
+
+ In this example, we implement \c FileListModel - an item view
+ model containing the entries of a directory. We also have \c
+ Window, which sets up the GUI and feeds the model with
+ directories.
+
+ Let's take a tour of \c {FileListModel}'s code.
+
+ \section1 FileListModel Class Definition
+
+ The \c FileListModel inherits QAbstractListModel and contains the
+ contents of a directory. It will add items to itself only when
+ requested to do so by the view.
+
+ \snippet examples/itemviews/fetchmore/filelistmodel.h 0
+
+ The secret lies in the reimplementation of
+ \l{QAbstractItemModel::}{fetchMore()} and
+ \l{QAbstractItemModel::}{canFetchMore()} from QAbstractItemModel.
+ These functions are called by the item view when it needs more
+ items.
+
+ The \c setDirPath() function sets the directory the model will
+ work on. We emit \c numberPopulated() each time we add a batch of
+ items to the model.
+
+ We keep all directory entries in \c fileList. \c fileCount is the
+ number of items that have been added to the model.
+
+ \section1 FileListModel Class Implementation
+
+ We start by checking out the \c setDirPath().
+
+ \snippet examples/itemviews/fetchmore/filelistmodel.cpp 0
+
+ We use a QDir to get the contents of the directory. We need to
+ inform QAbstractItemModel that we want to remove all items - if
+ any - from the model.
+
+ \snippet examples/itemviews/fetchmore/filelistmodel.cpp 1
+
+ The \c canFetchMore() function is called by the view when it needs
+ more items. We return true if there still are entries that we have
+ not added to the model; otherwise, we return false.
+
+ And now, the \c fetchMore() function itself:
+
+ \snippet examples/itemviews/fetchmore/filelistmodel.cpp 2
+
+ We first calculate the number of items to fetch.
+ \l{QAbstractItemModel::}{beginInsertRows()} and
+ \l{QAbstractItemModel::}{endInsertRows()} are mandatory for
+ QAbstractItemModel to keep up with the row insertions. Finally, we
+ emit \c numberPopulated(), which is picked up by \c Window.
+
+ To complete the tour, we also look at \c rowCount() and \c data().
+
+ \snippet examples/itemviews/fetchmore/filelistmodel.cpp 4
+
+ Notice that the row count is only the items we have added so far,
+ i.e., not the number of entries in the directory.
+
+ In \c data(), we return the appropriate entry from the \c
+ fileList. We also separate the batches with a different background
+ color.
+*/
+
diff --git a/doc/src/examples/filetree.qdoc b/doc/src/examples/filetree.qdoc
new file mode 100644
index 0000000..e53769c
--- /dev/null
+++ b/doc/src/examples/filetree.qdoc
@@ -0,0 +1,421 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xmlpatterns/filetree
+ \title File System Example
+
+ This example shows how to use QtXmlPatterns for querying non-XML
+ data that is modeled to look like XML.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ The example models your computer's file system to look like XML and
+ allows you to query the file system with XQuery. Suppose we want to
+ find all the \c{cpp} files in the subtree beginning at
+ \c{/filetree}:
+
+ \image filetree_1-example.png
+
+ \section2 The User Inteface
+
+ The example is shown below. First, we use \c{File->Open Directory}
+ (not shown) to select the \c{/filetree} directory. Then we use the
+ combobox on the right to select the XQuery that searches for \c{cpp}
+ files (\c{listCPPFiles.xq}). Selecting an XQuery runs the query,
+ which in this case traverses the model looking for all the \c{cpp}
+ files. The XQuery text and the query results are shown on the right:
+
+ \image filetree_2-example.png
+
+ Don't be mislead by the XML representation of the \c{/filetree}
+ directory shown on the left. This is not the node model itself but
+ the XML obtained by traversing the node model and outputting it as
+ XML. Constructing and using the custom node model is explained in
+ the code walk-through.
+
+ \section2 Running your own XQueries
+
+ You can write your own XQuery files and run them in the example
+ program. The file \c{xmlpatterns/filetree/queries.qrc} is the \l{The
+ Qt Resource System} {resource file} for this example. It is used in
+ \c{main.cpp} (\c{Q_INIT_RESOURCE(queries);}). It lists the XQuery
+ files (\c{.xq}) that can be selected in the combobox.
+
+ \quotefromfile examples/xmlpatterns/filetree/queries.qrc
+ \printuntil
+
+ To add your own queries to the example's combobox, store your
+ \c{.xq} files in the \c{examples/xmlpatterns/filetree/queries}
+ directory and add them to \c{queries.qrc} as shown above.
+
+ \section1 Code Walk-Through
+
+ The strategy is to create a custom node model that represents the
+ directory tree of the computer's file system. That tree structure is
+ non-XML data. The custom node model must have the same callback
+ interface as the XML node models that the QtXmlPatterns query engine
+ uses to execute queries. The query engine can then traverse the
+ custom node model as if it were traversing the node model built from
+ an XML document.
+
+ The required callback interface is in QAbstractXmlNodeModel, so we
+ create a custom node model by subclassing QAbstractXmlNodeModel and
+ providing implementations for its pure virtual functions. For many
+ cases, the implementations of several of the virtual functions are
+ always the same, so QtXmlPatterns also provides QSimpleXmlNodeModel,
+ which subclasses QAbstractXmlNodeModel and provides implementations
+ for the callback functions that you can ignore. By subclassing
+ QSimpleXmlNodeModel instead of QAbstractXmlNodeModel, you can reduce
+ development time.
+
+ \section2 The Custom Node Model Class: FileTree
+
+ The custom node model for this example is class \c{FileTree}, which
+ is derived from QSimpleXmlNodeModel. \c{FileTree} implements all the
+ callback functions that don't have standard implementations in
+ QSimpleXmlNodeModel. When you implement your own custom node model,
+ you must provide implementations for these callback functions:
+
+ \snippet examples/xmlpatterns/filetree/filetree.h 0
+ \snippet examples/xmlpatterns/filetree/filetree.h 1
+
+ The \c{FileTree} class declares four data members:
+
+ \snippet examples/xmlpatterns/filetree/filetree.h 2
+
+ The QVector \c{m_fileInfos} will contain the node model. Each
+ QFileInfo in the vector will represent a file or a directory in the
+ file system. At this point it is instructive to note that although
+ the node model class for this example (\c{FileTree}) actually builds
+ and contains the custom node model, building the custom node model
+ isn't always required. The node model class for the \l{QObject XML
+ Model Example} {QObject node model example} does not build its node
+ model but instead uses an already existing QObject tree as its node
+ model and just implements the callback interface for that already
+ existing data structure. In this file system example, however,
+ although we have an already existing data structure, i.e. the file
+ system, that data structure is not in memory and is not in a form we
+ can use. So we must build an analog of the file system in memory
+ from instances of QFileInfo, and we use that analog as the custom
+ node model.
+
+ The two sets of flags, \c{m_filterAllowAll} and \c{m_sortFlags},
+ contain OR'ed flags from QDir::Filters and QDir::SortFlags
+ respectively. They are set by the \c{FileTree} constructor and used
+ in calls to QDir::entryInfoList() for getting the child list for a
+ directory node, i.e. a QFileInfoList containing the file and
+ directory nodes for all the immediate children of a directory.
+
+ The QVector \c{m_names} is an auxiliary component of the node
+ model. It holds the XML element and attribute names (QXmlName) for
+ all the node types that will be found in the node model. \c{m_names}
+ is indexed by the enum \c{FileTree::Type}, which specifies the node
+ types:
+
+ \target Node_Type
+ \snippet examples/xmlpatterns/filetree/filetree.h 4
+
+ \c{Directory} and \c{File} will represent the XML element nodes for
+ directories and files respectively, and the other enum values will
+ represent the XML attribute nodes for a file's path, name, suffix,
+ its size in bytes, and its mime type. The \c{FileTree} constructor
+ initializes \c{m_names} with an appropriate QXmlName for each
+ element and attribute type:
+
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 2
+
+ Note that the constructor does \e{not} pre-build the entire node
+ model. Instead, the node model is built \e{incrementally} as the
+ query engine evaluates a query. To see how the query engine causes
+ the node model to be built incrementally, see \l{Building And
+ Traversing The Node Model}. To see how the query engine accesses the
+ node model, see \l{Accessing the node model}. See also: \l{Node
+ Model Building Strategy}.
+
+ \section3 Accessing The Node Model
+
+ Since the node model is stored outside the query engine in the
+ \c{FileTree} class, the query engine knows nothing about it and can
+ only access it by calling functions in the callback interface. When
+ the query engine calls any callback function to access data in the
+ node model, it passes a QXmlNodeModelIndex to identify the node in
+ the node model that it wants to access. Hence all the virtual
+ functions in the callback interface use a QXmlNodeModelIndex to
+ uniquely identify a node in the model.
+
+ We use the index of a QFileInfo in \c{m_fileInfos} to uniquely
+ identify a node in the node model. To get the QXmlNodeModelIndex for
+ a QFileInfo, the class uses the private function \c{toNodeIndex()}:
+
+ \target main toNodeIndex
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 1
+
+ It searches the \c{m_fileInfos} vector for a QFileInfo that matches
+ \c{fileInfo}. If a match is found, its array index is passed to
+ QAbstractXmlNodeModel::createIndex() as the \c data value for the
+ QXmlNodeIndex. If no match is found, the unmatched QFileInfo is
+ appended to the vector, so this function is also doing the actual
+ incremental model building (see \l{Building And Traversing The Node
+ Model}).
+
+ Note that \c{toNodeIndex()} gets a \l{Node_Type} {node type} as the
+ second parameter, which it just passes on to
+ \l{QAbstractXmlNodeModel::createIndex()} {createIndex()} as the
+ \c{additionalData} value. Logically, this second parameter
+ represents a second dimension in the node model, where the first
+ dimension represents the \e element nodes, and the second dimension
+ represents each element's attribute nodes. The meaning is that each
+ QFileInfo in the \c{m_fileInfos} vector can represent an \e{element}
+ node \e{and} one or more \e{attribute} nodes. In particular, the
+ QFileInfo for a file will contain the values for the attribute nodes
+ path, name, suffix, size, and mime type (see
+ \c{FileTree::attributes()}). Since the attributes are contained in
+ the QFileInfo of the file element, there aren't actually any
+ attribute nodes in the node model. Hence, we can use a QVector for
+ \c{m_fileInfos}.
+
+ A convenience overloading of \l{toNodeIndex of convenience}
+ {toNodeIndex()} is also called in several places, wherever it is
+ known that the QXmlNodeModelIndex being requested is for a directory
+ or a file and not for an attribute. The convenience function takes
+ only the QFileInfo parameter and calls the other \l{main toNodeIndex}
+ {toNodeIndex()}, after obtaining either the Directory or File node
+ type directly from the QFileInfo:
+
+ \target toNodeIndex of convenience
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 0
+
+ Note that the auxiliary vector \c{m_names} is accessed using the
+ \l{Node_Type} {node type}, for example:
+
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 3
+
+ Most of the virtual functions in the callback interface are as
+ simple as the ones described so far, but the callback function used
+ for traversing (and building) the node model is more complex.
+
+ \section3 Building And Traversing The Node Model
+
+ The node model in \c{FileTree} is not fully built before the query
+ engine begins evaluating the query. In fact, when the query engine
+ begins evaluating its first query, the only node in the node model
+ is the one representing the root directory for the selected part of
+ the file system. See \l{The UI Class: MainWindow} below for details
+ about how the UI triggers creation of the model.
+
+ The query engine builds the node model incrementally each time it
+ calls the \l{next node on axis} {nextFromSimpleAxis()} callback
+ function, as it traverses the node model to evaluate a query. Thus
+ the query engine only builds the region of the node model that it
+ needs for evaluating the query.
+
+ \l{next node on axis} {nextFromSimpleAxis()} takes an
+ \l{QAbstractXmlNodeModel::SimpleAxis} {axis identifier} and a
+ \l{QXmlNodeModelIndex} {node identifier} as parameters. The
+ \l{QXmlNodeModelIndex} {node identifier} represents the \e{context
+ node} (i.e. the query engine's current location in the model), and
+ the \l{QAbstractXmlNodeModel::SimpleAxis} {axis identifier}
+ represents the direction we want to move from the context node. The
+ function finds the appropriate next node and returns its
+ QXmlNodeModelIndex.
+
+ \l{next node on axis} {nextFromSimpleAxis()} is where most of the
+ work of implementing a custom node model will be required. The
+ obvious way to do it is to use a switch statement with a case for
+ each \l{QAbstractXmlNodeModel::SimpleAxis} {axis}.
+
+ \target next node on axis
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 4
+
+ The first thing this function does is call \l{to file info}
+ {toFileInfo()} to get the QFileInfo of the context node. The use of
+ QVector::at() here is guaranteed to succeed because the context node
+ must already be in the node model, and hence must have a QFileInfo
+ in \c{m_fileInfos}.
+
+ \target to file info
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 6
+
+ The \l{QAbstractXmlNodeModel::Parent} {Parent} case looks up the
+ context node's parent by constructing a QFileInfo from the context
+ node's \l{QFileInfo::absoluteFilePath()} {path} and passing it to
+ \l{main toNodeIndex} {toNodeIndex()} to find the QFileInfo in
+ \c{m_fileInfos}.
+
+ The \l{QAbstractXmlNodeModel::FirstChild} {FirstChild} case requires
+ that the context node must be a directory, because a file doesn't
+ have children. If the context node is not a directory, a default
+ constructed QXmlNodeModelIndex is returned. Otherwise,
+ QDir::entryInfoList() constructs a QFileInfoList of the context
+ node's children. The first QFileInfo in the list is passed to
+ \l{toNodeIndex of convenience} {toNodeIndex()} to get its
+ QXmlNodeModelIndex. Note that this will add the child to the node
+ model, if it isn't in the model yet.
+
+ The \l{QAbstractXmlNodeModel::PreviousSibling} {PreviousSibling} and
+ \l{QAbstractXmlNodeModel::NextSibling} {NextSibling} cases call the
+ \l{nextSibling helper} {nextSibling() helper function}. It takes the
+ QXmlNodeModelIndex of the context node, the QFileInfo of the context
+ node, and an offest of +1 or -1. The context node is a child of some
+ parent, so the function gets the parent and then gets the child list
+ for the parent. The child list is searched to find the QFileInfo of
+ the context node. It must be there. Then the offset is applied, -1
+ for the previous sibling and +1 for the next sibling. The resulting
+ index is passed to \l{toNodeIndex of convenience} {toNodeIndex()} to
+ get its QXmlNodeModelIndex. Note again that this will add the
+ sibling to the node model, if it isn't in the model yet.
+
+ \target nextSibling helper
+ \snippet examples/xmlpatterns/filetree/filetree.cpp 5
+
+ \section2 The UI Class: MainWindow
+
+ The example's UI is a conventional Qt GUI application inheriting
+ QMainWindow and the Ui_MainWindow base class generated by
+ \l{Qt Designer Manual} {Qt Designer}.
+
+ \snippet examples/xmlpatterns/filetree/mainwindow.h 0
+
+ It contains the custom node model (\c{m_fileTree}) and an instance
+ of QXmlNodeModelIndex (\c{m_fileNode}) used for holding the node
+ index for the root of the file system subtree. \c{m_fileNode} will
+ be bound to a $variable in the XQuery to be evaluated.
+
+ Two actions of interest are handled by slot functions: \l{Selecting
+ A Directory To Model} and \l{Selecting And Running An XQuery}.
+
+ \section3 Selecting A Directory To Model
+
+ The user selects \c{File->Open Directory} to choose a directory to
+ be loaded into the custom node model. Choosing a directory signals
+ the \c{on_actionOpenDirectory_triggered()} slot:
+
+ \snippet examples/xmlpatterns/filetree/mainwindow.cpp 1
+
+ The slot function simply calls the private function
+ \c{loadDirectory()} with the path of the chosen directory:
+
+ \target the standard code pattern
+ \snippet examples/xmlpatterns/filetree/mainwindow.cpp 4
+
+ \c{loadDirectory()} demonstrates a standard code pattern for using
+ QtXmlPatterns programatically. First it gets the node model index
+ for the root of the selected directory. Then it creates an instance
+ of QXmlQuery and calls QXmlQuery::bindVariable() to bind the node
+ index to the XQuery variable \c{$fileTree}. It then calls
+ QXmlQuery::setQuery() to load the XQuery text.
+
+ \note QXmlQuery::bindVariable() must be called \e before calling
+ QXmlQuery::setQuery(), which loads and parses the XQuery text and
+ must have access to the variable binding as the text is parsed.
+
+ The next lines create an output device for outputting the query
+ result, which is then used to create a QXmlFormatter to format the
+ query result as XML. QXmlQuery::evaluateTo() is called to run the
+ query, and the formatted XML output is displayed in the left panel
+ of the UI window.
+
+ Finally, the private function \l{Selecting And Running An XQuery}
+ {evaluateResult()} is called to run the currently selected XQuery
+ over the custom node model.
+
+ \note As described in \l{Building And Traversing The Node Model},
+ the \c FileTree class wants to build the custom node model
+ incrementally as it evaluates the XQuery. But, because the
+ \c{loadDirectory()} function runs the \c{wholeTree.xq} XQuery, it
+ actually builds the entire node model anyway. See \l{Node Model
+ Building Strategy} for a discussion about building your custom node
+ model.
+
+ \section3 Selecting And Running An XQuery
+
+ The user chooses an XQuery from the menu in the combobox on the
+ right. Choosing an XQuery signals the
+ \c{on_queryBox_currentIndexChanged()} slot:
+
+ \snippet examples/xmlpatterns/filetree/mainwindow.cpp 2
+
+ The slot function opens and loads the query file and then calls the
+ private function \c{evaluateResult()} to run the query:
+
+ \snippet examples/xmlpatterns/filetree/mainwindow.cpp 3
+
+ \c{evaluateResult()} is a second example of the same code pattern
+ shown in \l{the standard code pattern} {loadDirectory()}. In this
+ case, it runs the XQuery currently selected in the combobox instead
+ of \c{qrc:/queries/wholeTree.xq}, and it outputs the query result to
+ the panel on the lower right of the UI window.
+
+ \section2 Node Model Building Strategy
+
+ We saw that the \l{The Custom Node Model Class: FileTree} {FileTree}
+ tries to build its custom node model incrementally, but we also saw
+ that the \l{the standard code pattern} {MainWindow::loadDirectory()}
+ function in the UI class immediately subverts the incremental build
+ by running the \c{wholeTree.xq} XQuery, which traverses the entire
+ selected directory, thereby causing the entire node model to be
+ built.
+
+ If we want to preserve the incremental build capability of the
+ \c{FileTree} class, we can strip the running of \c{wholeTree.xq} out
+ of \l{the standard code pattern} {MainWindow::loadDirectory()}:
+
+ \snippet examples/xmlpatterns/filetree/mainwindow.cpp 5
+ \snippet examples/xmlpatterns/filetree/mainwindow.cpp 6
+
+ Note, however, that \c{FileTree} doesn't have the capability of
+ deleting all or part of the node model. The node model, once built,
+ is only deleted when the \c{FileTree} instance goes out of scope.
+
+ In this example, each element node in the node model represents a
+ directory or a file in the computer's file system, and each node is
+ represented by an instance of QFileInfo. An instance of QFileInfo is
+ not costly to produce, but you might imagine a node model where
+ building new nodes is very costly. In such cases, the capability to
+ build the node model incrementally is important, because it allows
+ us to only build the region of the model we need for evaluating the
+ query. In other cases, it will be simpler to just build the entire
+ node model.
+
+*/
diff --git a/doc/src/examples/findfiles.qdoc b/doc/src/examples/findfiles.qdoc
new file mode 100644
index 0000000..db41f43
--- /dev/null
+++ b/doc/src/examples/findfiles.qdoc
@@ -0,0 +1,263 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/findfiles
+ \title Find Files Example
+
+ The Find Files example shows how to use QProgressDialog to provide
+ feedback on the progress of a slow operation. The example also
+ shows how to use QFileDialog to facilitate browsing, how to use
+ QTextStream's streaming operators to read a file, and how to use
+ QTableWidget to provide standard table display facilities for
+ applications. In addition, files can be opened using the
+ QDesktopServices class.
+
+ \image findfiles-example.png Screenshot of the Find Files example
+
+ With the Find Files application the user can search for files in a
+ specified directory, matching a specified file name (using wild
+ cards if appropiate) and containing a specified text.
+
+ The user is provided with a \gui Browse option, and the result of
+ the search is displayed in a table with the names of the files
+ found and their sizes. In addition the application provides a
+ total count of the files found.
+
+ \section1 Window Class Definition
+
+ The \c Window class inherits QWidget, and is the main application
+ widget. It shows the search options, and displays the search
+ results.
+
+ \snippet examples/dialogs/findfiles/window.h 0
+
+ We need two private slots: The \c browse() slot is called whenever
+ the user wants to browse for a directory to search in, and the \c
+ find() slot is called whenever the user requests a search to be
+ performed by pressing the \gui Find button.
+
+ In addition we declare several private functions: We use the \c
+ findFiles() function to search for files matching the user's
+ specifications, we call the \c showFiles() function to display the
+ results, and we use \c createButton(), \c createComboBox() and \c
+ createFilesTable() when we are constructing the widget.
+
+ \section1 Window Class Implementation
+
+ In the constructor we first create the application's widgets.
+
+ \snippet examples/dialogs/findfiles/window.cpp 0
+
+ We create the application's buttons using the private \c
+ createButton() function. Then we create the comboboxes associated
+ with the search specifications, using the private \c
+ createComboBox() function. We also create the application's labels
+ before we use the private \c createFilesTable() function to create
+ the table displaying the search results.
+
+ \snippet examples/dialogs/findfiles/window.cpp 1
+
+ Then we add all the widgets to a main layout using QGridLayout. We
+ have, however, put the \c Find and \c Quit buttons and a
+ stretchable space in a separate QHBoxLayout first, to make the
+ buttons appear in the \c Window widget's bottom right corner.
+
+ \snippet examples/dialogs/findfiles/window.cpp 2
+
+ The \c browse() slot presents a file dialog to the user, using the
+ QFileDialog class. QFileDialog enables a user to traverse the file
+ system in order to select one or many files or a directory. The
+ easiest way to create a QFileDialog is to use the convenience
+ static functions.
+
+ Here we use the static QFileDialog::getExistingDirectory()
+ function which returns an existing directory selected by the
+ user. Then we display the directory in the directory combobox
+ using the QComboBox::addItem() function, and updates the current
+ index.
+
+ QComboBox::addItem() adds an item to the combobox with the given
+ text (if it is not already present in the list), and containing
+ the specified userData. The item is appended to the list of
+ existing items.
+
+ \snippet examples/dialogs/findfiles/window.cpp 3
+
+ The \c find() slot is called whenever the user requests a new
+ search by pressing the \gui Find button.
+
+ First we eliminate any previous search results by setting the
+ table widgets row count to zero. Then we retrieve the
+ specified file name, text and directory path from the respective
+ comboboxes.
+
+ \snippet examples/dialogs/findfiles/window.cpp 4
+
+ We use the directory's path to create a QDir; the QDir class
+ provides access to directory structures and their contents. We
+ create a list of the files (contained in the newly created QDir)
+ that match the specified file name. If the file name is empty
+ the list will contain all the files in the directory.
+
+ Then we search through all the files in the list, using the private
+ \c findFiles() function, eliminating the ones that don't contain
+ the specified text. And finally, we display the results using the
+ private \c showFiles() function.
+
+ If the user didn't specify any text, there is no reason to search
+ through the files, and we display the results immediately.
+
+ \image findfiles_progress_dialog.png Screenshot of the Progress Dialog
+
+ \snippet examples/dialogs/findfiles/window.cpp 5
+
+ In the private \c findFiles() function we search through a list of
+ files, looking for the ones that contain a specified text. This
+ can be a very slow operation depending on the number of files as
+ well as their sizes. In case there are a large number of files, or
+ there exists some large files on the list, we provide a
+ QProgressDialog.
+
+ The QProgressDialog class provides feedback on the progress of a
+ slow operation. It is used to give the user an indication of how
+ long an operation is going to take, and to demonstrate that the
+ application has not frozen. It can also give the user an
+ opportunity to abort the operation.
+
+ \snippet examples/dialogs/findfiles/window.cpp 6
+
+ We run through the files, one at a time, and for each file we
+ update the QProgressDialog value. This property holds the current
+ amount of progress made. We also update the progress dialog's
+ label.
+
+ Then we call the QCoreApplication::processEvents() function using
+ the QApplication object. In this way we interleave the display of
+ the progress made with the process of searching through the files
+ so the application doesn't appear to be frozen.
+
+ The QApplication class manages the GUI application's control flow
+ and main settings. It contains the main event loop, where all
+ events from the window system and other sources are processed and
+ dispatched. QApplication inherits QCoreApplication. The
+ QCoreApplication::processEvents() function processes all pending
+ events according to the specified QEventLoop::ProcessEventFlags
+ until there are no more events to process. The default flags are
+ QEventLoop::AllEvents.
+
+ \snippet examples/dialogs/findfiles/window.cpp 7
+
+ After updating the QProgressDialog, we create a QFile using the
+ QDir::absoluteFilePath() function which returns the absolute path
+ name of a file in the directory. We open the file in read-only
+ mode, and read one line at a time using QTextStream.
+
+ The QTextStream class provides a convenient interface for reading
+ and writing text. Using QTextStream's streaming operators, you can
+ conveniently read and write words, lines and numbers.
+
+ For each line we read we check if the QProgressDialog has been
+ canceled. If it has, we abort the operation, otherwise we check if
+ the line contains the specified text. When we find the text within
+ one of the files, we add the file's name to a list of found files
+ that contain the specified text, and start searching a new file.
+
+ Finally, we return the list of the files found.
+
+ \snippet examples/dialogs/findfiles/window.cpp 8
+
+ Both the \c findFiles() and \c showFiles() functions are called from
+ the \c find() slot. In the \c showFiles() function we run through
+ the provided list of file names, adding each file name to the
+ first column in the table widget and retrieving the file's size using
+ QFile and QFileInfo for the second column.
+
+ We also update the total number of files found.
+
+ \snippet examples/dialogs/findfiles/window.cpp 9
+
+ The private \c createButton() function is called from the
+ constructor. We create a QPushButton with the provided text,
+ connect it to the provided slot, and return a pointer to the
+ button.
+
+ \snippet examples/dialogs/findfiles/window.cpp 10
+
+ The private \c createComboBox() function is also called from the
+ contructor. We create a QComboBox with the given text, and make it
+ editable.
+
+ When the user enters a new string in an editable combobox, the
+ widget may or may not insert it, and it can insert it in several
+ locations, depending on the QComboBox::InsertPolicy. The default
+ policy is is QComboBox::InsertAtBottom.
+
+ Then we add the provided text to the combobox, and specify the
+ widget's size policies, before we return a pointer to the
+ combobox.
+
+ \snippet examples/dialogs/findfiles/window.cpp 11
+
+ The private \c createFilesTable() function is called from the
+ constructor. In this function we create the QTableWidget that
+ will display the search results. We set its horizontal headers and
+ their resize mode.
+
+ QTableWidget inherits QTableView which provides a default
+ model/view implementation of a table view. The
+ QTableView::horizontalHeader() function returns the table view's
+ horizontal header as a QHeaderView. The QHeaderView class provides
+ a header row or header column for item views, and the
+ QHeaderView::setResizeMode() function sets the constraints on how
+ the section in the header can be resized.
+
+ Finally, we hide the QTableWidget's vertical headers using the
+ QWidget::hide() function, and remove the default grid drawn for
+ the table using the QTableView::setShowGrid() function.
+
+ \snippet examples/dialogs/findfiles/window.cpp 12
+
+ The \c openFileOfItem() slot is invoked when the user double
+ clicks on a cell in the table. The QDesktopServices::openUrl()
+ knows how to open a file given the file name.
+*/
+
diff --git a/doc/src/examples/flowlayout.qdoc b/doc/src/examples/flowlayout.qdoc
new file mode 100644
index 0000000..557ba39
--- /dev/null
+++ b/doc/src/examples/flowlayout.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example layouts/flowlayout
+ \title Flow Layout Example
+
+ The Flow Layout example demonstrates a custom layout that arranges child widgets from
+ left to right and top to bottom in a top-level widget.
+
+ \image flowlayout-example.png
+*/
diff --git a/doc/src/examples/fontsampler.qdoc b/doc/src/examples/fontsampler.qdoc
new file mode 100644
index 0000000..1fbb879
--- /dev/null
+++ b/doc/src/examples/fontsampler.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/fontsampler
+ \title Font Sampler Example
+
+ The Font Sampler example shows how to preview and print multi-page documents.
+
+ \image fontsampler-example.png
+*/
diff --git a/doc/src/examples/formextractor.qdoc b/doc/src/examples/formextractor.qdoc
new file mode 100644
index 0000000..b98f5bd
--- /dev/null
+++ b/doc/src/examples/formextractor.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example webkit/formextractor
+ \title Form Extractor Example
+
+ The Form Extractor example shows how to use QWebFrame with JavaScript to
+ extract form data.
+
+ \image formextractor-example.png
+
+*/
diff --git a/doc/src/examples/fortuneclient.qdoc b/doc/src/examples/fortuneclient.qdoc
new file mode 100644
index 0000000..cbdd164
--- /dev/null
+++ b/doc/src/examples/fortuneclient.qdoc
@@ -0,0 +1,174 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/fortuneclient
+ \title Fortune Client Example
+
+ The Fortune Client example shows how to create a client for a simple
+ network service using QTcpSocket. It is intended to be run alongside the
+ \l{network/fortuneserver}{Fortune Server} example or
+ the \l{network/threadedfortuneserver}{Threaded Fortune Server} example.
+
+ \image fortuneclient-example.png Screenshot of the Fortune Client example
+
+ This example uses a simple QDataStream-based data transfer protocol to
+ request a line of text from a fortune server (from the
+ \l{network/fortuneserver}{Fortune Server} example). The client requests a
+ fortune by simply connecting to the server. The server then responds with
+ a 16-bit (quint16) integer containing the length of the fortune text,
+ followed by a QString.
+
+ QTcpSocket supports two general approaches to network programming:
+
+ \list
+
+ \o \e{The asynchronous (non-blocking) approach.} Operations are scheduled
+ and performed when control returns to Qt's event loop. When the operation
+ is finished, QTcpSocket emits a signal. For example,
+ QTcpSocket::connectToHost() returns immediately, and when the connection
+ has been established, QTcpSocket emits
+ \l{QTcpSocket::connected()}{connected()}.
+
+ \o \e{The synchronous (blocking) approach.} In non-GUI and multithreaded
+ applications, you can call the \c waitFor...() functions (e.g.,
+ QTcpSocket::waitForConnected()) to suspend the calling thread until the
+ operation has completed, instead of connecting to signals.
+
+ \endlist
+
+ In this example, we will demonstrate the asynchronous approach. The
+ \l{network/blockingfortuneclient}{Blocking Fortune Client} example
+ illustrates the synchronous approach.
+
+ Our class contains some data and a few private slots:
+
+ \snippet examples/network/fortuneclient/client.h 0
+
+ Other than the widgets that make up the GUI, the data members include a
+ QTcpSocket pointer, a copy of the fortune text currently displayed, and
+ the size of the packet we are currently reading (more on this later).
+
+ The socket is initialized in the Client constructor. We'll pass the main
+ widget as parent, so that we won't have to worry about deleting the
+ socket:
+
+ \snippet examples/network/fortuneclient/client.cpp 0
+ \dots
+ \snippet examples/network/fortuneclient/client.cpp 1
+
+ The only QTcpSocket signals we need in this example are
+ QTcpSocket::readyRead(), signifying that data has been received, and
+ QTcpSocket::error(), which we will use to catch any connection errors:
+
+ \dots
+ \snippet examples/network/fortuneclient/client.cpp 3
+ \dots
+ \snippet examples/network/fortuneclient/client.cpp 5
+
+ Clicking the \gui{Get Fortune} button will invoke the \c
+ requestNewFortune() slot:
+
+ \snippet examples/network/fortuneclient/client.cpp 6
+
+ In this slot, we initialize \c blockSize to 0, preparing to read a new block
+ of data. Because we allow the user to click \gui{Get Fortune} before the
+ previous connection finished closing, we start off by aborting the
+ previous connection by calling QTcpSocket::abort(). (On an unconnected
+ socket, this function does nothing.) We then proceed to connecting to the
+ fortune server by calling QTcpSocket::connectToHost(), passing the
+ hostname and port from the user interface as arguments.
+
+ As a result of calling \l{QTcpSocket::connectToHost()}{connectToHost()},
+ one of two things can happen:
+
+ \list
+ \o \e{The connection is established.} In this case, the server will send us a
+ fortune. QTcpSocket will emit \l{QTcpSocket::readyRead()}{readyRead()}
+ every time it receives a block of data.
+
+ \o \e{An error occurs.} We need to inform the user if the connection
+ failed or was broken. In this case, QTcpSocket will emit
+ \l{QTcpSocket::error()}{error()}, and \c Client::displayError() will be
+ called.
+ \endlist
+
+ Let's go through the \l{QTcpSocket::error()}{error()} case first:
+
+ \snippet examples/network/fortuneclient/client.cpp 13
+
+ We pop up all errors in a dialog using
+ QMessageBox::information(). QTcpSocket::RemoteHostClosedError is silently
+ ignored, because the fortune server protocol ends with the server closing
+ the connection.
+
+ Now for the \l{QTcpSocket::readyRead()}{readyRead()} alternative. This
+ signal is connected to \c Client::readFortune():
+
+ \snippet examples/network/fortuneclient/client.cpp 8
+ \codeline
+ \snippet examples/network/fortuneclient/client.cpp 10
+
+ The protocol is based on QDataStream, so we start by creating a stream
+ object, passing the socket to QDataStream's constructor. We then
+ explicitly set the protocol version of the stream to QDataStream::Qt_4_0
+ to ensure that we're using the same version as the fortune server, no
+ matter which version of Qt the client and server use.
+
+ Now, TCP is based on sending a stream of data, so we cannot expect to get
+ the entire fortune in one go. Especially on a slow network, the data can
+ be received in several small fragments. QTcpSocket buffers up all incoming
+ data and emits \l{QTcpSocket::readyRead()}{readyRead()} for every new
+ block that arrives, and it is our job to ensure that we have received all
+ the data we need before we start parsing. The server's response starts
+ with the size of the packet, so first we need to ensure that we can read
+ the size, then we will wait until QTcpSocket has received the full packet.
+
+ \snippet examples/network/fortuneclient/client.cpp 11
+ \codeline
+ \snippet examples/network/fortuneclient/client.cpp 12
+
+ We proceed by using QDataStream's streaming operator to read the fortune
+ from the socket into a QString. Once read, we can call QLabel::setText()
+ to display the fortune.
+
+ \sa {Fortune Server Example}, {Blocking Fortune Client Example}
+*/
diff --git a/doc/src/examples/fortuneserver.qdoc b/doc/src/examples/fortuneserver.qdoc
new file mode 100644
index 0000000..e6a7f85
--- /dev/null
+++ b/doc/src/examples/fortuneserver.qdoc
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/fortuneserver
+ \title Fortune Server Example
+
+ The Fortune Server example shows how to create a server for a simple
+ network service. It is intended to be run alongside the
+ \l{network/fortuneclient}{Fortune Client} example or the the
+ \l{network/blockingfortuneclient}{Blocking Fortune Client} example.
+
+ \image fortuneserver-example.png Screenshot of the Fortune Server example
+
+ This example uses QTcpServer to accept incoming TCP connections, and a
+ simple QDataStream based data transfer protocol to write a fortune to the
+ connecting client (from the \l{network/fortuneclient}{Fortune Client}
+ example), before closing the connection.
+
+ \snippet examples/network/fortuneserver/server.h 0
+
+ The server is implemented using a simple class with only one slot, for
+ handling incoming connections.
+
+ \snippet examples/network/fortuneserver/server.cpp 1
+
+ In its constructor, our Server object calls QTcpServer::listen() to set up
+ a QTcpServer to listen on all addresses, on an arbitrary port. In then
+ displays the port QTcpServer picked in a label, so that user knows which
+ port the fortune client should connect to.
+
+ \snippet examples/network/fortuneserver/server.cpp 2
+
+ Our server generates a list of random fortunes that is can send to
+ connecting clients.
+
+ \snippet examples/network/fortuneserver/server.cpp 3
+
+ When a client connects to our server, QTcpServer will emit
+ QTcpServer::newConnection(). In turn, this will invoke our
+ sendFortune() slot:
+
+ \snippet examples/network/fortuneserver/server.cpp 4
+
+ The purpose of this slot is to select a random line from our list of
+ fortunes, encode it into a QByteArray using QDataStream, and then write it
+ to the connecting socket. This is a common way to transfer binary data
+ using QTcpSocket. First we create a QByteArray and a QDataStream object,
+ passing the bytearray to QDataStream's constructor. We then explicitly set
+ the protocol version of QDataStream to QDataStream::Qt_4_0 to ensure that
+ we can communicate with clients from future versions of Qt. (See
+ QDataStream::setVersion().)
+
+ \snippet examples/network/fortuneserver/server.cpp 6
+
+ At the start of our QByteArray, we reserve space for a 16 bit integer that
+ will contain the total size of the data block we are sending. We continue
+ by streaming in a random fortune. Then we seek back to the beginning of
+ the QByteArray, and overwrite the reserved 16 bit integer value with the
+ total size of the array. By doing this, we provide a way for clients to
+ verify how much data they can expect before reading the whole packet.
+
+ \snippet examples/network/fortuneserver/server.cpp 7
+
+ We then call QTcpServer::newPendingConnection(), which returns the
+ QTcpSocket representing the server side of the connection. By connecting
+ QTcpSocket::disconnected() to QObject::deleteLater(), we ensure that the
+ socket will be deleted after disconnecting.
+
+ \snippet examples/network/fortuneserver/server.cpp 8
+
+ The encoded fortune is written using QTcpSocket::write(), and we finally
+ call QTcpSocket::disconnectFromHost(), which will close the connection
+ after QTcpSocket has finished writing the fortune to the network. Because
+ QTcpSocket works asynchronously, the data will be written after this
+ function returns, and control goes back to Qt's event loop. The socket
+ will then close, which in turn will cause QObject::deleteLater() to delete
+ it.
+
+ \sa {Fortune Client Example}, {Threaded Fortune Server Example}
+ */
diff --git a/doc/src/examples/framebufferobject.qdoc b/doc/src/examples/framebufferobject.qdoc
new file mode 100644
index 0000000..3220641
--- /dev/null
+++ b/doc/src/examples/framebufferobject.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/framebufferobject
+ \title Framebuffer Object Example
+
+ The Framebuffer Object example demonstrates how to use the
+ QGLFramebufferObject class to render into an off-screen buffer and
+ use the contents as a texture in a QGLWidget.
+
+ \image framebufferobject-example.png
+*/
diff --git a/doc/src/examples/framebufferobject2.qdoc b/doc/src/examples/framebufferobject2.qdoc
new file mode 100644
index 0000000..721706a
--- /dev/null
+++ b/doc/src/examples/framebufferobject2.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/framebufferobject2
+ \title Framebuffer Object 2 Example
+
+ The Framebuffer Object 2 example demonstrates how to use the
+ QGLFramebufferObject class to render into an off-screen buffer and
+ use the contents as a texture in a QGLWidget.
+
+ \image framebufferobject2-example.png
+*/
diff --git a/doc/src/examples/fridgemagnets.qdoc b/doc/src/examples/fridgemagnets.qdoc
new file mode 100644
index 0000000..de95b52
--- /dev/null
+++ b/doc/src/examples/fridgemagnets.qdoc
@@ -0,0 +1,374 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example draganddrop/fridgemagnets
+ \title Fridge Magnets Example
+
+ The Fridge Magnets example shows how to supply more than one type
+ of MIME-encoded data with a drag and drop operation.
+
+ \image fridgemagnets-example.png
+
+ With this application the user can play around with a collection
+ of fridge magnets, using drag and drop to form new sentences from
+ the words on the magnets. The example consists of two classes:
+
+ \list
+ \o \c DragLabel is a custom widget representing one
+ single fridge magnet.
+ \o \c DragWidget provides the main application window.
+ \endlist
+
+ We will first take a look at the \c DragLabel class, then we will
+ examine the \c DragWidget class.
+
+ \section1 DragLabel Class Definition
+
+ Each fridge magnet is represented by an instance of the \c
+ DragLabel class:
+
+ \snippet examples/draganddrop/fridgemagnets/draglabel.h 0
+
+ Each instance of this QLabel subclass will be used to display an
+ pixmap generated from a text string. Since we cannot store both
+ text and a pixmap in a standard label, we declare a private variable
+ to hold the original text, and we define an additional member
+ function to allow it to be accessed.
+
+ \section1 DragLabel Class Implementation
+
+ In the \c DragLabel constructor, we first create a QImage object
+ on which we will draw the fridge magnet's text and frame:
+
+ \snippet examples/draganddrop/fridgemagnets/draglabel.cpp 0
+
+ Its size depends on the current font size, and its format is
+ QImage::Format_ARGB32_Premultiplied; i.e., the image is stored
+ using a premultiplied 32-bit ARGB format (0xAARRGGBB).
+
+ We then construct a font object that uses the application's
+ default font, and set its style strategy. The style strategy tells
+ the font matching algorithm what type of fonts should be used to
+ find an appropriate default family. The QFont::ForceOutline forces
+ the use of outline fonts.
+
+ To draw the text and frame onto the image, we use the QPainter
+ class. QPainter provides highly optimized methods to do most of
+ the drawing GUI programs require. It can draw everything from
+ simple lines to complex shapes like pies and chords. It can also
+ draw aligned text and pixmaps.
+
+ \snippet examples/draganddrop/fridgemagnets/draglabel.cpp 1
+
+ A painter can be activated by passing a paint device to the
+ constructor, or by using the \l{QPainter::}{begin()} method as we
+ do in this example. The \l{QPainter::}{end()} method deactivates
+ it. Note that the latter function is called automatically upon
+ destruction when the painter is actived by its constructor. The
+ QPainter::Antialiasing render hint ensures that the paint engine
+ will antialias the edges of primitives if possible.
+
+ When the painting is done, we convert our image to a pixmap using
+ QPixmap's \l {QPixmap::}{fromImage()} method. This method also
+ takes an optional flags argument, and converts the given image to
+ a pixmap using the specified flags to control the conversion (the
+ flags argument is a bitwise-OR of the Qt::ImageConversionFlags;
+ passing 0 for flags sets all the default options).
+
+ \snippet examples/draganddrop/fridgemagnets/draglabel.cpp 2
+
+ Finally, we set the label's \l{QLabel::pixmap}{pixmap property}
+ and store the label's text for later use.
+
+ \e{Note that setting the pixmap clears any previous content, including
+ any text previously set using QLabel::setText(), and disables
+ the label widget's buddy shortcut, if any.}
+
+ \section1 DragWidget Class Definition
+
+ The \c DragWidget class inherits QWidget, providing support for
+ drag and drop operations:
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.h 0
+
+ To make the widget responsive to drag and drop operations, we simply
+ reimplement the \l{QWidget::}{dragEnterEvent()},
+ \l{QWidget::}{dragMoveEvent()} and \l{QWidget::}{dropEvent()} event
+ handlers inherited from QWidget.
+
+ We also reimplement \l{QWidget::}{mousePressEvent()} to make the
+ widget responsive to mouse clicks. This is where we will write code
+ to start drag and drop operations.
+
+ \section1 DragWidget Class Implementation
+
+ In the constructor, we first open the file containing the words on
+ our fridge magnets:
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 0
+
+ QFile is an I/O device for reading and writing text and binary
+ files and resources, and may be used by itself or in combination
+ with QTextStream or QDataStream. We have chosen to read the
+ contents of the file using the QTextStream class that provides a
+ convenient interface for reading and writing text.
+
+ We then create the fridge magnets. As long as there is data (the
+ QTextStream::atEnd() method returns true if there is no more data
+ to be read from the stream), we read one line at a time using
+ QTextStream's \l {QTextStream::}{readLine()} method.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 1
+
+ For each line, we create a \c DragLabel object using the read line
+ as text, we calculate its position and ensure that it is visible by
+ calling the QWidget::show() method. We set the Qt::WA_DeleteOnClose
+ attribute on each label to ensure that any unused labels will be
+ deleted; we will need to create new labels and delete old ones when
+ they are dragged around, and this ensures that the example does not
+ leak memory.
+
+ We also set the \c FridgeMagnets widget's palette, minimum size
+ and window title.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 2
+
+ Finally, to enable our user to move the fridge magnets around, we
+ must also set the \c FridgeMagnets widget's
+ \l{QWidget::acceptDrops}{acceptDrops} property.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 3
+
+ Setting this property to true announces to the system that this
+ widget \e may be able to accept drop events (events that are sent
+ when drag and drop actions are completed). Later, we will
+ implement the functions that ensure that the widget accepts the
+ drop events it is interested in.
+
+ \section2 Dragging
+
+ Let's take a look at the \l{QWidget::}{mousePressEvent()} event
+ handler, where drag and drop operations begin:
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 13
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 14
+
+ Mouse events occur when a mouse button is pressed or released
+ inside a widget, or when the mouse cursor is moved. By
+ reimplementing the \l{QWidget::}{mousePressEvent()} method we
+ ensure that we will receive mouse press events for the widget
+ containing the fridge magnets.
+
+ Whenever we receive such an event, we first check to see if the
+ position of the click coincides with one of the labels. If not,
+ we simply return.
+
+ If the user clicked a label, we determine the position of the
+ \e{hot spot} (the position of the click relative to the top-left
+ corner of the label). We create a byte array to store the label's
+ text and the hot spot, and we use a QDataStream object to stream
+ the data into the byte array.
+
+ With all the information in place, we create a new QMimeData object.
+ As mentioned above, QMimeData objects associate the data that they
+ hold with the corresponding MIME types to ensure that information
+ can be safely transferred between applications. The
+ \l{QMimeData::}{setData()} method sets the data associated with a
+ given MIME type. In our case, we associate our item data with the
+ custom \c application/x-fridgemagnet type.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 15
+
+ Note that we also associate the magnet's text with the
+ \c text/plain MIME type using QMimeData's \l{QMimeData::}{setText()}
+ method. Below, we will see how our widget detects both these MIME
+ types with its event handlers.
+
+ Finally, we create a QDrag object. It is the QDrag class that
+ handles most of the details of a drag and drop operation,
+ providing support for MIME-based drag and drop data transfer. The
+ data to be transferred by the drag and drop operation is contained
+ in a QMimeData object. When we call QDrag's
+ \l{QDrag::}{setMimeData()} method the ownership of our item data is
+ transferred to the QDrag object.
+
+ We call the \l{QDrag::}{setPixmap()} function to set the pixmap used
+ to represent the data during the drag and drop operation.
+ Typically, this pixmap shows an icon that represents the MIME type
+ of the data being transferred, but any pixmap can be used. In this
+ example, we simply use the pixmap used by the label itself to make
+ it look like the fridge magnet itself is being moved.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 16
+
+ We also specify the cursor's hot spot, its position relative to the
+ top-level corner of the drag pixmap, to be the point we calculated
+ above. This makes the process of dragging the label feel more natural
+ because the cursor always points to the same place on the label
+ during the drag operation.
+
+ We start the drag operation using QDrag's \l{QDrag::}{exec()} function,
+ requesting that the magnet is copied when the drag is completed.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 17
+
+ The function returns the drop action actually performed by the user
+ (this can be either a copy or a move action in this case); if this
+ action is equal to Qt::MoveAction we will close the activated
+ fridge magnet widget because we will create a new one to replace it
+ (see the \l{drop}{dropEvent()} implementation). Otherwise, if
+ the drop is outside our main widget, we simply show the widget in
+ its original position.
+
+ \section2 Dropping
+
+ When a a drag and drop action enters our widget, we will receive a
+ drag enter \e event. QDragEnterEvent inherits most of its
+ functionality from QDragMoveEvent, which in turn inherits most of
+ its functionality from QDropEvent. Note that we must accept this
+ event in order to receive the drag move events that are sent while
+ the drag and drop action is in progress. The drag enter event is
+ always immediately followed by a drag move event.
+
+ In our \c dragEnterEvent() implementation, we first determine
+ whether we support the event's MIME type or not:
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 4
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 5
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 6
+
+ If the type is \c application/x-fridgemagnet and the event
+ origins from any of this application's fridge magnet widgets, we
+ first set the event's drop action using the
+ QDropEvent::setDropAction() method. An event's drop action is the
+ action to be performed on the data by the target. Qt::MoveAction
+ indicates that the data is moved from the source to the target.
+
+ Then we call the event's \l {QDragMoveEvent::}{accept()} method to
+ indicate that we have handled the event. In general, unaccepted
+ events might be propagated to the parent widget. If the event
+ origins from any other widget, we simply accept the proposed
+ action.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 7
+
+ We also accept the proposed action if the event's MIME type is \c
+ text/plain, i.e., if QMimeData::hasText() returns true. If the
+ event has any other type, on the other hand, we call the event's
+ \l {QDragMoveEvent::}{ignore()} method allowing the event to be
+ propagated further.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 8
+
+ Drag move events occur when the cursor enters a widget, when it
+ moves within the widget, and when a modifier key is pressed on the
+ keyboard while the widget has focus. Our widget will receive drag
+ move events repeatedly while a drag is within its boundaries. We
+ reimplement the \l {QWidget::}{dragMoveEvent()} method, and
+ examine the event in the exact same way as we did with drag enter
+ events.
+
+ Note that the \l{QWidget::}{dropEvent()} event handler behaves
+ slightly differently: We first get hold of the event's MIME
+ data.
+
+ \target drop
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 9
+
+ The QMimeData class provides a container for data that
+ records information about its MIME type. QMimeData objects
+ associate the data that they hold with the corresponding MIME
+ types to ensure that information can be safely transferred between
+ applications, and copied around within the same application.
+
+ We retrieve the data associated with the \c application/x-fridgemagnet
+ MIME type using a data stream in order to create a new \c DragLabel
+ object.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 10
+
+ The QDataStream class provides serialization of binary data to a
+ QIODevice (a data stream is a binary stream of encoded information
+ which is completely independent of the host computer's operating
+ system, CPU or byte order).
+
+ Finally, we create a label and move it to the event's position:
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 11
+
+ If the source of the event is also the widget receiving the
+ drop event, we set the event's drop action to Qt::MoveAction and
+ call the event's \l{QDragMoveEvent::}{accept()}
+ method. Otherwise, we simply accept the proposed action. This
+ means that labels are moved rather than copied in the same
+ window. However, if we drag a label to a second instance of the
+ Fridge Magnets example, the default action is to copy it, leaving
+ the original in the first instance.
+
+ If the event's MIME type is \c text/plain (i.e., if
+ QMimeData::hasText() returns true) we retrieve its text and split
+ it into words. For each word we create a new \c DragLabel action,
+ and show it at the event's position plus an offset depending on
+ the number of words in the text. In the end we accept the proposed
+ action. This lets the user drop selected text from a text editor or
+ Web browser onto the widget to add more fridge magnets.
+
+ \snippet examples/draganddrop/fridgemagnets/dragwidget.cpp 12
+
+ If the event has any other type, we call the event's
+ \l{QDragMoveEvent::}{ignore()} method allowing the event to be
+ propagated further.
+
+ \section1 Summary
+
+ We set our main widget's \l{QWidget::}{acceptDrops} property
+ and reimplemented QWidget's \l{QWidget::}{dragEnterEvent()},
+ \l{QWidget::}{dragMoveEvent()} and \l{QWidget::}{dropEvent()} event
+ handlers to support content dropped on our widget.
+
+ In addition, we reimplemented the \l{QWidget::}{mousePressEvent()}
+ function to let the user pick up fridge magnets in the first place.
+
+ Because data is communicated using drag and drop operations and
+ encoded using MIME types, you can run more than one instance of this
+ example, and transfer magnets between them.
+*/
diff --git a/doc/src/examples/ftp.qdoc b/doc/src/examples/ftp.qdoc
new file mode 100644
index 0000000..9cc9cd1
--- /dev/null
+++ b/doc/src/examples/ftp.qdoc
@@ -0,0 +1,211 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/ftp
+ \title FTP Example
+
+ The FTP example demonstrates a simple FTP client that can be used
+ to list the available files on an FTP server and download them.
+
+ \image ftp-example.png
+
+ The user of the example can enter the address or hostname of an
+ FTP server in the \gui {Ftp Server} line edit, and then push the
+ \gui Connect button to connect to it. A list of the server's
+ top-level directory is then presented in the \gui {File List} tree
+ view. If the selected item in the view is a file, the user can
+ download it by pushing the \gui Download button. An item
+ representing a directory can be double clicked with the mouse to
+ show the contents of that directory in the view.
+
+ The functionality required for the example is implemented in the
+ QFtp class, which provides an easy, high-level interface to the
+ file transfer protocol. FTP operations are requested through
+ \l{QFtp::Command}s. The operations are asynchronous. QFtp will
+ notify us through signals when commands are started and finished.
+
+ We have one class, \c FtpWindow, which sets up the GUI and handles
+ the FTP functionality. We will now go through its definition and
+ implementation - focusing on the code concerning FTP. The code for
+ managing the GUI is explained in other examples.
+
+ \section1 FtpWindow Class Definition
+
+ The \c FtpWindow class displays a window, in which the user can
+ connect to and browse the contents of an FTP server. The slots of
+ \c FtpWindow are connected to its widgets, and contain the
+ functionality for managing the FTP connection. We also connect to
+ signals in QFtp, which tells us when the
+ \l{QFtp::Command}{commands} we request are finished, the progress
+ of current commands, and information about files on the server.
+
+ \snippet examples/network/ftp/ftpwindow.h 0
+
+ We will look at each slot when we examine the \c FtpWindow
+ implementation in the next section. We also make use of a few
+ private variables:
+
+ \snippet examples/network/ftp/ftpwindow.h 1
+
+ The \c isDirectory hash keeps a history of all entries explored on
+ the FTP server, and registers whether an entry represents a
+ directory or a file. We use the QFile object to download files
+ from the FTP server.
+
+ \section1 FtpWindow Class Implementation
+
+ We skip the \c FtpWindow constructor as it only contains code for
+ setting up the GUI, which is explained in other examples.
+
+ We move on to the slots, starting with \c connectOrDisconnect().
+
+ \snippet examples/network/ftp/ftpwindow.cpp 0
+
+ If \c ftp is already pointing to a QFtp object, we QFtp::Close its
+ FTP connection and delete the object it points to. Note that we do
+ not delete the object using standard C++ \c delete as we need it
+ to finish its abort operation.
+
+ \dots
+ \snippet examples/network/ftp/ftpwindow.cpp 1
+
+ If we get here, \c connectOrDisconnect() was called to establish a
+ new FTP connection. We create a new QFtp for our new connection,
+ and connect its signals to slots in \c FtpWindow. The
+ \l{QFtp::}{listInfo()} signal is emitted whenever information
+ about a single file on the sever has been resolved. This signal is
+ sent when we ask QFtp to \l{QFtp::}{list()} the contents of a
+ directory. Finally, the \l{QFtp::}{dataTransferProgress()} signal
+ is emitted repeatedly during an FTP file transfer, giving us
+ progress reports.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 2
+
+ The \gui {Ftp Server} line edit contains the IP address or
+ hostname of the server to which we want to connect. We first check
+ that the URL is a valid FTP sever address. If it isn't, we still
+ try to connect using the plain text in \c ftpServerLineEdit. In
+ either case, we assume that port \c 21 is used.
+
+ If the URL does not contain a user name and password, we use
+ QFtp::login(), which will attempt to log into the FTP sever as an
+ anonymous user. The QFtp object will now notify us when it has
+ connected to the FTP server; it will also send a signal if it
+ fails to connect or the username and password were rejected.
+
+ We move on to the \c downloadFile() slot:
+
+ \snippet examples/network/ftp/ftpwindow.cpp 3
+ \dots
+ \snippet examples/network/ftp/ftpwindow.cpp 4
+
+ We first fetch the name of the file, which we find in the selected
+ item of \c fileList. We then start the download by using
+ QFtp::get(). QFtp will send progress signals during the download
+ and a signal when the download is completed.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 5
+
+ QFtp supports canceling the download of files.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 6
+
+ The \c ftpCommandFinished() slot is called when QFtp has
+ finished a QFtp::Command. If an error occurred during the
+ command, QFtp will set \c error to one of the values in
+ the QFtp::Error enum; otherwise, \c error is zero.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 7
+
+ After login, the QFtp::list() function will list the top-level
+ directory on the server. addToList() is connected to
+ QFtp::listInfo(), and will be invoked for each entry in that
+ directory.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 8
+
+ When a \l{QFtp::}{Get} command is finished, a file has finished
+ downloading (or an error occurred during the download).
+
+ \snippet examples/network/ftp/ftpwindow.cpp 9
+
+ After a \l{QFtp::}{List} command is performed, we have to check if
+ no entries were found (in which case our \c addToList() function
+ would not have been called).
+
+ Let's continue with the the \c addToList() slot:
+
+ \snippet examples/network/ftp/ftpwindow.cpp 10
+
+ When a new file has been resolved during a QFtp::List command,
+ this slot is invoked with a QUrlInfo describing the file. We
+ create a separate row for the file in \c fileList. If \c fileList
+ does not have a current item, we set the new item to be the
+ current item.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 11
+
+ The \c processItem() slot is called when an item is double clicked
+ in the \gui {File List}. If the item represents a directory, we
+ want to load the contents of that directory with QFtp::list().
+
+ \snippet examples/network/ftp/ftpwindow.cpp 12
+
+ \c cdToParent() is invoked when the the user requests to go to the
+ parent directory of the one displayed in the file list. After
+ changing the directory, we QFtp::List its contents.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 13
+
+ The \c updateDataTransferProgress() slot is called regularly by
+ QFtp::dataTransferProgress() when a file download is in progress.
+ We use a QProgressDialog to show the download progression to the
+ user.
+
+ \snippet examples/network/ftp/ftpwindow.cpp 14
+
+ The \c enableDownloadButton() is called whenever the current item
+ in \c fileList changes. If the item represents a file, the \gui
+ {Enable Download} Button should be enabled; otherwise, it is
+ disabled.
+*/
+
diff --git a/doc/src/examples/globalVariables.qdoc b/doc/src/examples/globalVariables.qdoc
new file mode 100644
index 0000000..e1b83fe
--- /dev/null
+++ b/doc/src/examples/globalVariables.qdoc
@@ -0,0 +1,238 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xmlpatterns/xquery/globalVariables
+ \title C++ Source Code Analyzer Example
+
+ This example uses XQuery and the \c xmlpatterns command line utility to
+ query C++ source code.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ Suppose we want to analyze C++ source code to find coding standard
+ violations and instances of bad or inefficient patterns. We can do
+ it using the common searching and pattern matching utilities to
+ process the C++ files (e.g., \c{grep}, \c{sed}, and \c{awk}). Now
+ we can also use XQuery with the QtXmlPatterns module.
+
+ An extension to the \c{g++} open source C++ compiler
+ (\l{http://public.kitware.com/GCC_XML/HTML/Index.html} {GCC-XML})
+ generates an XML description of C++ source code declarations. This
+ XML description can then be processed by QtXmlPatterns using
+ XQueries to navigate the XML description of the C++ source and
+ produce a report. Consider the problem of finding mutable global
+ variables:
+
+ \section2 Reporting Uses of Mutable Global Variables
+
+ Suppose we want to introduce threading to a C++ application that
+ was originally written without threading. In a threaded program,
+ mutable global variables can cause bugs, because one thread might
+ change a global variable that other threads are reading, or two
+ threads might try to set the same global variable. So when
+ converting our program to use threading, one of the things we must
+ do is protect the global variables to prevent the bugs described
+ above. How can we use XQuery and
+ \l{http://public.kitware.com/GCC_XML/HTML/Index.html} {GCC-XML} to
+ find the variables that need protecting?
+
+ \section3 A C++ application
+
+ Consider the declarations in this hypothetical C++ application:
+
+ \snippet examples/xmlpatterns/xquery/globalVariables/globals.cpp 0
+
+ \section3 The XML description of the C++ application
+
+ Submitting this C++ source to
+ \l{http://public.kitware.com/GCC_XML/HTML/Index.html} {GCC-XML}
+ produces this XML description:
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/globals.gccxml
+ \printuntil
+
+ \section3 The XQuery for finding global variables
+
+ We need an XQuery to find the global variables in the XML
+ description. Here is our XQuery source. We walk through it in
+ \l{XQuery Code Walk-Through}.
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \printuntil
+
+ \section3 Running the XQuery
+
+ To run the XQuery using the \c xmlpatterns command line utility,
+ enter the following command:
+
+ \code
+ xmlpatterns reportGlobals.xq -param fileToOpen=globals.gccxml -output globals.html
+ \endcode
+
+ \section3 The XQuery output
+
+ The \c xmlpatterns command loads and parses \c globals.gccxml,
+ runs the XQuery \c reportGlobals.xq, and generates this report:
+
+ \raw HTML
+<html xmlns="http://www.w3.org/1999/xhtml/" xml:lang="en" lang="en">
+ <head>
+ <title>Global variables report for globals.gccxml</title>
+ </head>
+ <style type="text/css">
+ .details
+ {
+ text-align: left;
+ font-size: 80%;
+ color: blue
+ }
+ .variableName
+ {
+ font-family: courier;
+ color: blue
+ }
+ </style>
+ <body>
+ <p class="details">Start report: 2008-12-16T13:43:49.65Z</p>
+ <p>Global variables with complex types:</p>
+ <ol>
+ <li>
+ <span class="variableName">mutableComplex1</span> in globals.cpp at line 14</li>
+ <li>
+ <span class="variableName">mutableComplex2</span> in globals.cpp at line 15</li>
+ <li>
+ <span class="variableName">constComplex1</span> in globals.cpp at line 16</li>
+ <li>
+ <span class="variableName">constComplex2</span> in globals.cpp at line 17</li>
+ </ol>
+ <p>Mutable global variables with primitives types:</p>
+ <ol>
+ <li>
+ <span class="variableName">mutablePrimitive1</span> in globals.cpp at line 1</li>
+ <li>
+ <span class="variableName">mutablePrimitive2</span> in globals.cpp at line 2</li>
+ </ol>
+ <p class="details">End report: 2008-12-16T13:43:49.65Z</p>
+ </body>
+</html>
+ \endraw
+
+ \section1 XQuery Code Walk-Through
+
+ The XQuery source is in
+ \c{examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq}
+ It begins with two variable declarations that begin the XQuery:
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \skipto declare variable
+ \printto (:
+
+ The first variable, \c{$fileToOpen}, appears in the \c xmlpatterns
+ command shown earlier, as \c{-param fileToOpen=globals.gccxml}.
+ This binds the variable name to the file name. This variable is
+ then used in the declaration of the second variable, \c{$inDoc},
+ as the parameter to the
+ \l{http://www.w3.org/TR/xpath-functions/#func-doc} {doc()}
+ function. The \c{doc()} function returns the document node of
+ \c{globals.gccxml}, which is assigned to \c{$inDoc} to be used
+ later in the XQuery as the root node of our searches for global
+ variables.
+
+ Next skip to the end of the XQuery, where the \c{<html>} element
+ is constructed. The \c{<html>} will contain a \c{<head>} element
+ to specify a heading for the html page, followed by some style
+ instructions for displaying the text, and then the \c{<body>}
+ element.
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \skipto <html xmlns
+ \printuntil
+
+ The \c{<body>} element contains a call to the \c{local:report()}
+ function, which is where the query does the "heavy lifting." Note
+ the two \c{return} clauses separated by the \e {comma operator}
+ about halfway down:
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \skipto declare function local:report()
+ \printuntil };
+
+ The \c{return} clauses are like two separate queries. The comma
+ operator separating them means that both \c{return} clauses are
+ executed and both return their results, or, rather, both output
+ their results. The first \c{return} clause searches for global
+ variables with complex types, and the second searches for mutable
+ global variables with primitive types.
+
+ Here is the html generated for the \c{<body>} element. Compare
+ it with the XQuery code above:
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/globals.html
+ \skipto <body>
+ \printuntil </body>
+
+ The XQuery declares three more local functions that are called in
+ turn by the \c{local:report()} function. \c{isComplexType()}
+ returns true if the variable has a complex type. The variable can
+ be mutable or const.
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \skipto declare function local:isComplexType
+ \printuntil };
+
+ \c{isPrimitive()} returns true if the variable has a primitive
+ type. The variable must be mutable.
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \skipto declare function local:isPrimitive
+ \printuntil };
+
+ \c{location()} returns a text constructed from the variable's file
+ and line number attributes.
+
+ \quotefromfile examples/xmlpatterns/xquery/globalVariables/reportGlobals.xq
+ \skipto declare function local:location
+ \printuntil };
+
+ */
diff --git a/doc/src/examples/grabber.qdoc b/doc/src/examples/grabber.qdoc
new file mode 100644
index 0000000..efb5b6f
--- /dev/null
+++ b/doc/src/examples/grabber.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/grabber
+ \title Grabber Example
+
+ The Grabber examples shows how to retrieve the contents of an OpenGL framebuffer.
+
+ \image grabber-example.png
+*/
diff --git a/doc/src/examples/groupbox.qdoc b/doc/src/examples/groupbox.qdoc
new file mode 100644
index 0000000..c5f6a62
--- /dev/null
+++ b/doc/src/examples/groupbox.qdoc
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/groupbox
+ \title Group Box Example
+
+ The Group Box example shows how to use the different kinds of group
+ boxes in Qt.
+
+ Group boxes are container widgets that organize buttons into groups,
+ both logically and on screen. They manage the interactions between
+ the user and the application so that you do not have to enforce
+ simple constraints.
+
+ Group boxes are usually used to organize check boxes and radio
+ buttons into exclusive groups.
+
+ \image groupbox-example.png
+
+ The Group Boxes example consists of a single \c Window class that
+ is used to show four group boxes: an exclusive radio button group,
+ a non-exclusive checkbox group, an exclusive radio button group
+ with an enabling checkbox, and a group box with normal push buttons.
+
+ \section1 Window Class Definition
+
+ The \c Window class is a subclass of \c QWidget that is used to
+ display a number of group boxes. The class definition contains
+ functions to construct each group box and populate it with different
+ selections of button widgets:
+
+ \snippet examples/widgets/groupbox/window.h 0
+
+ In the example, the widget will be used as a top-level window, so
+ the constructor is defined so that we do not have to specify a parent
+ widget.
+
+ \section1 Window Class Implementation
+
+ The constructor creates a grid layout and fills it with each of the
+ group boxes that are to be displayed:
+
+ \snippet examples/widgets/groupbox/window.cpp 0
+
+ The functions used to create each group box each return a
+ QGroupBox to be inserted into the grid layout.
+
+ \snippet examples/widgets/groupbox/window.cpp 1
+
+ The first group box contains and manages three radio buttons. Since
+ the group box contains only radio buttons, it is exclusive by
+ default, so only one radio button can be checked at any given time.
+ We check the first radio button to ensure that the button group
+ contains one checked button.
+
+ \snippet examples/widgets/groupbox/window.cpp 3
+
+ We use a vertical layout within the group box to present the
+ buttons in the form of a vertical list, and return the group
+ box to the constructor.
+
+ The second group box is itself checkable, providing a convenient
+ way to disable all the buttons inside it. Initially, it is
+ unchecked, so the group box itself must be checked before any of
+ the radio buttons inside can be checked.
+
+ \snippet examples/widgets/groupbox/window.cpp 4
+
+ The group box contains three exclusive radio buttons, and an
+ independent checkbox. For consistency, one radio button must be
+ checked at all times, so we ensure that the first one is initially
+ checked.
+
+ \snippet examples/widgets/groupbox/window.cpp 5
+
+ The buttons are arranged in the same way as those in the first
+ group box.
+
+ \snippet examples/widgets/groupbox/window.cpp 6
+
+ The third group box is constructed with a "flat" style that is
+ better suited to certain types of dialog.
+
+ \snippet examples/widgets/groupbox/window.cpp 7
+
+ This group box contains only checkboxes, so it is non-exclusive by
+ default. This means that each checkbox can be checked independently
+ of the others.
+
+ \snippet examples/widgets/groupbox/window.cpp 8
+
+ Again, we use a vertical layout within the group box to present
+ the buttons in the form of a vertical list.
+
+ \snippet examples/widgets/groupbox/window.cpp 9
+
+ The final group box contains only push buttons and, like the
+ second group box, it is checkable.
+
+ \snippet examples/widgets/groupbox/window.cpp 10
+
+ We create a normal button, a toggle button, and a flat push button:
+
+ \snippet examples/widgets/groupbox/window.cpp 11
+
+ Push buttons can be used to display popup menus. We create one, and
+ attach a simple menu to it:
+
+ \snippet examples/widgets/groupbox/window.cpp 12
+
+ Finally, we lay out the widgets vertically, and return the group box
+ that we created:
+
+ \snippet examples/widgets/groupbox/window.cpp 13
+*/
diff --git a/doc/src/examples/hellogl.qdoc b/doc/src/examples/hellogl.qdoc
new file mode 100644
index 0000000..2fc51a3
--- /dev/null
+++ b/doc/src/examples/hellogl.qdoc
@@ -0,0 +1,272 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/hellogl
+ \title Hello GL Example
+
+ The Hello GL example demonstrates the basic use of the OpenGL-related classes
+ provided with Qt.
+
+ \image hellogl-example.png
+
+ Qt provides the QGLWidget class to enable OpenGL graphics to be rendered within
+ a standard application user interface. By subclassing this class, and providing
+ reimplementations of event handler functions, 3D scenes can be displayed on
+ widgets that can be placed in layouts, connected to other objects using signals
+ and slots, and manipulated like any other widget.
+
+ \tableofcontents
+
+ \section1 GLWidget Class Definition
+
+ The \c GLWidget class contains some standard public definitions for the
+ constructor, destructor, \l{QWidget::sizeHint()}{sizeHint()}, and
+ \l{QWidget::minimumSizeHint()}{minimumSizeHint()} functions:
+
+ \snippet examples/opengl/hellogl/glwidget.h 0
+
+ We use a destructor to ensure that any OpenGL-specific data structures
+ are deleted when the widget is no longer needed.
+
+ \snippet examples/opengl/hellogl/glwidget.h 1
+
+ The signals and slots are used to allow other objects to interact with the
+ 3D scene.
+
+ \snippet examples/opengl/hellogl/glwidget.h 2
+
+ OpenGL initialization, viewport resizing, and painting are handled by
+ reimplementing the QGLWidget::initializeGL(), QGLWidget::resizeGL(), and
+ QGLWidget::paintGL() handler functions. To enable the user to interact
+ directly with the scene using the mouse, we reimplement
+ QWidget::mousePressEvent() and QWidget::mouseMoveEvent().
+
+ \snippet examples/opengl/hellogl/glwidget.h 3
+
+ The rest of the class contains utility functions and variables that are
+ used to construct and hold orientation information for the scene. The
+ \c object variable will be used to hold an identifier for an OpenGL
+ display list.
+
+ \section1 GLWidget Class Implementation
+
+ In this example, we split the class into groups of functions and describe
+ them separately. This helps to illustrate the differences between subclasses
+ of native widgets (such as QWidget and QFrame) and QGLWidget subclasses.
+
+ \section2 Widget Construction and Sizing
+
+ The constructor provides default rotation angles for the scene, initializes
+ the variable used for the display list, and sets up some colors for later use.
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 0
+
+ We also implement a destructor to release OpenGL-related resources when the
+ widget is deleted:
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 1
+
+ The destructor ensures that the display list is deleted properly.
+
+ We provide size hint functions to ensure that the widget is shown at a
+ reasonable size:
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 2
+ \codeline
+ \snippet examples/opengl/hellogl/glwidget.cpp 3
+ \snippet examples/opengl/hellogl/glwidget.cpp 4
+
+ The widget provides three slots that enable other components in the
+ example to change the orientation of the scene:
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 5
+
+ In the above slot, the \c xRot variable is updated only if the new angle
+ is different to the old one, the \c xRotationChanged() signal is emitted to
+ allow other components to be updated, and the widget's
+ \l{QGLWidget::updateGL()}{updateGL()} handler function is called.
+
+ The \c setYRotation() and \c setZRotation() slots perform the same task for
+ rotations measured by the \c yRot and \c zRot variables.
+
+ \section2 OpenGL Initialization
+
+ The \l{QGLWidget::initializeGL()}{initializeGL()} function is used to
+ perform useful initialization tasks that are needed to render the 3D scene.
+ These often involve defining colors and materials, enabling and disabling
+ certain rendering flags, and setting other properties used to customize the
+ rendering process.
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 6
+
+ In this example, we reimplement the function to set the background color,
+ create a display list containing information about the object we want to
+ display, and set up the rendering process to use a particular shading model
+ and rendering flags:
+
+ \section2 Resizing the Viewport
+
+ The \l{QGLWidget::resizeGL()}{resizeGL()} function is used to ensure that
+ the OpenGL implementation renders the scene onto a viewport that matches the
+ size of the widget, using the correct transformation from 3D coordinates to
+ 2D viewport coordinates.
+
+ The function is called whenever the widget's dimensions change, and is
+ supplied with the new width and height. Here, we define a square viewport
+ based on the length of the smallest side of the widget to ensure that
+ the scene is not distorted if the widget has sides of unequal length:
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 8
+
+ A discussion of the projection transformation used is outside the scope of
+ this example. Please consult the OpenGL reference documentation for an
+ explanation of projection matrices.
+
+ \section2 Painting the Scene
+
+ The \l{QGLWidget::paintGL()}{paintGL()} function is used to paint the
+ contents of the scene onto the widget. For widgets that only need to be
+ decorated with pure OpenGL content, we reimplement QGLWidget::paintGL()
+ \e instead of reimplementing QWidget::paintEvent():
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 7
+
+ In this example, we clear the widget using the background color that
+ we defined in the \l{QGLWidget::initializeGL()}{initializeGL()} function,
+ set up the frame of reference for the object we want to display, and call
+ the display list containing the rendering commands for the object.
+
+ \section2 Mouse Handling
+
+ Just as in subclasses of native widgets, mouse events are handled by
+ reimplementing functions such as QWidget::mousePressEvent() and
+ QWidget::mouseMoveEvent().
+
+ The \l{QWidget::mousePressEvent()}{mousePressEvent()} function simply
+ records the position of the mouse when a button is initially pressed:
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 9
+
+ The \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()} function uses the
+ previous location of the mouse cursor to determine how much the object
+ in the scene should be rotated, and in which direction:
+
+ \snippet examples/opengl/hellogl/glwidget.cpp 10
+
+ Since the user is expected to hold down the mouse button and drag the
+ cursor to rotate the object, the cursor's position is updated every time
+ a move event is received.
+
+ \section2 Utility Functions
+
+ We have omitted the utility functions, \c makeObject(), \c quad(),
+ \c extrude(), and \c normalizeAngle() from our discussion. These can be
+ viewed in the quoted source for \c glwidget.cpp via the link at the
+ start of this document.
+
+ \section1 Window Class Definition
+
+ The \c Window class is used as a container for the \c GLWidget used to
+ display the scene:
+
+ \snippet examples/opengl/hellogl/window.h 0
+
+ In addition, it contains sliders that are used to change the orientation
+ of the object in the scene.
+
+ \section1 Window Class Implementation
+
+ The constructor constructs an instance of the \c GLWidget class and some
+ sliders to manipulate its contents.
+
+ \snippet examples/opengl/hellogl/window.cpp 0
+
+ We connect the \l{QAbstractSlider::valueChanged()}{valueChanged()} signal
+ from each of the sliders to the appropriate slots in \c{glWidget}.
+ This allows the user to change the orientation of the object by dragging
+ the sliders.
+
+ We also connect the \c xRotationChanged(), \c yRotationChanged(), and
+ \c zRotationChanged() signals from \c glWidget to the
+ \l{QAbstractSlider::setValue()}{setValue()} slots in the
+ corresponding sliders.
+
+ \snippet examples/opengl/hellogl/window.cpp 1
+
+ The sliders are placed horizontally in a layout alongside the \c GLWidget,
+ and initialized with suitable default values.
+
+ The \c createSlider() utility function constructs a QSlider, and ensures
+ that it is set up with a suitable range, step value, tick interval, and
+ page step value before returning it to the calling function:
+
+ \snippet examples/opengl/hellogl/window.cpp 2
+
+ \section1 Summary
+
+ The \c GLWidget class implementation shows how to subclass QGLWidget for
+ the purposes of rendering a 3D scene using OpenGL calls. Since QGLWidget
+ is a subclass of QWidget, subclasses of QGLWidget can be placed in layouts
+ and provided with interactive features just like normal custom widgets.
+
+ We ensure that the widget is able to correctly render the scene using OpenGL
+ by reimplementing the following functions:
+
+ \list
+ \o QGLWidget::initializeGL() sets up resources needed by the OpenGL implementation
+ to render the scene.
+ \o QGLWidget::resizeGL() resizes the viewport so that the rendered scene fits onto
+ the widget, and sets up a projection matrix to map 3D coordinates to 2D viewport
+ coordinates.
+ \o QGLWidget::paintGL() performs painting operations using OpenGL calls.
+ \endlist
+
+ Since QGLWidget is a subclass of QWidget, it can also be used
+ as a normal paint device, allowing 2D graphics to be drawn with QPainter.
+ This use of QGLWidget is discussed in the \l{2D Painting Example}{2D Painting}
+ example.
+
+ More advanced users may want to paint over parts of a scene rendered using
+ OpenGL. QGLWidget allows pure OpenGL rendering to be mixed with QPainter
+ calls, but care must be taken to maintain the state of the OpenGL implementation.
+ See the \l{Overpainting Example}{Overpainting} example for more information.
+*/
diff --git a/doc/src/examples/hellogl_es.qdoc b/doc/src/examples/hellogl_es.qdoc
new file mode 100644
index 0000000..0293584
--- /dev/null
+++ b/doc/src/examples/hellogl_es.qdoc
@@ -0,0 +1,124 @@
+/*!
+ \example opengl/hellogl_es
+ \title Hello GL ES Example
+
+ The Hello GL ES example is the \l{Hello GL Example} ported to OpenGL ES.
+ It also included some effects from the OpenGL \l{Overpainting Example}.
+
+ \image hellogl-es-example.png
+
+ A complete introduction to OpenGL ES and a description of all differences
+ between OpenGL and OpenGL ES is out of the scope of this document; but
+ we will describe some of the major issues and differences.
+
+ Since Hello GL ES is a direct port of standard OpenGL code, it is a fairly
+ good example for porting OpenGL code to OpenGL ES.
+
+ \tableofcontents
+
+ \section1 Using QGLWidget
+
+ QGLWidget can be used for OpenGL ES similar to the way it is used with
+ standard OpenGL; but there are some differences. We use EGL 1.0 to embedd
+ the OpenGL ES window within the native window manager. In
+ QGLWidget::initializeGL() we initialize OpenGL ES.
+
+ \section1 Using OpenGL ES rendering commands
+
+ To update the scene, we reimplment QGLWidget::paintGL(). We use OpenGL ES
+ rendering commands just like we do with standard OpenGL. Since the OpenGL
+ ES common light profile only supports fixed point functions, we need to
+ abstract it somehow. Hence, we define an abstraction layer in
+ \c{cl_helper.h}.
+
+ \snippet examples/opengl/hellogl_es/cl_helper.h 0
+
+ Instead of \c glFogxv() or \c glFogfv() we use \c q_glFogv() and to
+ convert the coordinates of a vertice we use the macro \c f2vt(). That way,
+ if QT_OPENGL_ES_CL is defined we use the fixed point functions and every
+ float is converted to fixed point.
+
+ If QT_OPENGL_ES_CL is not defined we use the floating point functions.
+
+ \snippet examples/opengl/hellogl_es/cl_helper.h 1
+
+ This way we support OpenGL ES Common and Common Light with the same code
+ and abstract the fact that we use either the floating point functions or
+ otherwise the fixed point functions.
+
+ \section1 Porting OpenGL to OpenGL ES
+
+ Since OpenGL ES is missing the immediate mode and does not support quads,
+ we have to create triangle arrays.
+
+ We create a quad by adding vertices to a QList of vertices. We create both
+ sides of the quad and hardcode a distance of 0.05f. We also compute the
+ correct normal for each face and store them in another QList.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 0
+
+ And then we convert the complete list of vertexes and the list of normals
+ into the native OpenGL ES format that we can use with the OpenGL ES API.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 1
+
+ In \c paintQtLogo() we draw the triangle array using OpenGL ES. We use
+ q_vertexTypeEnum to abstract the fact that our vertex and normal arrays
+ are either in float or in fixed point format.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 2
+
+ \section1 Using QGLPainter
+
+ Since the \c QGLPainter is slower for OpenGL ES we paint the bubbles with
+ the rasterizer and cache them in a QImage. This happends only once during
+ the initialiazation.
+
+ \snippet examples/opengl/hellogl_es/bubble.cpp 0
+
+ For each bubble this QImage is then drawn to the QGLWidget by using the
+ according QPainter with transparency enabled.
+
+ \snippet examples/opengl/hellogl_es/bubble.cpp 1
+
+ Another difference beetwen OpenGL and OpenGL ES is that OpenGL ES does not
+ support glPushAttrib(GL_ALL_ATTRIB_BITS). So we have to restore all the
+ OpenGL states ourselves, after we created the QPainter in
+ GLWidget::paintGL().
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 3
+
+ Setting up up the model view matrix and setting the right OpenGL states is
+ done in the same way as for standard OpenGL.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 4
+
+ Now we have to restore the OpenGL state for the QPainter. This is not done
+ automatically for OpenGL ES.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 5
+
+ Now we use the QPainter to draw the transparent bubbles.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 6
+
+ In the end, we calculate the framerate and display it using the QPainter
+ again.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 7
+
+ After we finished all the drawing operations we swap the screen buffer.
+
+ \snippet examples/opengl/hellogl_es/glwidget.cpp 8
+
+ \section1 Summary
+
+ Similar to the \l{Hello GL Example}, we subclass QGLWidget to render
+ a 3D scene using OpenGL ES calls. QGLWidget is a subclass of QWidget.
+ Hence, its \l{QGLWidget}'s subclasses can be placed in layouts and
+ provided with interactive features just like normal custom widgets.
+
+ QGLWidget allows pure OpenGL ES rendering to be mixed with QPainter calls,
+ but care must be taken to maintain the state of the OpenGL ES
+ implementation.
+*/
diff --git a/doc/src/examples/helloscript.qdoc b/doc/src/examples/helloscript.qdoc
new file mode 100644
index 0000000..5662680
--- /dev/null
+++ b/doc/src/examples/helloscript.qdoc
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example script/helloscript
+ \title Hello Script Example
+
+ The Hello Script example shows the basic use of Qt Script: How to embed
+ a script engine into the application, how to evaluate a script, and how
+ to process the result of the evaluation. The example also shows how to
+ apply internationalization to scripts.
+
+ \snippet examples/script/helloscript/main.cpp 0
+
+ The application will load the script file to evaluate from a resource, so
+ we first make sure that the resource is initialized.
+
+ \snippet examples/script/helloscript/main.cpp 1
+
+ We attempt to load a translation, and install translation functions in the
+ script engine. How to produce a translation is explained later.
+
+ \snippet examples/script/helloscript/main.cpp 2
+
+ A push button is created and exported to the script environment as a
+ global variable, \c button. Scripts will be able to access properties,
+ signals and slots of the button as properties of the \c button script
+ object; the script object acts as a proxy to the C++ button object.
+
+ \snippet examples/script/helloscript/main.cpp 3
+
+ The contents of the script file are read.
+
+ \snippet examples/script/helloscript/helloscript.qs 0
+
+ The script sets the \c text (note that the qTr() function is used to allow
+ for translation) and \c styleSheet properties of the button, and calls the
+ button's \c show() slot.
+
+ \snippet examples/script/helloscript/main.cpp 4
+
+ The script is evaluated. Note that the file name is passed as the
+ (optional) second parameter; this makes it possible for the script engine
+ to produce a meaningful backtrace if something goes wrong, and makes the
+ qTr() function be able to resolve the translations that are associated
+ with this script.
+
+ \snippet examples/script/helloscript/main.cpp 5
+
+ If the result is an Error object (e.g. the script contained a syntax
+ error, or tried to call a function that doesn't exist), we obtain
+ the line number and string representation of the error and display
+ it in a message box.
+
+ \snippet examples/script/helloscript/main.cpp 6
+
+ If the evaluation went well, the application event loop is entered.
+
+ \section1 Translating the Application
+
+ The Qt Script internalization support builds on what Qt already provides
+ for C++; see the \l{Hello tr() Example} for an introduction.
+
+ Since we haven't made the translation file \c helloscript_la.qm, the
+ source text is shown when we run the application ("Hello world!").
+
+ To generate the translation file, run \c lupdate as follows:
+
+ \code
+ lupdate helloscript.qs -ts helloscript_la.ts
+ \endcode
+
+ You should now have a file \c helloscript_la.ts in the current
+ directory. Run \c linguist to edit the translation:
+
+ \code
+ linguist helloscript_la.ts
+ \endcode
+
+ You should now see the text "helloscript.qs" in the top left pane.
+ Double-click it, then click on "Hello world!" and enter "Orbis, te
+ saluto!" in the \gui Translation pane (the middle right of the
+ window). Don't forget the exclamation mark!
+
+ Click the \gui Done checkbox and choose \gui File|Save from the
+ menu bar. The \c .ts file will no longer contain
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 3
+
+ but instead will have
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 4
+
+ To see the application running in Latin, we have to generate a \c .qm
+ file from the \c .ts file. Generating a \c .qm file can be achieved
+ either from within \e {Qt Linguist} (for a single \c .ts file), or
+ by using the command line program \c lrelease which will produce one \c
+ .qm file for each of the \c .ts files listed in the project file.
+ Generate \c hellotr_la.qm from \c hellotr_la.ts by choosing
+ \gui File|Release from \e {Qt Linguist}'s menu bar and pressing
+ \gui Save in the file save dialog that pops up. Now run the \c helloscript
+ program again. This time the button will be labelled "Orbis, te
+ saluto!".
+*/
diff --git a/doc/src/examples/hellotr.qdoc b/doc/src/examples/hellotr.qdoc
new file mode 100644
index 0000000..72efd11
--- /dev/null
+++ b/doc/src/examples/hellotr.qdoc
@@ -0,0 +1,188 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example linguist/hellotr
+ \title Hello tr() Example
+
+ This example is a small Hello World program with a Latin translation. The
+ screenshot below shows the English version.
+
+ \image linguist-hellotr_en.png
+
+ See the \l{Qt Linguist manual} for more information about
+ translating Qt application.
+
+ \section1 Line by Line Walkthrough
+
+
+ \snippet examples/linguist/hellotr/main.cpp 0
+
+ This line includes the definition of the QTranslator class.
+ Objects of this class provide translations for user-visible text.
+
+ \snippet examples/linguist/hellotr/main.cpp 5
+
+ Creates a QTranslator object without a parent.
+
+ \snippet examples/linguist/hellotr/main.cpp 6
+
+ Tries to load a file called \c hellotr_la.qm (the \c .qm file extension is
+ implicit) that contains Latin translations for the source texts used in
+ the program. No error will occur if the file is not found.
+
+ \snippet examples/linguist/hellotr/main.cpp 7
+
+ Adds the translations from \c hellotr_la.qm to the pool of translations used
+ by the program.
+
+ \snippet examples/linguist/hellotr/main.cpp 8
+
+ Creates a push button that displays "Hello world!". If \c hellotr_la.qm
+ was found and contains a translation for "Hello world!", the
+ translation appears; if not, the source text appears.
+
+ All classes that inherit QObject have a \c tr() function. Inside
+ a member function of a QObject class, we simply write \c tr("Hello
+ world!") instead of \c QPushButton::tr("Hello world!") or \c
+ QObject::tr("Hello world!").
+
+ \section1 Running the Application in English
+
+ Since we haven't made the translation file \c hellotr_la.qm, the source text
+ is shown when we run the application:
+
+ \image linguist-hellotr_en.png
+
+ \section1 Creating a Latin Message File
+
+ The first step is to create a project file, \c hellotr.pro, that lists
+ all the source files for the project. The project file can be a qmake
+ project file, or even an ordinary makefile. Any file that contains
+
+ \snippet examples/linguist/hellotr/hellotr.pro 0
+ \snippet examples/linguist/hellotr/hellotr.pro 1
+
+ will work. \c TRANSLATIONS specifies the message files we want to
+ maintain. In this example, we just maintain one set of translations,
+ namely Latin.
+
+ Note that the file extension is \c .ts, not \c .qm. The \c .ts
+ translation source format is designed for use during the
+ application's development. Programmers or release managers run
+ the \c lupdate program to generate and update \c .ts files with
+ the source text that is extracted from the source code.
+ Translators read and update the \c .ts files using \e {Qt
+ Linguist} adding and editing their translations.
+
+ The \c .ts format is human-readable XML that can be emailed directly
+ and is easy to put under version control. If you edit this file
+ manually, be aware that the default encoding for XML is UTF-8, not
+ Latin1 (ISO 8859-1). One way to type in a Latin1 character such as
+ '\oslash' (Norwegian o with slash) is to use an XML entity:
+ "\&#xf8;". This will work for any Unicode 4.0 character.
+
+ Once the translations are complete the \c lrelease program is used to
+ convert the \c .ts files into the \c .qm Qt message file format. The
+ \c .qm format is a compact binary format designed to deliver very
+ fast lookup performance. Both \c lupdate and \c lrelease read all the
+ project's source and header files (as specified in the HEADERS and
+ SOURCES lines of the project file) and extract the strings that
+ appear in \c tr() function calls.
+
+ \c lupdate is used to create and update the message files (\c hellotr_la.ts
+ in this case) to keep them in sync with the source code. It is safe to
+ run \c lupdate at any time, as \c lupdate does not remove any
+ information. For example, you can put it in the makefile, so the \c .ts
+ files are updated whenever the source changes.
+
+ Try running \c lupdate right now, like this:
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 0
+
+ (The \c -verbose option instructs \c lupdate to display messages that
+ explain what it is doing.) You should now have a file \c hellotr_la.ts in
+ the current directory, containing this:
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 1
+
+ You don't need to understand the file format since it is read and
+ updated using tools (\c lupdate, \e {Qt Linguist}, \c lrelease).
+
+ \section1 Translating to Latin with Qt Linguist
+
+ We will use \e {Qt Linguist} to provide the translation, although
+ you can use any XML or plain text editor to enter a translation into a
+ \c .ts file.
+
+ To start \e {Qt Linguist}, type
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 2
+
+ You should now see the text "QPushButton" in the top left pane.
+ Double-click it, then click on "Hello world!" and enter "Orbis, te
+ saluto!" in the \gui Translation pane (the middle right of the
+ window). Don't forget the exclamation mark!
+
+ Click the \gui Done checkbox and choose \gui File|Save from the
+ menu bar. The \c .ts file will no longer contain
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 3
+
+ but instead will have
+
+ \snippet doc/src/snippets/code/doc_src_examples_hellotr.qdoc 4
+
+ \section1 Running the Application in Latin
+
+ To see the application running in Latin, we have to generate a \c .qm
+ file from the \c .ts file. Generating a \c .qm file can be achieved
+ either from within \e {Qt Linguist} (for a single \c .ts file), or
+ by using the command line program \c lrelease which will produce one \c
+ .qm file for each of the \c .ts files listed in the project file.
+ Generate \c hellotr_la.qm from \c hellotr_la.ts by choosing
+ \gui File|Release from \e {Qt Linguist}'s menu bar and pressing
+ \gui Save in the file save dialog that pops up. Now run the \c hellotr
+ program again. This time the button will be labelled "Orbis, te
+ saluto!".
+
+ \image linguist-hellotr_la.png
+*/
diff --git a/doc/src/examples/http.qdoc b/doc/src/examples/http.qdoc
new file mode 100644
index 0000000..17404a8
--- /dev/null
+++ b/doc/src/examples/http.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/http
+ \title HTTP Example
+
+ The HTTP example demonstrates a simple HTTP client that shows how to fetch files
+ specified by URLs from remote hosts.
+
+ \image http-example.png
+*/
diff --git a/doc/src/examples/i18n.qdoc b/doc/src/examples/i18n.qdoc
new file mode 100644
index 0000000..68d9153
--- /dev/null
+++ b/doc/src/examples/i18n.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/i18n
+ \title I18N Example
+
+ The Internationalization (I18N) example demonstrates Qt's support for translated
+ text. Developers can write the initial application text in one language, and
+ translations can be provided later without any modifications to the code.
+
+ \image i18n-example.png
+*/
diff --git a/doc/src/examples/icons.qdoc b/doc/src/examples/icons.qdoc
new file mode 100644
index 0000000..750ef2e
--- /dev/null
+++ b/doc/src/examples/icons.qdoc
@@ -0,0 +1,794 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/icons
+ \title Icons Example
+
+ The Icons example shows how QIcon can generate pixmaps reflecting
+ an icon's state, mode and size. These pixmaps are generated from
+ the set of pixmaps made available to the icon, and are used by Qt
+ widgets to show an icon representing a particular action.
+
+ \image icons-example.png Screenshot of the Icons example
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 QIcon Overview
+
+ The QIcon class provides scalable icons in different modes and
+ states. An icon's state and mode are depending on the intended use
+ of the icon. Qt currently defines four modes:
+
+ \table
+ \header \o Mode \o Description
+ \row
+ \o QIcon::Normal
+ \o Display the pixmap when the user is not interacting with the
+ icon, but the functionality represented by the icon is
+ available.
+ \row
+ \o QIcon::Active
+ \o Display the pixmap when the functionality represented by the
+ icon is available and the user is interacting with the icon,
+ for example, moving the mouse over it or clicking it.
+ \row
+ \o QIcon::Disabled
+ \o Display the pixmap when the functionality represented by
+ the icon is not available.
+ \row
+ \o QIcon::Selected
+ \o Display the pixmap when the icon is selected.
+ \endtable
+
+ QIcon's states are QIcon::On and QIcon::Off, which will display
+ the pixmap when the widget is in the respective state. The most
+ common usage of QIcon's states are when displaying checkable tool
+ buttons or menu entries (see QAbstractButton::setCheckable() and
+ QAction::setCheckable()). When a tool button or menu entry is
+ checked, the QIcon's state is \l{QIcon::}{On}, otherwise it's
+ \l{QIcon::}{Off}. You can, for example, use the QIcon's states to
+ display differing pixmaps depending on whether the tool button or
+ menu entry is checked or not.
+
+ A QIcon can generate smaller, larger, active, disabled, and
+ selected pixmaps from the set of pixmaps it is given. Such
+ pixmaps are used by Qt widgets to show an icon representing a
+ particular action.
+
+ \section1 Overview of the Icons Application
+
+ With the Icons application you get a preview of an icon's
+ generated pixmaps reflecting its different states, modes and size.
+
+ When an image is loaded into the application, it is converted into
+ a pixmap and becomes a part of the set of pixmaps available to the
+ icon. An image can be excluded from this set by checking off the
+ related checkbox. The application provides a sub directory
+ containing sets of images explicitly designed to illustrate how Qt
+ renders an icon in different modes and states.
+
+ The application allows you to manipulate the icon size with some
+ predefined sizes and a spin box. The predefined sizes are style
+ dependent, but most of the styles have the same values: Only the
+ Macintosh style differ by using 32 pixels, instead of 16 pixels,
+ for toolbar buttons. You can navigate between the available styles
+ using the \gui View menu.
+
+ \image icons-view-menu.png Screenshot of the View menu
+
+ The \gui View menu also provide the option to make the application
+ guess the icon state and mode from an image's file name. The \gui
+ File menu provide the options of adding an image and removing all
+ images. These last options are also available through a context
+ menu that appears if you press the right mouse button within the
+ table of image files. In addition, the \gui File menu provide an
+ \gui Exit option, and the \gui Help menu provide information about
+ the example and about Qt.
+
+ \image icons_find_normal.png Screenshot of the Find Files
+
+ The screenshot above shows the application with one image file
+ loaded. The \gui {Guess Image Mode/State} is enabled and the
+ style is Plastique.
+
+ When QIcon is provided with only one available pixmap, that
+ pixmap is used for all the states and modes. In this case the
+ pixmap's icon mode is set to normal, and the generated pixmaps
+ for the normal and active modes will look the same. But in
+ disabled and selected mode, Qt will generate a slightly different
+ pixmap.
+
+ The next screenshot shows the application with an additional file
+ loaded, providing QIcon with two available pixmaps. Note that the
+ new image file's mode is set to disabled. When rendering the \gui
+ Disabled mode pixmaps, Qt will now use the new image. We can see
+ the difference: The generated disabled pixmap in the first
+ screenshot is slightly darker than the pixmap with the originally
+ set disabled mode in the second screenshot.
+
+ \image icons_find_normal_disabled.png Screenshot of the Find Files
+
+ When Qt renders the icon's pixmaps it searches through the set of
+ available pixmaps following a particular algorithm. The algorithm
+ is documented in QIcon, but we will describe some particular cases
+ below.
+
+ \image icons_monkey_active.png Screenshot of the Find Files
+
+ In the screenshot above, we have set \c monkey_on_32x32 to be an
+ Active/On pixmap and \c monkey_off_64x64 to be Normal/Off. To
+ render the other six mode/state combinations, QIcon uses the
+ search algorithm described in the table below:
+
+ \table
+ \header \o{2,1} Requested Pixmap \o{8,1} Preferred Alternatives (mode/state)
+ \header \o Mode \o State \o 1 \o 2 \o 3 \o 4 \o 5 \o 6 \o 7 \o 8
+ \row \o{1,2} Normal \o Off \o \bold N0 \o A0 \o N1 \o A1 \o D0 \o S0 \o D1 \o S1
+ \row \o On \o N1 \o \bold A1 \o N0 \o A0 \o D1 \o S1 \o D0 \o S0
+ \row \o{1,2} Active \o Off \o A0 \o \bold N0 \o A1 \o N1 \o D0 \o S0 \o D1 \o S1
+ \row \o On \o \bold A1 \o N1 \o A0 \o N0 \o D1 \o S1 \o D0 \o S0
+ \row \o{1,2} Disabled \o Off \o D0 \o \bold {N0'} \o A0' \o D1 \o N1' \o A1' \o S0' \o S1'
+ \row \o On \o D1 \o N1' \o \bold {A1'} \o D0 \o N0' \o A0' \o S1' \o S0'
+ \row \o{1,2} Selected \o Off \o S0 \o \bold {N0''} \o A0'' \o S1 \o N1'' \o A1'' \o D0'' \o D1''
+ \row \o On \o S1 \o N1'' \o \bold {A1''} \o S0 \o N0'' \o A0'' \o D1'' \o D0''
+ \endtable
+
+ In the table, "0" and "1" stand for Off" and "On", respectively.
+ Single quotes indicates that QIcon generates a disabled ("grayed
+ out") version of the pixmap; similarly, double quuote indicate
+ that QIcon generates a selected ("blued out") version of the
+ pixmap.
+
+ The alternatives used in the screenshot above are shown in bold.
+ For example, the Disabled/Off pixmap is derived by graying out
+ the Normal/Off pixmap (\c monkey_off_64x64).
+
+ In the next screenshots, we loaded the whole set of monkey
+ images. By checking or unchecking file names from the image list,
+ we get different results:
+
+ \table
+ \row
+ \o \inlineimage icons_monkey.png Screenshot of the Monkey Files
+ \o \inlineimage icons_monkey_mess.png Screenshot of the Monkey Files
+ \endtable
+
+ For any given mode/state combination, it is possible to specify
+ several images at different resolutions. When rendering an
+ icon, QIcon will automatically pick the most suitable image
+ and scale it down if necessary. (QIcon never scales up images,
+ because this rarely looks good.)
+
+ The screenshots below shows what happens when we provide QIcon
+ with three images (\c qt_extended_16x16.png, \c qt_extended_32x32.png, \c
+ qt_extended_48x48.png) and try to render the QIcon at various
+ resolutions:
+
+ \table
+ \row
+ \o
+ \o \inlineimage icons_qt_extended_8x8.png Qt Extended icon at 8 x 8
+ \o \inlineimage icons_qt_extended_16x16.png Qt Extended icon at 16 x 16
+ \o \inlineimage icons_qt_extended_17x17.png Qt Extended icon at 17 x 17
+ \row
+ \o
+ \o 8 x 8
+ \o \bold {16 x 16}
+ \o 17 x 17
+ \row
+ \o \inlineimage icons_qt_extended_32x32.png Qt Extended icon at 32 x 32
+ \o \inlineimage icons_qt_extended_33x33.png Qt Extended icon at 33 x 33
+ \o \inlineimage icons_qt_extended_48x48.png Qt Extended icon at 48 x 48
+ \o \inlineimage icons_qt_extended_64x64.png Qt Extended icon at 64 x 64
+ \row
+ \o \bold {32 x 32}
+ \o 33 x 33
+ \o \bold {48 x 48}
+ \o 64 x 64
+ \endtable
+
+ For sizes up to 16 x 16, QIcon uses \c qt_extended_16x16.png and
+ scales it down if necessary. For sizes between 17 x 17 and 32 x
+ 32, it uses \c qt_extended_32x32.png. For sizes above 32 x 32, it uses
+ \c qt_extended_48x48.png.
+
+ \section1 Line-by-Line Walkthrough
+
+ The Icons example consists of four classes:
+
+ \list
+ \o \c MainWindow inherits QMainWindow and is the main application
+ window.
+ \o \c IconPreviewArea is a custom widget that displays all
+ combinations of states and modes for a given icon.
+ \o \c IconSizeSpinBox is a subclass of QSpinBox that lets the
+ user enter icon sizes (e.g., "48 x 48").
+ \o \c ImageDelegate is a subclass of QItemDelegate that provides
+ comboboxes for letting the user set the mode and state
+ associated with an image.
+ \endlist
+
+ We will start by reviewing the \c IconPreviewArea class before we
+ take a look at the \c MainWindow class. Finally, we will review the
+ \c IconSizeSpinBox and \c ImageDelegate classes.
+
+ \section2 IconPreviewArea Class Definition
+
+ An \c IconPreviewArea widget consists of a group box containing a grid of
+ QLabel widgets displaying headers and pixmaps.
+
+ \image icons_preview_area.png Screenshot of IconPreviewArea.
+
+ \snippet examples/widgets/icons/iconpreviewarea.h 0
+
+ The \c IconPreviewArea class inherits QWidget. It displays the
+ generated pixmaps corresponding to an icon's possible states and
+ modes at a given size.
+
+ We need two public functions to set the current icon and the
+ icon's size. In addition the class has three private functions: We
+ use the \c createHeaderLabel() and \c createPixmapLabel()
+ functions when constructing the preview area, and we need the \c
+ updatePixmapLabels() function to update the preview area when
+ the icon or the icon's size has changed.
+
+ The \c NumModes and \c NumStates constants reflect \l{QIcon}'s
+ number of currently defined modes and states.
+
+ \section2 IconPreviewArea Class Implementation
+
+ \snippet examples/widgets/icons/iconpreviewarea.cpp 0
+
+ In the constructor we create the labels displaying the headers and
+ the icon's generated pixmaps, and add them to a grid layout.
+
+ When creating the header labels, we make sure the enums \c
+ NumModes and \c NumStates defined in the \c .h file, correspond
+ with the number of labels that we create. Then if the enums at
+ some point are changed, the \c Q_ASSERT() macro will alert that this
+ part of the \c .cpp file needs to be updated as well.
+
+ If the application is built in debug mode, the \c Q_ASSERT()
+ macro will expand to
+
+ \snippet doc/src/snippets/code/doc_src_examples_icons.qdoc 0
+
+ In release mode, the macro simply disappear. The mode can be set
+ in the application's \c .pro file. One way to do so is to add an
+ option to \c qmake when building the application:
+
+ \snippet doc/src/snippets/code/doc_src_examples_icons.qdoc 1
+
+ or
+
+ \snippet doc/src/snippets/code/doc_src_examples_icons.qdoc 2
+
+ Another approach is to add this line directly to the \c .pro
+ file.
+
+ \snippet examples/widgets/icons/iconpreviewarea.cpp 1
+ \codeline
+ \snippet examples/widgets/icons/iconpreviewarea.cpp 2
+
+ The public \c setIcon() and \c setSize() functions change the icon
+ or the icon size, and make sure that the generated pixmaps are
+ updated.
+
+ \snippet examples/widgets/icons/iconpreviewarea.cpp 3
+ \codeline
+ \snippet examples/widgets/icons/iconpreviewarea.cpp 4
+
+ We use the \c createHeaderLabel() and \c createPixmapLabel()
+ functions to create the preview area's labels displaying the
+ headers and the icon's generated pixmaps. Both functions return
+ the QLabel that is created.
+
+ \snippet examples/widgets/icons/iconpreviewarea.cpp 5
+
+ We use the private \c updatePixmapLabel() function to update the
+ generated pixmaps displayed in the preview area.
+
+ For each mode, and for each state, we retrieve a pixmap using the
+ QIcon::pixmap() function, which generates a pixmap corresponding
+ to the given state, mode and size.
+
+ \section2 MainWindow Class Definition
+
+ The \c MainWindow widget consists of three main elements: an
+ images group box, an icon size group box and a preview area.
+
+ \image icons-example.png Screenshot of the Icons example
+
+ \snippet examples/widgets/icons/mainwindow.h 0
+
+ The MainWindow class inherits from QMainWindow. We reimplement the
+ constructor, and declare several private slots:
+
+ \list
+ \o The \c about() slot simply provides information about the example.
+ \o The \c changeStyle() slot changes the application's GUI style and
+ adjust the style dependent size options.
+ \o The \c changeSize() slot changes the size of the preview area's icon.
+ \o The \c changeIcon() slot updates the set of pixmaps available to the
+ icon displayed in the preview area.
+ \o The \c addImage() slot allows the user to load a new image into the
+ application.
+ \endlist
+
+ In addition we declare several private functions to simplify the
+ constructor.
+
+ \section2 MainWindow Class Implementation
+
+ \snippet examples/widgets/icons/mainwindow.cpp 0
+
+ In the constructor we first create the main window's central
+ widget and its child widgets, and put them in a grid layout. Then
+ we create the menus with their associated entries and actions.
+
+ Before we resize the application window to a suitable size, we set
+ the window title and determine the current style for the
+ application. We also enable the icon size spin box by clicking the
+ associated radio button, making the current value of the spin box
+ the icon's initial size.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 1
+
+ The \c about() slot displays a message box using the static
+ QMessageBox::about() function. In this example it displays a
+ simple box with information about the example.
+
+ The \c about() function looks for a suitable icon in four
+ locations: It prefers its parent's icon if that exists. If it
+ doesn't, the function tries the top-level widget containing
+ parent, and if that fails, it tries the active window. As a last
+ resort it uses the QMessageBox's Information icon.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 2
+
+ In the \c changeStyle() slot we first check the slot's
+ parameter. If it is false we immediately return, otherwise we find
+ out which style to change to, i.e. which action that triggered the
+ slot, using the QObject::sender() function.
+
+ This function returns the sender as a QObject pointer. Since we
+ know that the sender is a QAction object, we can safely cast the
+ QObject. We could have used a C-style cast or a C++ \c
+ static_cast(), but as a defensive programming technique we use a
+ \l qobject_cast(). The advantage is that if the object has the
+ wrong type, a null pointer is returned. Crashes due to null
+ pointers are much easier to diagnose than crashes due to unsafe
+ casts.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 3
+ \snippet examples/widgets/icons/mainwindow.cpp 4
+
+ Once we have the action, we extract the style name using
+ QAction::data(). Then we create a QStyle object using the static
+ QStyleFactory::create() function.
+
+ Although we can assume that the style is supported by the
+ QStyleFactory: To be on the safe side, we use the \c Q_ASSERT()
+ macro to check if the created style is valid before we use the
+ QApplication::setStyle() function to set the application's GUI
+ style to the new style. QApplication will automatically delete
+ the style object when a new style is set or when the application
+ exits.
+
+ The predefined icon size options provided in the application are
+ style dependent, so we need to update the labels in the icon size
+ group box and in the end call the \c changeSize() slot to update
+ the icon's size.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 5
+
+ The \c changeSize() slot sets the size for the preview area's
+ icon.
+
+ To determine the new size we first check if the spin box is
+ enabled. If it is, we extract the extent of the new size from the
+ box. If it's not, we search through the predefined size options,
+ extract the QStyle::PixelMetric and use the QStyle::pixelMetric()
+ function to determine the extent. Then we create a QSize object
+ based on the extent, and use that object to set the size of the
+ preview area's icon.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 12
+
+ The first thing we do when the \c addImage() slot is called, is to
+ show a file dialog to the user. The easiest way to create a file
+ dialog is to use QFileDialog's static functions. Here we use the
+ \l {QFileDialog::getOpenFileNames()}{getOpenFileNames()} function
+ that will return one or more existing files selected by the user.
+
+ For each of the files the file dialog returns, we add a row to the
+ table widget. The table widget is listing the images the user has
+ loaded into the application.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 13
+ \snippet examples/widgets/icons/mainwindow.cpp 14
+
+ We retrieve the image name using the QFileInfo::baseName()
+ function that returns the base name of the file without the path,
+ and create the first table widget item in the row. Then we add the
+ file's complete name to the item's data. Since an item can hold
+ several information pieces, we need to assign the file name a role
+ that will distinguish it from other data. This role can be Qt::UserRole
+ or any value above it.
+
+ We also make sure that the item is not editable by removing the
+ Qt::ItemIsEditable flag. Table items are editable by default.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 15
+ \snippet examples/widgets/icons/mainwindow.cpp 16
+ \snippet examples/widgets/icons/mainwindow.cpp 17
+
+ Then we create the second and third items in the row making the
+ default mode Normal and the default state Off. But if the \gui
+ {Guess Image Mode/State} option is checked, and the file name
+ contains "_act", "_dis", or "_sel", the modes are changed to
+ Active, Disabled, or Selected. And if the file name contains
+ "_on", the state is changed to On. The sample files in the
+ example's \c images subdirectory respect this naming convension.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 18
+ \snippet examples/widgets/icons/mainwindow.cpp 19
+
+ In the end we add the items to the associated row, and use the
+ QTableWidget::openPersistentEditor() function to create
+ comboboxes for the mode and state columns of the items.
+
+ Due to the the connection between the table widget's \l
+ {QTableWidget::itemChanged()}{itemChanged()} signal and the \c
+ changeIcon() slot, the new image is automatically converted into a
+ pixmap and made part of the set of pixmaps available to the icon
+ in the preview area. So, corresponding to this fact, we need to
+ make sure that the new image's check box is enabled.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 6
+ \snippet examples/widgets/icons/mainwindow.cpp 7
+
+ The \c changeIcon() slot is called when the user alters the set
+ of images listed in the QTableWidget, to update the QIcon object
+ rendered by the \c IconPreviewArea.
+
+ We first create a QIcon object, and then we run through the
+ QTableWidget, which lists the images the user has loaded into the
+ application.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 8
+ \snippet examples/widgets/icons/mainwindow.cpp 9
+ \snippet examples/widgets/icons/mainwindow.cpp 10
+
+ We also extract the image file's name using the
+ QTableWidgetItem::data() function. This function takes a
+ Qt::DataItemRole as an argument to retrieve the right data
+ (remember that an item can hold several pieces of information)
+ and returns it as a QVariant. Then we use the
+ QVariant::toString() function to get the file name as a QString.
+
+ To create a pixmap from the file, we need to first create an
+ image and then convert this image into a pixmap using
+ QPixmap::fromImage(). Once we have the final pixmap, we add it,
+ with its associated mode and state, to the QIcon's set of
+ available pixmaps.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 11
+
+ After running through the entire list of images, we change the
+ icon of the preview area to the one we just created.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 20
+
+ In the \c removeAllImages() slot, we simply set the table widget's
+ row count to zero, automatically removing all the images the user
+ has loaded into the application. Then we update the set of pixmaps
+ available to the preview area's icon using the \c changeIcon()
+ slot.
+
+ \image icons_images_groupbox.png Screenshot of the images group box
+
+ The \c createImagesGroupBox() function is implemented to simplify
+ the constructor. The main purpose of the function is to create a
+ QTableWidget that will keep track of the images the user has
+ loaded into the application.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 21
+
+ First we create a group box that will contain the table widget.
+ Then we create a QTableWidget and customize it to suit our
+ purposes.
+
+ We call QAbstractItemView::setSelectionMode() to prevent the user
+ from selecting items.
+
+ The QAbstractItemView::setItemDelegate() call sets the item
+ delegate for the table widget. We create a \c ImageDelegate that
+ we make the item delegate for our view.
+
+ The QItemDelegate class can be used to provide an editor for an item view
+ class that is subclassed from QAbstractItemView. Using a delegate
+ for this purpose allows the editing mechanism to be customized and
+ developed independently from the model and view.
+
+ In this example we derive \c ImageDelegate from QItemDelegate.
+ QItemDelegate usually provides line editors, while our subclass
+ \c ImageDelegate, provides comboboxes for the mode and state
+ fields.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 22
+ \snippet examples/widgets/icons/mainwindow.cpp 23
+
+ Then we customize the QTableWidget's horizontal header, and hide
+ the vertical header.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 24
+ \snippet examples/widgets/icons/mainwindow.cpp 25
+
+ At the end, we connect the QTableWidget::itemChanged() signal to
+ the \c changeIcon() slot to ensuret that the preview area is in
+ sync with the image table.
+
+ \image icons_size_groupbox.png Screenshot of the icon size group box
+
+ The \c createIconSizeGroupBox() function is called from the
+ constructor. It creates the widgets controlling the size of the
+ preview area's icon.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 26
+
+ First we create a group box that will contain all the widgets;
+ then we create the radio buttons and the spin box.
+
+ The spin box is not a regular QSpinBox but an \c IconSizeSpinBox.
+ The \c IconSizeSpinBox class inherits QSpinBox and reimplements
+ two functions: QSpinBox::textFromValue() and
+ QSpinBox::valueFromText(). The \c IconSizeSpinBox is designed to
+ handle icon sizes, e.g., "32 x 32", instead of plain integer
+ values.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 27
+
+ Then we connect all of the radio buttons
+ \l{QRadioButton::toggled()}{toggled()} signals and the spin box's
+ \l {QSpinBox::valueChanged()}{valueChanged()} signal to the \c
+ changeSize() slot to make sure that the size of the preview
+ area's icon is updated whenever the user changes the icon size.
+ In the end we put the widgets in a layout that we install on the
+ group box.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 28
+
+ In the \c createActions() function we create and customize all the
+ actions needed to implement the functionality associated with the
+ menu entries in the application.
+
+ In particular we create the \c styleActionGroup based on the
+ currently available GUI styles using
+ QStyleFactory. QStyleFactory::keys() returns a list of valid keys,
+ typically including "windows", "motif", "cde", and
+ "plastique". Depending on the platform, "windowsxp" and
+ "macintosh" may be available.
+
+ We create one action for each key, and adds the action to the
+ action group. Also, for each action, we call QAction::setData()
+ with the style name. We will retrieve it later using
+ QAction::data().
+
+ \snippet examples/widgets/icons/mainwindow.cpp 29
+
+ In the \c createMenu() function, we add the previously created
+ actions to the \gui File, \gui View and \gui Help menus.
+
+ The QMenu class provides a menu widget for use in menu bars,
+ context menus, and other popup menus. We put each menu in the
+ application's menu bar, which we retrieve using
+ QMainWindow::menuBar().
+
+ \snippet examples/widgets/icons/mainwindow.cpp 30
+
+ QWidgets have a \l{QWidget::contextMenuPolicy}{contextMenuPolicy}
+ property that controls how the widget should behave when the user
+ requests a context menu (e.g., by right-clicking). We set the
+ QTableWidget's context menu policy to Qt::ActionsContextMenu,
+ meaning that the \l{QAction}s associated with the widget should
+ appear in its context menu.
+
+ Then we add the \gui{Add Image} and \gui{Remove All Images}
+ actions to the table widget. They will then appear in the table
+ widget's context menu.
+
+ \snippet examples/widgets/icons/mainwindow.cpp 31
+
+ In the \c checkCurrentStyle() function we go through the group of
+ style actions, looking for the current GUI style.
+
+ For each action, we first extract the style name using
+ QAction::data(). Since this is only a QStyleFactory key (e.g.,
+ "macintosh"), we cannot compare it directly to the current
+ style's class name. We need to create a QStyle object using the
+ static QStyleFactory::create() function and compare the class
+ name of the created QStyle object with that of the current style.
+ As soon as we are done with a QStyle candidate, we delete it.
+
+ For all QObject subclasses that use the \c Q_OBJECT macro, the
+ class name of an object is available through its
+ \l{QObject::metaObject()}{meta-object}.
+
+ We can assume that the style is supported by
+ QStyleFactory, but to be on the safe side we use the \c
+ Q_ASSERT() macro to make sure that QStyleFactory::create()
+ returned a valid pointer.
+
+ \section2 IconSizeSpinBox Class Definition
+
+ \snippet examples/widgets/icons/iconsizespinbox.h 0
+
+ The \c IconSizeSpinBox class is a subclass of QSpinBox. A plain
+ QSpinBox can only handle integers. But since we want to display
+ the spin box's values in a more sophisticated way, we need to
+ subclass QSpinBox and reimplement the QSpinBox::textFromValue()
+ and QSpinBox::valueFromText() functions.
+
+ \image icons_size_spinbox.png Screenshot of the icon size spinbox
+
+ \section2 IconSizeSpinBox Class Implementation
+
+ \snippet examples/widgets/icons/iconsizespinbox.cpp 0
+
+ The constructor is trivial.
+
+ \snippet examples/widgets/icons/iconsizespinbox.cpp 2
+
+ QSpinBox::textFromValue() is used by the spin box whenever it
+ needs to display a value. The default implementation returns a
+ base 10 representation of the \c value parameter.
+
+ Our reimplementation returns a QString of the form "32 x 32".
+
+ \snippet examples/widgets/icons/iconsizespinbox.cpp 1
+
+ The QSpinBox::valueFromText() function is used by the spin box
+ whenever it needs to interpret text typed in by the user. Since
+ we reimplement the \c textFromValue() function we also need to
+ reimplement the \c valueFromText() function to interpret the
+ parameter text and return the associated int value.
+
+ We parse the text using a regular expression (a QRegExp). We
+ define an expression that matches one or several digits,
+ optionally followed by whitespace, an "x" or the times symbol,
+ whitespace and one or several digits again.
+
+ The first digits of the regular expression are captured using
+ parentheses. This enables us to use the QRegExp::cap() or
+ QRegExp::capturedTexts() functions to extract the matched
+ characters. If the first and second numbers of the spin box value
+ differ (e.g., "16 x 24"), we use the first number.
+
+ When the user presses \key Enter, QSpinBox first calls
+ QSpinBox::valueFromText() to interpret the text typed by the
+ user, then QSpinBox::textFromValue() to present it in a canonical
+ format (e.g., "16 x 16").
+
+ \section2 ImageDelegate Class Definition
+
+ \snippet examples/widgets/icons/imagedelegate.h 0
+
+ The \c ImageDelegate class is a subclass of QItemDelegate. The
+ QItemDelegate class provides display and editing facilities for
+ data items from a model. A single QItemDelegate object is
+ responsible for all items displayed in a item view (in our case,
+ a QTableWidget).
+
+ A QItemDelegate can be used to provide an editor for an item view
+ class that is subclassed from QAbstractItemView. Using a delegate
+ for this purpose allows the editing mechanism to be customized and
+ developed independently from the model and view.
+
+ \snippet examples/widgets/icons/imagedelegate.h 1
+
+ The default implementation of QItemDelegate creates a QLineEdit.
+ Since we want the editor to be a QComboBox, we need to subclass
+ QItemDelegate and reimplement the QItemDelegate::createEditor(),
+ QItemDelegate::setEditorData() and QItemDelegate::setModelData()
+ functions.
+
+ \snippet examples/widgets/icons/imagedelegate.h 2
+
+ The \c emitCommitData() slot is used to emit the
+ QImageDelegate::commitData() signal with the appropriate
+ argument.
+
+ \section2 ImageDelegate Class Implementation
+
+ \snippet examples/widgets/icons/imagedelegate.cpp 0
+
+ The constructor is trivial.
+
+ \snippet examples/widgets/icons/imagedelegate.cpp 1
+
+ The default QItemDelegate::createEditor() implementation returns
+ the widget used to edit the item specified by the model and item
+ index for editing. The parent widget and style option are used to
+ control the appearance of the editor widget.
+
+ Our reimplementation create and populate a combobox instead of
+ the default line edit. The contents of the combobox depends on
+ the column in the table for which the editor is requested. Column
+ 1 contains the QIcon modes, whereas column 2 contains the QIcon
+ states.
+
+ In addition, we connect the combobox's \l
+ {QComboBox::activated()}{activated()} signal to the \c
+ emitCommitData() slot to emit the
+ QAbstractItemDelegate::commitData() signal whenever the user
+ chooses an item using the combobox. This ensures that the rest of
+ the application notices the change and updates itself.
+
+ \snippet examples/widgets/icons/imagedelegate.cpp 2
+
+ The QItemDelegate::setEditorData() function is used by
+ QTableWidget to transfer data from a QTableWidgetItem to the
+ editor. The data is stored as a string; we use
+ QComboBox::findText() to locate it in the combobox.
+
+ Delegates work in terms of models, not items. This makes it
+ possible to use them with any item view class (e.g., QListView,
+ QListWidget, QTreeView, etc.). The transition between model and
+ items is done implicitly by QTableWidget; we don't need to worry
+ about it.
+
+ \snippet examples/widgets/icons/imagedelegate.cpp 3
+
+ The QItemDelegate::setEditorData() function is used by QTableWidget
+ to transfer data back from the editor to the \l{QTableWidgetItem}.
+
+ \snippet examples/widgets/icons/imagedelegate.cpp 4
+
+ The \c emitCommitData() slot simply emit the
+ QAbstractItemDelegate::commitData() signal for the editor that
+ triggered the slot. This signal must be emitted when the editor
+ widget has completed editing the data, and wants to write it back
+ into the model.
+*/
diff --git a/doc/src/examples/imagecomposition.qdoc b/doc/src/examples/imagecomposition.qdoc
new file mode 100644
index 0000000..8cba805
--- /dev/null
+++ b/doc/src/examples/imagecomposition.qdoc
@@ -0,0 +1,179 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/imagecomposition
+ \title Image Composition Example
+
+ The Image Composition example lets the user combine images
+ together using any composition mode supported by QPainter, described
+ in detail in \l{QPainter#Composition Modes}{Composition Modes}.
+
+ \image imagecomposition-example.png
+
+ \section1 Setting Up The Resource File
+
+ The Image Composition example requires two source images,
+ \e butterfly.png and \e checker.png that are embedded within
+ \e imagecomposition.qrc. The file contains the following code:
+
+ \quotefile examples/painting/imagecomposition/imagecomposition.qrc
+
+ For more information on resource files, see \l{The Qt Resource System}.
+
+ \section1 ImageComposer Class Definition
+
+ The \c ImageComposer class is a subclass of QWidget that implements three
+ private slots, \c chooseSource(), \c chooseDestination(), and
+ \c recalculateResult().
+
+ \snippet examples/painting/imagecomposition/imagecomposer.h 0
+
+ In addition, \c ImageComposer consists of five private functions,
+ \c addOp(), \c chooseImage(), \c loadImage(), \c currentMode(), and
+ \c imagePos(), as well as private instances of QToolButton, QComboBox,
+ QLabel, and QImage.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.h 1
+
+ \section1 ImageComposer Class Implementation
+
+ We declare a QSize object, \c resultSize, as a static constant with width
+ and height equal to 200.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 0
+
+ Within the constructor, we instantiate a QToolButton object,
+ \c sourceButton and set its \l{QAbstractButton::setIconSize()}{iconSize}
+ property to \c resultSize. The \c operatorComboBox is instantiated and
+ then populated using the \c addOp() function. This function accepts a
+ QPainter::CompositionMode, \a mode, and a QString, \a name, representing
+ the name of the composition mode.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 1
+
+ The \c destinationButton is instantiated and its
+ \l{QAbstractButton::setIconSize()}{iconSize} property is set to
+ \c resultSize as well. The \l{QLabel}s \c equalLabel and \c resultLabel
+ are created and \c{resultLabel}'s \l{QWidget::setMinimumWidth()}
+ {minimumWidth} is set.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 2
+
+ We connect the following signals to their corresponding slots:
+ \list
+ \o \c{sourceButton}'s \l{QPushButton::clicked()}{clicked()} signal is
+ connected to \c chooseSource(),
+ \o \c{operatorComboBox}'s \l{QComboBox::activated()}{activated()}
+ signal is connected to \c recalculateResult(), and
+ \o \c{destinationButton}'s \l{QToolButton::clicked()}{clicked()} signal
+ is connected to \c chooseDestination().
+ \endlist
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 3
+
+ A QGridLayout, \c mainLayout, is used to place all the widgets. Note
+ that \c{mainLayout}'s \l{QLayout::setSizeConstraint()}{sizeConstraint}
+ property is set to QLayout::SetFixedSize, which means that
+ \c{ImageComposer}'s size cannot be resized at all.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 4
+
+ We create a QImage, \c resultImage, and we invoke \c loadImage() twice
+ to load both the image files in our \e imagecomposition.qrc file. Then,
+ we set the \l{QWidget::setWindowTitle()}{windowTitle} property to
+ "Image Composition".
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 5
+
+ The \c chooseSource() and \c chooseDestination() functions are
+ convenience functions that invoke \c chooseImage() with specific
+ parameters.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 6
+ \codeline
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 7
+
+ The \c chooseImage() function loads an image of the user's choice,
+ depending on the \a title, \a image, and \a button.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 10
+
+ The \c recalculateResult() function is used to calculate amd display the
+ result of combining the two images together with the user's choice of
+ composition mode.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 8
+
+ The \c addOp() function adds an item to the \c operatorComboBox using
+ \l{QComboBox}'s \l{QComboBox::addItem()}{addItem} function. This function
+ accepts a QPainter::CompositionMode, \a mode, and a QString, \a name. The
+ rectangle is filled with Qt::Transparent and both the \c sourceImage and
+ \c destinationImage are painted, before displaying it on \c resultLabel.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 9
+
+ The \c loadImage() function paints a transparent background using
+ \l{QPainter::fillRect()}{fillRect()} and draws \c image in a
+ centralized position using \l{QPainter::drawImage()}{drawImage()}.
+ This \c image is then set as the \c{button}'s icon.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 11
+
+ The \c currentMode() function returns the composition mode currently
+ selected in \c operatorComboBox.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 12
+
+ We use the \c imagePos() function to ensure that images loaded onto the
+ QToolButton objects, \c sourceButton and \c destinationButton, are
+ centralized.
+
+ \snippet examples/painting/imagecomposition/imagecomposer.cpp 13
+
+ \section1 The \c main() Function
+
+ The \c main() function instantiates QApplication and \c ImageComposer
+ and invokes its \l{QWidget::show()}{show()} function.
+
+ \snippet examples/painting/imagecomposition/main.cpp 0
+
+ */
diff --git a/doc/src/examples/imageviewer.qdoc b/doc/src/examples/imageviewer.qdoc
new file mode 100644
index 0000000..6881673
--- /dev/null
+++ b/doc/src/examples/imageviewer.qdoc
@@ -0,0 +1,340 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/imageviewer
+ \title Image Viewer Example
+
+ The example shows how to combine QLabel and QScrollArea to
+ display an image. QLabel is typically used for displaying text,
+ but it can also display an image. QScrollArea provides a
+ scrolling view around another widget. If the child widget exceeds
+ the size of the frame, QScrollArea automatically provides scroll
+ bars.
+
+ The example demonstrates how QLabel's ability to scale its
+ contents (QLabel::scaledContents), and QScrollArea's ability to
+ automatically resize its contents (QScrollArea::widgetResizable),
+ can be used to implement zooming and scaling features. In
+ addition the example shows how to use QPainter to print an image.
+
+ \image imageviewer-example.png Screenshot of the Image Viewer example
+
+ With the Image Viewer application, the users can view an image of
+ their choice. The \gui File menu gives the user the possibility
+ to:
+
+ \list
+ \o \gui{Open...} - Open an image file
+ \o \gui{Print...} - Print an image
+ \o \gui{Exit} - Exit the application
+ \endlist
+
+ Once an image is loaded, the \gui View menu allows the users to:
+
+ \list
+ \o \gui{Zoom In} - Scale the image up by 25%
+ \o \gui{Zoom Out} - Scale the image down by 25%
+ \o \gui{Normal Size} - Show the image at its original size
+ \o \gui{Fit to Window} - Stretch the image to occupy the entire window
+ \endlist
+
+ In addition the \gui Help menu provides the users with information
+ about the Image Viewer example in particular, and about Qt in
+ general.
+
+ \section1 ImageViewer Class Definition
+
+ \snippet examples/widgets/imageviewer/imageviewer.h 0
+
+ The \c ImageViewer class inherits from QMainWindow. We reimplement
+ the constructor, and create several private slots to facilitate
+ the menu entries. In addition we create four private functions.
+
+ We use \c createActions() and \c createMenus() when constructing
+ the \c ImageViewer widget. We use the \c updateActions() function
+ to update the menu entries when a new image is loaded, or when
+ the \gui {Fit to Window} option is toggled. The zoom slots use \c
+ scaleImage() to perform the zooming. In turn, \c
+ scaleImage() uses \c adjustScrollBar() to preserve the focal point after
+ scaling an image.
+
+ \section1 ImageViewer Class Implementation
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 0
+
+ In the constructor we first create the label and the scroll area.
+
+ We set \c {imageLabel}'s size policy to \l
+ {QSizePolicy::Ignored}{ignored}, making the users able to scale
+ the image to whatever size they want when the \gui {Fit to Window}
+ option is turned on. Otherwise, the default size polizy (\l
+ {QSizePolicy::Preferred}{preferred}) will make scroll bars appear
+ when the scroll area becomes smaller than the label's minimum size
+ hint.
+
+ We ensure that the label will scale its contents to fill all
+ available space, to enable the image to scale properly when
+ zooming. If we omitted to set the \c {imageLabel}'s \l
+ {QLabel::scaledContents}{scaledContents} property, zooming in
+ would enlarge the QLabel, but leave the pixmap at
+ its original size, exposing the QLabel's background.
+
+ We make \c imageLabel the scroll area's child widget, and we make
+ \c scrollArea the central widget of the QMainWindow. At the end
+ we create the associated actions and menus, and customize the \c
+ {ImageViewer}'s appearance.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 1
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 2
+
+ In the \c open() slot, we show a file dialog to the user. The
+ easiest way to create a QFileDialog is to use the static
+ convenience functions. QFileDialog::getOpenFileName() returns an
+ existing file selected by the user. If the user presses \gui
+ Cancel, QFileDialog returns an empty string.
+
+ Unless the file name is a empty string, we check if the file's
+ format is an image format by constructing a QImage which tries to
+ load the image from the file. If the constructor returns a null
+ image, we use a QMessageBox to alert the user.
+
+ The QMessageBox class provides a modal dialog with a short
+ message, an icon, and some buttons. As with QFileDialog the
+ easiest way to create a QMessageBox is to use its static
+ convenience functions. QMessageBox provides a range of different
+ messages arranged along two axes: severity (question,
+ information, warning and critical) and complexity (the number of
+ necessary response buttons). In this particular example an
+ information message with an \gui OK button (the default) is
+ sufficient, since the message is part of a normal operation.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 3
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 4
+
+ If the format is supported, we display the image in \c imageLabel
+ by setting the label's \l {QLabel::pixmap}{pixmap}. Then we enable
+ the \gui Print and \gui {Fit to Window} menu entries and update
+ the rest of the view menu entries. The \gui Open and \gui Exit
+ entries are enabled by default.
+
+ If the \gui {Fit to Window} option is turned off, the
+ QScrollArea::widgetResizable property is \c false and it is
+ our responsibility (not QScrollArea's) to give the QLabel a
+ reasonable size based on its contents. We call
+ \{QWidget::adjustSize()}{adjustSize()} to achieve this, which is
+ essentially the same as
+
+ \snippet doc/src/snippets/code/doc_src_examples_imageviewer.qdoc 0
+
+ In the \c print() slot, we first make sure that an image has been
+ loaded into the application:
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 5
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 6
+
+ If the application is built in debug mode, the \c Q_ASSERT() macro
+ will expand to
+
+ \snippet doc/src/snippets/code/doc_src_examples_imageviewer.qdoc 1
+
+ In release mode, the macro simply disappear. The mode can be set
+ in the application's \c .pro file. One way to do so is to add an
+ option to \gui qmake when building the appliction:
+
+ \snippet doc/src/snippets/code/doc_src_examples_imageviewer.qdoc 2
+
+ or
+
+ \snippet doc/src/snippets/code/doc_src_examples_imageviewer.qdoc 3
+
+ Another approach is to add this line directly to the \c .pro
+ file.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 7
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 8
+
+ Then we present a print dialog allowing the user to choose a
+ printer and to set a few options. We construct a painter with a
+ QPrinter as the paint device. We set the painter's window
+ and viewport in such a way that the image is as large as possible
+ on the paper, but without altering its
+ \l{Qt::KeepAspectRatio}{aspect ratio}.
+
+ In the end we draw the pixmap at position (0, 0).
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 9
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 10
+
+ We implement the zooming slots using the private \c scaleImage()
+ function. We set the scaling factors to 1.25 and 0.8,
+ respectively. These factor values ensure that a \gui {Zoom In}
+ action and a \gui {Zoom Out} action will cancel each other (since
+ 1.25 * 0.8 == 1), and in that way the normal image size can be
+ restored using the zooming features.
+
+ The screenshots below show an image in its normal size, and the
+ same image after zooming in:
+
+ \table
+ \row
+ \o \inlineimage imageviewer-original_size.png
+ \o \inlineimage imageviewer-zoom_in_1.png
+ \o \inlineimage imageviewer-zoom_in_2.png
+ \endtable
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 11
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 12
+
+ When zooming, we use the QLabel's ability to scale its contents.
+ Such scaling doesn't change the actual size hint of the contents.
+ And since the \l {QLabel::adjustSize()}{adjustSize()} function
+ use those size hint, the only thing we need to do to restore the
+ normal size of the currently displayed image is to call \c
+ adjustSize() and reset the scale factor to 1.0.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 13
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 14
+
+ The \c fitToWindow() slot is called each time the user toggled
+ the \gui {Fit to Window} option. If the slot is called to turn on
+ the option, we tell the scroll area to resize its child widget
+ with the QScrollArea::setWidgetResizable() function. Then we
+ disable the \gui {Zoom In}, \gui {Zoom Out} and \gui {Normal
+ Size} menu entries using the private \c updateActions() function.
+
+ If the \l {QScrollArea::widgetResizable} property is set to \c
+ false (the default), the scroll area honors the size of its child
+ widget. If this property is set to \c true, the scroll area will
+ automatically resize the widget in order to avoid scroll bars
+ where they can be avoided, or to take advantage of extra space.
+ But the scroll area will honor the minimum size hint of its child
+ widget independent of the widget resizable property. So in this
+ example we set \c {imageLabel}'s size policy to \l
+ {QSizePolicy::Ignored}{ignored} in the constructor, to avoid that
+ scroll bars appear when the scroll area becomes smaller than the
+ label's minimum size hint.
+
+ The screenshots below shows an image in its normal size, and the
+ same image with the \gui {Fit to window} option turned on.
+ Enlarging the window will stretch the image further, as shown in
+ the third screenshot.
+
+ \table
+ \row
+ \o \inlineimage imageviewer-original_size.png
+ \o \inlineimage imageviewer-fit_to_window_1.png
+ \o \inlineimage imageviewer-fit_to_window_2.png
+ \endtable
+
+ If the slot is called to turn off the option, the
+ {QScrollArea::setWidgetResizable} property is set to \c false. We
+ also restore the image pixmap to its normal size by adjusting the
+ label's size to its content. And in the end we update the view
+ menu entries.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 15
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 16
+
+ We implement the \c about() slot to create a message box
+ describing what the example is designed to show.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 17
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 18
+
+ In the private \c createAction() function, we create the
+ actions providing the application features.
+
+ We assign a short-cut key to each action and connect them to the
+ appropiate slots. We only enable the \c openAct and \c exitAxt at
+ the time of creation, the others are updated once an image has
+ been loaded into the application. In addition we make the \c
+ fitToWindowAct \l {QAction::checkable}{checkable}.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 19
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 20
+
+ In the private \c createMenu() function, we add the previously
+ created actions to the \gui File, \gui View and \gui Help menus.
+
+ The QMenu class provides a menu widget for use in menu bars,
+ context menus, and other popup menus. The QMenuBar class provides
+ a horizontal menu bar that consists of a list of pull-down menu
+ items. So at the end we put the menus in the \c {ImageViewer}'s
+ menu bar which we retrieve with the QMainWindow::menuBar()
+ function.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 21
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 22
+
+ The private \c updateActions() function enables or disables the
+ \gui {Zoom In}, \gui {Zoom Out} and \gui {Normal Size} menu
+ entries depending on whether the \gui {Fit to Window} option is
+ turned on or off.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 23
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 24
+
+ In \c scaleImage(), we use the \c factor parameter to calculate
+ the new scaling factor for the displayed image, and resize \c
+ imageLabel. Since we set the
+ \l{QLabel::scaledContents}{scaledContents} property to \c true in
+ the constructor, the call to QWidget::resize() will scale the
+ image displayed in the label. We also adjust the scroll bars to
+ preserve the focal point of the image.
+
+ At the end, if the scale factor is less than 33.3% or greater
+ than 300%, we disable the respective menu entry to prevent the
+ image pixmap from becoming too large, consuming too much
+ resources in the window system.
+
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 25
+ \snippet examples/widgets/imageviewer/imageviewer.cpp 26
+
+ Whenever we zoom in or out, we need to adjust the scroll bars in
+ consequence. It would have been tempting to simply call
+
+ \snippet doc/src/snippets/code/doc_src_examples_imageviewer.qdoc 4
+
+ but this would make the top-left corner the focal point, not the
+ center. Therefore we need to take into account the scroll bar
+ handle's size (the \l{QScrollBar::pageStep}{page step}).
+*/
diff --git a/doc/src/examples/itemviewspuzzle.qdoc b/doc/src/examples/itemviewspuzzle.qdoc
new file mode 100644
index 0000000..99ef7d4
--- /dev/null
+++ b/doc/src/examples/itemviewspuzzle.qdoc
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/puzzle
+ \title Item Views Puzzle Example
+
+ The Puzzle example shows how to enable drag and drop with a custom model
+ to allow items to be transferred between a view and another widget.
+
+ \image itemviewspuzzle-example.png
+
+ This example is an implementation of a simple jigsaw puzzle game using the
+ built-in support for drag and drop provided by Qt's model/view framework.
+ The \l{Drag and Drop Puzzle Example}{Drag and Drop Puzzle} example shows
+ many of the same features, but takes an alternative approach that uses Qt's
+ drag and drop API at the application level to handle drag and drop
+ operations.
+*/
diff --git a/doc/src/examples/licensewizard.qdoc b/doc/src/examples/licensewizard.qdoc
new file mode 100644
index 0000000..a702c06
--- /dev/null
+++ b/doc/src/examples/licensewizard.qdoc
@@ -0,0 +1,232 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/licensewizard
+ \title License Wizard Example
+
+ The License Wizard example shows how to implement complex wizards in
+ Qt.
+
+ \image licensewizard-example.png Screenshot of the License Wizard example
+
+ Most wizards have a linear structure, with page 1 followed by
+ page 2 and so on until the last page. The
+ \l{dialogs/classwizard}{Class Wizard} example shows how to create
+ such wizards.
+
+ Some wizards are more complex in that they allow different
+ traversal paths based on the information provided by the user.
+ The License Wizard example illustrates this. It provides five
+ wizard pages; depending on which options are selected, the user
+ can reach different pages.
+
+ \image licensewizard-flow.png The License Wizard pages
+
+ The example consists of the following classes:
+
+ \list
+ \o \c LicenseWizard inherits QWizard and implements a non-linear
+ five-page wizard that leads the user through the process of
+ choosing a license agreement.
+ \o \c IntroPage, \c EvaluatePage, \c RegisterPage, \c
+ DetailsPage, and \c ConclusionPage are QWizardPage subclasses
+ that implement the wizard pages.
+ \endlist
+
+ \section1 The LicenseWizard Class
+
+ The \c LicenseWizard class derives from QWizard and provides a
+ five-page wizard that guides the user through the process of
+ registering their copy of a fictitious software product. Here's
+ the class definition:
+
+ \snippet examples/dialogs/licensewizard/licensewizard.h 1
+
+ The class's public API is limited to a constructor and an enum.
+ The enum defines the IDs associated with the various pages:
+
+ \table
+ \header \o Class name \o Enum value \o Page ID
+ \row \o \c IntroPage \o \c Page_Intro \o 0
+ \row \o \c EvaluatePage \o \c Page_Evaluate \o 1
+ \row \o \c RegisterPage \o \c Page_Register \o 2
+ \row \o \c DetailsPage \o \c Page_Details \o 3
+ \row \o \c ConclusionPage \o \c Page_Conclusion \o 4
+ \endtable
+
+ For this example, the IDs are arbitrary. The only constraints are
+ that they must be unique and different from -1. IDs allow us to
+ refer to pages.
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 2
+
+ In the constructor, we create the five pages, insert them into
+ the wizard using QWizard::setPage(), and set \c Page_Intro to be
+ the first page.
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 3
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 4
+
+ We set the style to \l{QWizard::}{ModernStyle} on all platforms
+ except Mac OS X,
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 5
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 6
+
+ We configure the QWizard to show a \gui Help button, which is
+ connected to our \c showHelp() slot. We also set the
+ \l{QWizard::}{LogoPixmap} for all pages that have a header (i.e.,
+ \c EvaluatePage, \c RegisterPage, and \c DetailsPage).
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 9
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 11
+ \dots
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 13
+
+ In \c showHelp(), we display help texts that are appropiate for
+ the current page. If the user clicks \gui Help twice for the same
+ page, we say, "Sorry, I already gave what help I could. Maybe you
+ should try asking a human?"
+
+ \section1 The IntroPage Class
+
+ The pages are defined in \c licensewizard.h and implemented in \c
+ licensewizard.cpp, together with \c LicenseWizard.
+
+ Here's the definition and implementation of \c{IntroPage}:
+
+ \snippet examples/dialogs/licensewizard/licensewizard.h 4
+ \codeline
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 16
+
+ A page inherits from QWizardPage. We set a
+ \l{QWizardPage::}{title} and a
+ \l{QWizard::WatermarkPixmap}{watermark pixmap}. By not setting
+ any \l{QWizardPage::}{subTitle}, we ensure that no header is
+ displayed for this page. (On Windows, it is customary for wizards
+ to display a watermark pixmap on the first and last pages, and to
+ have a header on the other pages.)
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 17
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 19
+
+ The \c nextId() function returns the ID for \c EvaluatePage if
+ the \gui{Evaluate the product for 30 days} option is checked;
+ otherwise it returns the ID for \c RegisterPage.
+
+ \section1 The EvaluatePage Class
+
+ The \c EvaluatePage is slightly more involved:
+
+ \snippet examples/dialogs/licensewizard/licensewizard.h 5
+ \codeline
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 20
+ \dots
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 21
+ \dots
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 22
+
+ First, we set the page's \l{QWizardPage::}{title}
+ and \l{QWizardPage::}{subTitle}.
+
+ Then we create the child widgets, create \l{Registering and Using
+ Fields}{wizard fields} associated with them, and put them into
+ layouts. The fields are created with an asterisk (\c
+ *) next to their name. This makes them \l{mandatory fields}, that
+ is, fields that must be filled before the user can press the
+ \gui Next button (\gui Continue on Mac OS X). The fields' values
+ can be accessed from any other page using QWizardPage::field().
+
+ Resetting the page amounts to clearing the two text fields.
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 23
+
+ The next page is always the \c ConclusionPage.
+
+ \section1 The ConclusionPage Class
+
+ The \c RegisterPage and \c DetailsPage are very similar to \c
+ EvaluatePage. Let's go directly to the \c ConclusionPage:
+
+ \snippet examples/dialogs/licensewizard/licensewizard.h 6
+
+ This time, we reimplement QWizardPage::initializePage() and
+ QWidget::setVisible(), in addition to
+ \l{QWizardPage::}{nextId()}. We also declare a private slot:
+ \c printButtonClicked().
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 18
+
+ The default implementation of QWizardPage::nextId() returns
+ the page with the next ID, or -1 if the current page has the
+ highest ID. This behavior would work here, because \c
+ Page_Conclusion equals 5 and there is no page with a higher ID,
+ but to avoid relying on such subtle behavior, we reimplement
+ \l{QWizardPage::}{nextId()} to return -1.
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 27
+
+ We use QWizard::hasVisitedPage() to determine the type of
+ license agreement the user has chosen. If the user filled the \c
+ EvaluatePage, the license text refers to an Evaluation License
+ Agreement. If the user filled the \c DetailsPage, the license
+ text is a First-Time License Agreement. If the user provided an
+ upgrade key and skipped the \c DetailsPage, the license text is
+ an Update License Agreement.
+
+ \snippet examples/dialogs/licensewizard/licensewizard.cpp 28
+
+ We want to display a \gui Print button in the wizard when the \c
+ ConclusionPage is up. One way to accomplish this is to reimplement
+ QWidget::setVisible():
+
+ \list
+ \o If the page is shown, we set the \l{QWizard::}{CustomButton1} button's
+ text to \gui{\underline{P}rint}, we enable the \l{QWizard::}{HaveCustomButton1}
+ option, and we connect the QWizard's \l{QWizard::}{customButtonClicked()}
+ signal to our \c printButtonClicked() slot.
+ \o If the page is hidden, we disable the \l{QWizard::}{HaveCustomButton1}
+ option and disconnect the \c printButtonClicked() slot.
+ \endlist
+
+ \sa QWizard, {Class Wizard Example}, {Trivial Wizard Example}
+*/
diff --git a/doc/src/examples/lineedits.qdoc b/doc/src/examples/lineedits.qdoc
new file mode 100644
index 0000000..ee702ae
--- /dev/null
+++ b/doc/src/examples/lineedits.qdoc
@@ -0,0 +1,175 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/lineedits
+ \title Line Edits Example
+
+ The Line Edits example demonstrates the many ways that QLineEdit can be used, and
+ shows the effects of various properties and validators on the input and output
+ supplied by the user.
+
+ \image lineedits-example.png
+
+ The example consists of a single \c Window class, containing a selection of
+ line edits with different input constraints and display properties that can be
+ changed by selecting items from comboboxes. Presenting these together helps
+ developers choose suitable properties to use with line edits, and makes it easy
+ to compare the effects of each validator on user input.
+
+ \section1 Window Class Definition
+
+ The \c Window class inherits QWidget and contains a constructor and several
+ slots:
+
+ \snippet examples/widgets/lineedits/window.h 0
+
+ The slots are used to update the type of validator used for a given line edit when
+ a new validator has been selected in the associated combobox. The line edits
+ are stored in the window for use in these slots.
+
+ \section1 Window Class Implementation
+
+ The \c Window constructor is used to set up the line edits, validators,
+ and comboboxes, connect signals from the comboboxes to slots in the \c Window
+ class, and arrange the child widgets in layouts.
+
+ We begin by constructing a \l{QGroupBox}{group box} to hold a label, combobox,
+ and line edit so that we can demonstrate the QLineEdit::echoMode property:
+
+ \snippet examples/widgets/lineedits/window.cpp 0
+
+ At this point, none of these widgets have been arranged in layouts. Eventually,
+ the \c echoLabel, \c echoComboBox, and \c echoLineEdit will be placed in a
+ vertical layout inside the \c echoGroup group box.
+
+ Similarly, we construct group boxes and collections of widgets to show the
+ effects of QIntValidator and QDoubleValidator on a line edit's contents:
+
+ \snippet examples/widgets/lineedits/window.cpp 1
+
+ Text alignment is demonstrated by another group of widgets:
+
+ \snippet examples/widgets/lineedits/window.cpp 2
+
+ QLineEdit supports the use of \l{QLineEdit::inputMask}{input masks}.
+ These only allow the user to type characters into the line edit that
+ follow a simple specification. We construct a group of widgets to
+ demonstrate a selection of predefined masks:
+
+ \snippet examples/widgets/lineedits/window.cpp 3
+
+ Another useful feature of QLineEdit is its ability to make its contents
+ read-only. This property is used to control access to a line edit in the
+ following group of widgets:
+
+ \snippet examples/widgets/lineedits/window.cpp 4
+
+ Now that all the child widgets have been constructed, we connect signals
+ from the comboboxes to slots in the \c Window object:
+
+ \snippet examples/widgets/lineedits/window.cpp 5
+
+ Each of these connections use the QComboBox::activated() signal that
+ supplies an integer to the slot. This will be used to efficiently
+ make changes to the appropriate line edit in each slot.
+
+ We place each combobox, line edit, and label in a layout for each group
+ box, beginning with the layout for the \c echoGroup group box:
+
+ \snippet examples/widgets/lineedits/window.cpp 6
+
+ The other layouts are constructed in the same way:
+
+ \snippet examples/widgets/lineedits/window.cpp 7
+
+ Finally, we place each group box in a grid layout for the \c Window object
+ and set the window title:
+
+ \snippet examples/widgets/lineedits/window.cpp 8
+
+ The slots respond to signals emitted when the comboboxes are changed by the
+ user.
+
+ When the combobox for the \gui{Echo} group box is changed, the \c echoChanged()
+ slot is called:
+
+ \snippet examples/widgets/lineedits/window.cpp 9
+
+ The slot updates the line edit in the same group box to use an echo mode that
+ corresponds to the entry described in the combobox.
+
+ When the combobox for the \gui{Validator} group box is changed, the
+ \c validatorChanged() slot is called:
+
+ \snippet examples/widgets/lineedits/window.cpp 10
+
+ The slot either creates a new validator for the line edit to use, or it removes
+ the validator in use by calling QLineEdit::setValidator() with a zero pointer.
+ We clear the line edit in this case to ensure that the new validator is
+ initially given valid input to work with.
+
+ When the combobox for the \gui{Alignment} group box is changed, the
+ \c alignmentChanged() slot is called:
+
+ \snippet examples/widgets/lineedits/window.cpp 11
+
+ This changes the way that text is displayed in the line edit to correspond with
+ the description selected in the combobox.
+
+ The \c inputMaskChanged() slot handles changes to the combobox in the
+ \gui{Input Mask} group box:
+
+ \snippet examples/widgets/lineedits/window.cpp 12
+
+ Each entry in the relevant combobox is associated with an input mask. We set
+ a new mask by calling the QLineEdit::setMask() function with a suitable string;
+ the mask is disabled if an empty string is used.
+
+ The \c accessChanged() slot handles changes to the combobox in the
+ \gui{Access} group box:
+
+ \snippet examples/widgets/lineedits/window.cpp 13
+
+ Here, we simply associate the \gui{False} and \gui{True} entries in the combobox
+ with \c false and \c true values to be passed to QLineEdit::setReadOnly(). This
+ allows the user to enable and disable input to the line edit.
+*/
diff --git a/doc/src/examples/localfortuneclient.qdoc b/doc/src/examples/localfortuneclient.qdoc
new file mode 100644
index 0000000..b4489b1
--- /dev/null
+++ b/doc/src/examples/localfortuneclient.qdoc
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example ipc/localfortuneclient
+ \title Local Fortune Client Example
+
+ The Local Fortune Client example shows how to create a client for a simple
+ local service using QLocalSocket. It is intended to be run alongside the
+ \l{ipc/localfortuneserver}{Local Fortune Server} example.
+
+ \image localfortuneclient-example.png Screenshot of the Local Fortune Client example
+
+*/
diff --git a/doc/src/examples/localfortuneserver.qdoc b/doc/src/examples/localfortuneserver.qdoc
new file mode 100644
index 0000000..3b2395c
--- /dev/null
+++ b/doc/src/examples/localfortuneserver.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example ipc/localfortuneserver
+ \title Local Fortune Server Example
+
+ The Local Fortune Server example shows how to create a server for a simple
+ local service. It is intended to be run alongside the
+ \l{ipc/localfortuneclient}{Local Fortune Client} example
+
+ \image localfortuneserver-example.png Screenshot of the Local Fortune Server example
+ */
diff --git a/doc/src/examples/loopback.qdoc b/doc/src/examples/loopback.qdoc
new file mode 100644
index 0000000..b100f71
--- /dev/null
+++ b/doc/src/examples/loopback.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/loopback
+ \title Loopback Example
+
+ The Loopback example shows how to communicate between simple clients and servers on a local
+ host.
+
+ \image loopback-example.png
+*/
diff --git a/doc/src/examples/mandelbrot.qdoc b/doc/src/examples/mandelbrot.qdoc
new file mode 100644
index 0000000..d2a3ee1
--- /dev/null
+++ b/doc/src/examples/mandelbrot.qdoc
@@ -0,0 +1,382 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example threads/mandelbrot
+ \title Mandelbrot Example
+
+ The Mandelbrot example shows how to use a worker thread to
+ perform heavy computations without blocking the main thread's
+ event loop.
+
+ The heavy computation here is the Mandelbrot set, probably the
+ world's most famous fractal. These days, while sophisticated
+ programs such as \l{XaoS} that provide real-time zooming in the
+ Mandelbrot set, the standard Mandelbrot algorithm is just slow
+ enough for our purposes.
+
+ \image mandelbrot-example.png Screenshot of the Mandelbrot example
+
+ In real life, the approach described here is applicable to a
+ large set of problems, including synchronous network I/O and
+ database access, where the user interface must remain responsive
+ while some heavy operation is taking place. The \l
+ network/blockingfortuneclient example shows the same principle at
+ work in a TCP client.
+
+ The Mandelbrot application supports zooming and scrolling using
+ the mouse or the keyboard. To avoid freezing the main thread's
+ event loop (and, as a consequence, the application's user
+ interface), we put all the fractal computation in a separate
+ worker thread. The thread emits a signal when it is done
+ rendering the fractal.
+
+ During the time where the worker thread is recomputing the
+ fractal to reflect the new zoom factor position, the main thread
+ simply scales the previously rendered pixmap to provide immediate
+ feedback. The result doesn't look as good as what the worker
+ thread eventually ends up providing, but at least it makes the
+ application more responsive. The sequence of screenshots below
+ shows the original image, the scaled image, and the rerendered
+ image.
+
+ \table
+ \row
+ \o \inlineimage mandelbrot_zoom1.png
+ \o \inlineimage mandelbrot_zoom2.png
+ \o \inlineimage mandelbrot_zoom3.png
+ \endtable
+
+ Similarly, when the user scrolls, the previous pixmap is scrolled
+ immediately, revealing unpainted areas beyond the edge of the
+ pixmap, while the image is rendered by the worker thread.
+
+ \table
+ \row
+ \o \inlineimage mandelbrot_scroll1.png
+ \o \inlineimage mandelbrot_scroll2.png
+ \o \inlineimage mandelbrot_scroll3.png
+ \endtable
+
+ The application consists of two classes:
+
+ \list
+ \o \c RenderThread is a QThread subclass that renders
+ the Mandelbrot set.
+ \o \c MandelbrotWidget is a QWidget subclass that shows the
+ Mandelbrot set on screen and lets the user zoom and scroll.
+ \endlist
+
+ If you are not already familiar with Qt's thread support, we
+ recommend that you start by reading the \l{Thread Support in Qt}
+ overview.
+
+ \section1 RenderThread Class Definition
+
+ We'll start with the definition of the \c RenderThread class:
+
+ \snippet examples/threads/mandelbrot/renderthread.h 0
+
+ The class inherits QThread so that it gains the ability to run in
+ a separate thread. Apart from the constructor and destructor, \c
+ render() is the only public function. Whenever the thread is done
+ rendering an image, it emits the \c renderedImage() signal.
+
+ The protected \c run() function is reimplemented from QThread. It
+ is automatically called when the thread is started.
+
+ In the \c private section, we have a QMutex, a QWaitCondition,
+ and a few other data members. The mutex protects the other data
+ member.
+
+ \section1 RenderThread Class Implementation
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 0
+
+ In the constructor, we initialize the \c restart and \c abort
+ variables to \c false. These variables control the flow of the \c
+ run() function.
+
+ We also initialize the \c colormap array, which contains a series
+ of RGB colors.
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 1
+
+ The destructor can be called at any point while the thread is
+ active. We set \c abort to \c true to tell \c run() to stop
+ running as soon as possible. We also call
+ QWaitCondition::wakeOne() to wake up the thread if it's sleeping.
+ (As we will see when we review \c run(), the thread is put to
+ sleep when it has nothing to do.)
+
+ The important thing to notice here is that \c run() is executed
+ in its own thread (the worker thread), whereas the \c
+ RenderThread constructor and destructor (as well as the \c
+ render() function) are called by the thread that created the
+ worker thread. Therefore, we need a mutex to protect accesses to
+ the \c abort and \c condition variables, which might be accessed
+ at any time by \c run().
+
+ At the end of the destructor, we call QThread::wait() to wait
+ until \c run() has exited before the base class destructor is
+ invoked.
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 2
+
+ The \c render() function is called by the \c MandelbrotWidget
+ whenever it needs to generate a new image of the Mandelbrot set.
+ The \c centerX, \c centerY, and \c scaleFactor parameters specify
+ the portion of the fractal to render; \c resultSize specifies the
+ size of the resulting QImage.
+
+ The function stores the parameters in member variables. If the
+ thread isn't already running, it starts it; otherwise, it sets \c
+ restart to \c true (telling \c run() to stop any unfinished
+ computation and start again with the new parameters) and wakes up
+ the thread, which might be sleeping.
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 3
+
+ \c run() is quite a big function, so we'll break it down into
+ parts.
+
+ The function body is an infinite loop which starts by storing the
+ rendering parameters in local variables. As usual, we protect
+ accesses to the member variables using the class's mutex. Storing
+ the member variables in local variables allows us to minimize the
+ amout of code that needs to be protected by a mutex. This ensures
+ that the main thread will never have to block for too long when
+ it needs to access \c{RenderThread}'s member variables (e.g., in
+ \c render()).
+
+ The \c forever keyword is, like \c foreach, a Qt pseudo-keyword.
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 4
+ \snippet examples/threads/mandelbrot/renderthread.cpp 5
+ \snippet examples/threads/mandelbrot/renderthread.cpp 6
+ \snippet examples/threads/mandelbrot/renderthread.cpp 7
+
+ Then comes the core of the algorithm. Instead of trying to create
+ a perfect Mandelbrot set image, we do multiple passes and
+ generate more and more precise (and computationally expensive)
+ approximations of the fractal.
+
+ If we discover inside the loop that \c restart has been set to \c
+ true (by \c render()), we break out of the loop immediately, so
+ that the control quickly returns to the very top of the outer
+ loop (the \c forever loop) and we fetch the new rendering
+ parameters. Similarly, if we discover that \c abort has been set
+ to \c true (by the \c RenderThread destructor), we return from
+ the function immediately, terminating the thread.
+
+ The core algorithm is beyond the scope of this tutorial.
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 8
+ \snippet examples/threads/mandelbrot/renderthread.cpp 9
+
+ Once we're done with all the iterations, we call
+ QWaitCondition::wait() to put the thread to sleep by calling,
+ unless \c restart is \c true. There's no use in keeping a worker
+ thread looping indefinitely while there's nothing to do.
+
+ \snippet examples/threads/mandelbrot/renderthread.cpp 10
+
+ The \c rgbFromWaveLength() function is a helper function that
+ converts a wave length to a RGB value compatible with 32-bit
+ \l{QImage}s. It is called from the constructor to initialize the
+ \c colormap array with pleasing colors.
+
+ \section1 MandelbrotWidget Class Defintion
+
+ The \c MandelbrotWidget class uses \c RenderThread to draw the
+ Mandelbrot set on screen. Here's the class definition:
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.h 0
+
+ The widget reimplements many event handlers from QWidget. In
+ addition, it has an \c updatePixmap() slot that we'll connect to
+ the worker thread's \c renderedImage() signal to update the
+ display whenever we receive new data from the thread.
+
+ Among the private variables, we have \c thread of type \c
+ RenderThread and \c pixmap, which contains the last rendered
+ image.
+
+ \section1 MandelbrotWidget Class Implementation
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 0
+
+ The implementation starts with a few contants that we'll need
+ later on.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 1
+
+ The interesting part of the constructor is the
+ qRegisterMetaType() and QObject::connect() calls. Let's start
+ with the \l{QObject::connect()}{connect()} call.
+
+ Although it looks like a standard signal-slot connection between
+ two \l{QObject}s, because the signal is emitted in a different
+ thread than the receiver lives in, the connection is effectively a
+ \l{Qt::QueuedConnection}{queued connection}. These connections are
+ asynchronous (i.e., non-blocking), meaning that the slot will be
+ called at some point after the \c emit statement. What's more, the
+ slot will be invoked in the thread in which the receiver lives.
+ Here, the signal is emitted in the worker thread, and the slot is
+ executed in the GUI thread when control returns to the event loop.
+
+ With queued connections, Qt must store a copy of the arguments
+ that were passed to the signal so that it can pass them to the
+ slot later on. Qt knows how to take of copy of many C++ and Qt
+ types, but QImage isn't one of them. We must therefore call the
+ template function qRegisterMetaType() before we can use QImage
+ as parameter in queued connections.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 2
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 3
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 4
+
+ In \l{QWidget::paintEvent()}{paintEvent()}, we start by filling
+ the background with black. If we have nothing yet to paint (\c
+ pixmap is null), we print a message on the widget asking the user
+ to be patient and return from the function immediately.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 5
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 6
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 7
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 8
+
+ If the pixmap has the right scale factor, we draw the pixmap directly onto
+ the widget. Otherwise, we scale and translate the \l{The Coordinate
+ System}{coordinate system} before we draw the pixmap. By reverse mapping
+ the widget's rectangle using the scaled painter matrix, we also make sure
+ that only the exposed areas of the pixmap are drawn. The calls to
+ QPainter::save() and QPainter::restore() make sure that any painting
+ performed afterwards uses the standard coordinate system.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 9
+
+ At the end of the paint event handler, we draw a text string and
+ a semi-transparent rectangle on top of the fractal.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 10
+
+ Whenever the user resizes the widget, we call \c render() to
+ start generating a new image, with the same \c centerX, \c
+ centerY, and \c curScale parameters but with the new widget size.
+
+ Notice that we rely on \c resizeEvent() being automatically
+ called by Qt when the widget is shown the first time to generate
+ the image the very first time.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 11
+
+ The key press event handler provides a few keyboard bindings for
+ the benefit of users who don't have a mouse. The \c zoom() and \c
+ scroll() functions will be covered later.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 12
+
+ The wheel event handler is reimplemented to make the mouse wheel
+ control the zoom level. QWheelEvent::delta() returns the angle of
+ the wheel mouse movement, in eights of a degree. For most mice,
+ one wheel step corresponds to 15 degrees. We find out how many
+ mouse steps we have and determine the zoom factor in consequence.
+ For example, if we have two wheel steps in the positive direction
+ (i.e., +30 degrees), the zoom factor becomes \c ZoomInFactor
+ to the second power, i.e. 0.8 * 0.8 = 0.64.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 13
+
+ When the user presses the left mouse button, we store the mouse
+ pointer position in \c lastDragPos.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 14
+
+ When the user moves the mouse pointer while the left mouse button
+ is pressed, we adjust \c pixmapOffset to paint the pixmap at a
+ shifted position and call QWidget::update() to force a repaint.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 15
+
+ When the left mouse button is released, we update \c pixmapOffset
+ just like we did on a mouse move and we reset \c lastDragPos to a
+ default value. Then, we call \c scroll() to render a new image
+ for the new position. (Adjusting \c pixmapOffset isn't sufficient
+ because areas revealed when dragging the pixmap are drawn in
+ black.)
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 16
+
+ The \c updatePixmap() slot is invoked when the worker thread has
+ finished rendering an image. We start by checking whether a drag
+ is in effect and do nothing in that case. In the normal case, we
+ store the image in \c pixmap and reinitialize some of the other
+ members. At the end, we call QWidget::update() to refresh the
+ display.
+
+ At this point, you might wonder why we use a QImage for the
+ parameter and a QPixmap for the data member. Why not stick to one
+ type? The reason is that QImage is the only class that supports
+ direct pixel manipulation, which we need in the worker thread. On
+ the other hand, before an image can be drawn on screen, it must
+ be converted into a pixmap. It's better to do the conversion once
+ and for all here, rather than in \c paintEvent().
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 17
+
+ In \c zoom(), we recompute \c curScale. Then we call
+ QWidget::update() to draw a scaled pixmap, and we ask the worker
+ thread to render a new image corresponding to the new \c curScale
+ value.
+
+ \snippet examples/threads/mandelbrot/mandelbrotwidget.cpp 18
+
+ \c scroll() is similar to \c zoom(), except that the affected
+ parameters are \c centerX and \c centerY.
+
+ \section1 The main() Function
+
+ The application's multithreaded nature has no impact on its \c
+ main() function, which is as simple as usual:
+
+ \snippet examples/threads/mandelbrot/main.cpp 0
+*/
diff --git a/doc/src/examples/masterdetail.qdoc b/doc/src/examples/masterdetail.qdoc
new file mode 100644
index 0000000..d7dc0e2
--- /dev/null
+++ b/doc/src/examples/masterdetail.qdoc
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/masterdetail
+ \title Master Detail Example
+
+ The Master Detail Example shows how to present data from different
+ data sources in the same application. The album titles, and the
+ corresponding artists and release dates, are kept in a
+ database, while each album's tracks are stored in an XML
+ file.
+
+ The example also shows how to add as well as remove data from both
+ the database and the associated XML file using the API provided by
+ the QtSql and QtXml modules, respectively.
+
+ \image masterdetail-example.png
+*/
diff --git a/doc/src/examples/mdi.qdoc b/doc/src/examples/mdi.qdoc
new file mode 100644
index 0000000..f97db5e
--- /dev/null
+++ b/doc/src/examples/mdi.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example mainwindows/mdi
+ \title MDI Example
+
+ The MDI example shows how to implement a Multiple Document Interface using Qt's
+ QMdiArea class.
+
+ \image mdi-example.png
+
+*/
diff --git a/doc/src/examples/menus.qdoc b/doc/src/examples/menus.qdoc
new file mode 100644
index 0000000..0500101
--- /dev/null
+++ b/doc/src/examples/menus.qdoc
@@ -0,0 +1,232 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example mainwindows/menus
+ \title Menus Example
+
+ The Menus example demonstrates how menus can be used in a main
+ window application.
+
+ A menu widget can be either a pull-down menu in a menu bar or a
+ standalone context menu. Pull-down menus are shown by the menu bar
+ when the user clicks on the respective item or presses the
+ specified shortcut key. Context menus are usually invoked by some
+ special keyboard key or by right-clicking.
+
+ \image menus-example.png
+
+ A menu consists of a list of \e action items. In applications,
+ many common commands can be invoked via menus, toolbar buttons as
+ well as keyboard shortcuts. Since the user expects the commands to
+ be performed in the same way, regardless of the user interface
+ used, it is useful to represent each command as an action.
+
+ The Menus example consists of one single class, \c MainWindow, derived
+ from the QMainWindow class. When choosing one of the
+ action items in our application, it will display the item's path
+ in its central widget.
+
+ \section1 MainWindow Class Definition
+
+ QMainWindow provides a main application window, with a menu bar,
+ tool bars, dock widgets and a status bar around a large central
+ widget.
+
+ \snippet examples/mainwindows/menus/mainwindow.h 0
+
+ In this example, we will see how to implement pull-down menus as
+ well as a context menu. In order to implement a custom context
+ menu we must reimplement QWidget's \l
+ {QWidget::}{contextMenuEvent()} function to receive the context
+ menu events for our main window.
+
+ \snippet examples/mainwindows/menus/mainwindow.h 1
+
+ We must also implement a collection of private slots to respond to
+ the user activating any of our menu entries. Note that these
+ slots are left out of this documentation since they are trivial,
+ i.e., most of them are only displaying the action's path in the
+ main window's central widget.
+
+ \snippet examples/mainwindows/menus/mainwindow.h 2
+
+ We have chosen to simplify the constructor by implementing two
+ private convenience functions to create the various actions, to
+ add them to menus and to insert the menus into our main window's
+ menu bar.
+
+ \snippet examples/mainwindows/menus/mainwindow.h 3
+
+ Finally, we declare the various menus and actions as well as a
+ simple information label in the application wide scope.
+
+ The QMenu class provides a menu widget for use in menu bars,
+ context menus, and other popup menus while the QAction class
+ provides an abstract user interface action that can be inserted
+ into widgets.
+
+ In some situations it is useful to group actions together, e.g.,
+ we have a \gui {Left Align} action, a \gui {Right Align} action, a
+ \gui {Justify} action, and a \gui {Center} action, and we want
+ only one of these actions to be active at any one time. One simple
+ way of achieving this is to group the actions together in an
+ action group using the QActionGroup class.
+
+ \section1 MainWindow Class Implementation
+
+ In the constructor, we start off by creating a regular QWidget and
+ make it our main window's central widget. Note that the main
+ window takes ownership of the widget pointer and deletes it at the
+ appropriate time.
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 0
+ \codeline
+ \snippet examples/mainwindows/menus/mainwindow.cpp 1
+
+ Then we create the information label as well as a top and bottom
+ filler that we add to a layout which we install on the central
+ widget. QMainWindow objects come with their own customized layout
+ and setting a layout on a the actual main window, or creating a
+ layout with a main window as a parent, is considered an error. You
+ should always set your own layout on the central widget instead.
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 2
+
+ To create the actions and menus we call our two convenience
+ functions: \c createActions() and \c createMenus(). We will get
+ back to these shortly.
+
+ QMainWindow's \l {QMainWindow::statusBar()}{statusBar()} function
+ returns the status bar for the main window (if the status bar does
+ not exist, this function will create and return an empty status
+ bar). We initialize the status bar and window title, resize the
+ window to an appropriate size as well as ensure that the main
+ window cannot be resized to a smaller size than the given
+ one.
+
+ Now, let's take a closer look at the \c createActions() convenience
+ function that creates the various actions:
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 4
+ \dots
+
+ A QAction object may contain an icon, a text, a shortcut, a status
+ tip, a "What's This?" text, and a tooltip. Most of these can be
+ set in the constructor, but they can also be set independently
+ using the provided convenience functions.
+
+ In the \c createActions() function, we first create a \c newAct
+ action. We make \gui Ctrl+N its shortcut using the
+ QAction::setShortcut() function, and we set its status tip using the
+ QAction::setStatusTip() function (the status tip is displayed on all
+ status bars provided by the action's top-level parent widget). We
+ also connect its \l {QAction::}{triggered()} signal to the \c
+ newFile() slot.
+
+ The rest of the actions are created in a similar manner. Please
+ see the source code for details.
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 7
+
+
+ Once we have created the \gui {Left Align}, \gui {Right Align},
+ \gui {Justify}, and a \gui {Center} actions, we can also create
+ the previously mentioned action group.
+
+ Each action is added to the group using QActionGroup's \l
+ {QActionGroup::}{addAction()} function. Note that an action also
+ can be added to a group by creating it with the group as its
+ parent. Since an action group is exclusive by default, only one of
+ the actions in the group is checked at any one time (this can be
+ altered using the QActionGroup::setExclusive() function).
+
+ When all the actions are created, we use the \c createMenus()
+ function to add the actions to the menus and to insert the menus
+ into the menu bar:
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 8
+
+ QMenuBar's \l {QMenuBar::addMenu()}{addMenu()} function appends a
+ new QMenu with the given title, to the menu bar (note that the
+ menu bar takes ownership of the menu). We use QWidget's \l
+ {QWidget::addAction()}{addAction()} function to add each action to
+ the corresponding menu.
+
+ Alternatively, the QMenu class provides several \l
+ {QMenu::addAction()}{addAction()} convenience functions that create
+ and add new actions from given texts and/or icons. You can also
+ provide a member that will automatically connect to the new
+ action's \l {QAction::triggered()}{triggered()} signal, and a
+ shortcut represented by a QKeySequence instance.
+
+ The QMenu::addSeparator() function creates and returns a new
+ separator action, i.e. an action for which QAction::isSeparator()
+ returns true, and adds the new action to the menu's list of
+ actions.
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 12
+
+ Note the \gui Format menu. First of all, it is added as a submenu
+ to the \gui Edit Menu using QMenu's \l
+ {QMenu::addMenu()}{addMenu()} function. Secondly, take a look at the
+ alignment actions: In the \c createActions() function we added the
+ \c leftAlignAct, \c rightAlignAct, \c justifyAct and \c centerAct
+ actions to an action group. Nevertheless, we must add each action
+ to the menu separately while the action group does its magic
+ behind the scene.
+
+ \snippet examples/mainwindows/menus/mainwindow.cpp 3
+
+ To provide a custom context menu, we must reimplement QWidget's \l
+ {QWidget::}{contextMenuEvent()} function to receive the widget's
+ context menu events (note that the default implementation simply
+ ignores these events).
+
+ Whenever we receive such an event, we create a menu containing the
+ \gui Cut, \gui Copy and \gui Paste actions. Context menus can be
+ executed either asynchronously using the \l {QMenu::}{popup()}
+ function or synchronously using the \l {QMenu::}{exec()}
+ function. In this example, we have chosen to show the menu using
+ its \l {QMenu::}{exec()} function. By passing the event's position
+ as argument we ensure that the context menu appears at the
+ expected position.
+*/
diff --git a/doc/src/examples/mousecalibration.qdoc b/doc/src/examples/mousecalibration.qdoc
new file mode 100644
index 0000000..e271265
--- /dev/null
+++ b/doc/src/examples/mousecalibration.qdoc
@@ -0,0 +1,207 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qws/mousecalibration
+ \title Mouse Calibration Example
+
+ The Mouse Calibration example demonstrates how to write a simple
+ program using the mechanisms provided by the QWSMouseHandler class
+ to calibrate the mouse handler in \l{Qt for Embedded Linux}.
+
+ Calibration is the process of mapping between physical
+ (i.e. device) coordinates and logical coordinates.
+
+ The example consists of two classes in addition to the main program:
+
+ \list
+ \o \c Calibration is a dialog widget that retrieves the device coordinates.
+ \o \c ScribbleWidget is a minimal drawing program used to let the user
+ test the new mouse settings.
+ \endlist
+
+ First we will review the main program, then we will take a look at
+ the \c Calibration class. The \c ScribbleWidget class is only a
+ help tool in this context, and will not be covered here.
+
+ \section1 The Main Program
+
+ The program starts by presenting a message box informing the user
+ of what is going to happen:
+
+ \snippet examples/qws/mousecalibration/main.cpp 0
+
+ The QMessageBox class provides a modal dialog with a range of
+ different messages, roughly arranged along two axes: severity and
+ complexity. The message box has a different icon for each of the
+ severity levels, but the icon must be specified explicitly. In our
+ case we use the default QMessageBox::NoIcon value. In addition we
+ use the default complexity, i.e. a message box showing the given
+ text and an \gui OK button.
+
+ At this stage in the program, the mouse could be completely
+ uncalibrated, making the user unable to press the \gui OK button. For
+ that reason we use the static QTimer::singleShot() function to
+ make the message box disappear after 10 seconds. The QTimer class
+ provides repetitive and single-shot timers: The single shot
+ function calls the given slot after the specified interval.
+
+ \snippet examples/qws/mousecalibration/main.cpp 1
+
+ Next, we create an instance of the \c Calibration class which is a
+ dialog widget retrieving the required sample coordinates: The
+ dialog sequentially presents five marks for the user to press,
+ storing the device coordinates for the mouse press events.
+
+ \snippet examples/qws/mousecalibration/main.cpp 2
+
+ When the calibration dialog returns, we let the user test the new
+ mouse settings by drawing onto a \c ScribbleWidget object. Since
+ the mouse still can be uncalibrated, we continue to use the
+ QMessageBox and QTimer classes to inform the user about the
+ program's progress.
+
+ An improved calibration tool would let the user choose between
+ accepting the new calibration, reverting to the old one, and
+ restarting the calibration.
+
+ \section1 Calibration Class Definition
+
+ The \c Calibration class inherits from QDialog and is responsible
+ for retrieving the device coordinates from the user.
+
+ \snippet examples/qws/mousecalibration/calibration.h 0
+
+ We reimplement QDialog's \l {QDialog::exec()}{exec()} and \l
+ {QDialog::accept()}{accept()} slots, and QWidget's \l
+ {QWidget::paintEvent()}{paintEvent()} and \l
+ {QWidget::mouseReleaseEvent()}{mouseReleaseEvent()} functions.
+
+ In addition, we declare a couple of private variables, \c data and
+ \c pressCount, holding the \c Calibration object's number of mouse
+ press events and current calibration data. The \c pressCount
+ variable is a convenience variable, while the \c data is a
+ QWSPointerCalibrationData object (storing the physical and logical
+ coordinates) that is passed to the mouse handler. The
+ QWSPointerCalibrationData class is simply a container for
+ calibration data.
+
+ \section1 Calibration Class Implementation
+
+ In the constructor we first ensure that the \c Calibration dialog
+ fills up the entire screen, has focus and will receive mouse
+ events (the latter by making the dialog modal):
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 0
+
+ Then we initialize the \l{QWSPointerCalibrationData::}{screenPoints}
+ array:
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 1
+
+ In order to specify the calibration, the
+ \l{QWSPointerCalibrationData::screenPoints}{screenPoints} array must
+ contain the screen coordinates for the logical positions
+ represented by the QWSPointerCalibrationData::Location enum
+ (e.g. QWSPointerCalibrationData::TopLeft). Since non-linearity is
+ expected to increase on the edge of the screen, all points are
+ kept 10 percent within the screen. The \c qt_screen pointer is a
+ reference to the screen device. There can only be one screen
+ device per application.
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 2
+
+ Finally, we initialize the variable which keeps track of the number of
+ mouse press events we have received.
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 3
+
+ The destructor is trivial.
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 4
+
+ The reimplementation of the QDialog::exec() slot is called from
+ the main program.
+
+ First we clear the current calibration making the following mouse
+ event delivered in raw device coordinates. Then we call the
+ QWidget::grabMouse() function to make sure no mouse events are
+ lost, and the QWidget::activateWindow() function to make the
+ top-level widget containing this dialog, the active window. When
+ the call to the QDialog::exec() base function returns, we call
+ QWidget::releaseMouse() to release the mouse grab before the
+ function returns.
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 5
+
+ The QWidget::paintEvent() function is reimplemented to receive the
+ widget's paint events. A paint event is a request to repaint all
+ or parts of the widget. It can happen as a result of
+ QWidget::repaint() or QWidget::update(), or because the widget was
+ obscured and has now been uncovered, or for many other reasons.
+ In our reimplementation of the function we simply draw a cross at
+ the next point the user should press.
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 6
+
+ We then reimplement the QWidget::mouseReleaseEvent() function to
+ receive the widget's move events, using the QMouseEvent object
+ passed as parameter to find the coordinates the user pressed, and
+ update the QWSPointerCalibrationData::devPoints array.
+
+ In order to complete the mapping between logical and physical
+ coordinates, the \l
+ {QWSPointerCalibrationData::devPoints}{devPoints} array must
+ contain the raw device coordinates for the logical positions
+ represented by the QWSPointerCalibrationData::Location enum
+ (e.g. QWSPointerCalibrationData::TopLeft)
+
+ We continue by drawing the next cross, or close the dialog by
+ calling the QDialog::accept() slot if we have collected all the
+ required coordinate samples.
+
+ \snippet examples/qws/mousecalibration/calibration.cpp 7
+
+ Our reimplementation of the QDialog::accept() slot simply activate
+ the new calibration data using the QWSMouseHandler::calibrate()
+ function. We also use the Q_ASSERT() macro to ensure that the number
+ of required samples are present.
+*/
diff --git a/doc/src/examples/movie.qdoc b/doc/src/examples/movie.qdoc
new file mode 100644
index 0000000..00e42c6
--- /dev/null
+++ b/doc/src/examples/movie.qdoc
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/movie
+ \title Movie Example
+
+ The Movie example demonstrates how to use QMovie and QLabel to
+ display animations. Now that Qt comes with \l{Phonon
+ Overview}{Phonon} (the multimedia framework), QMovie is mostly
+ useful if one wants to play a simple animation without the added
+ complexity of a multimedia framework to install and deploy.
+
+ \image movie-example.png
+*/
diff --git a/doc/src/examples/multipleinheritance.qdoc b/doc/src/examples/multipleinheritance.qdoc
new file mode 100644
index 0000000..ff2f00f
--- /dev/null
+++ b/doc/src/examples/multipleinheritance.qdoc
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example uitools/multipleinheritance
+ \title Multiple Inheritance Example
+
+ The Multiple Inheritance Example shows how to use a form created with \QD
+ in an application by subclassing both QWidget and the user interface
+ class, which is \c{Ui::CalculatorForm}.
+
+ \image multipleinheritance-example.png
+
+ To subclass the \c calculatorform.ui file and ensure that \c qmake
+ processes it with the \c uic, we have to include \c calculatorform.ui
+ in the \c .pro file, as shown below:
+
+ \snippet examples/uitools/multipleinheritance/multipleinheritance.pro 0
+
+ When the project is compiled, the \c uic will generate a corresponding
+ \c ui_calculatorform.h.
+
+ \section1 CalculatorForm Definition
+
+ In the \c CalculatorForm definition, we include the \c ui_calculatorform.h
+ that was generated earlier.
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.h 0
+
+ As mentioned earlier, the class is a subclass of both QWidget and
+ \c{Ui::CalculatorForm}.
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.h 1
+
+ Two slots are defined according to the \l{Automatic Connections}
+ {automatic connection} naming convention required by \c uic. This is
+ to ensure that \l{QMetaObject}'s auto-connection facilities connect
+ all the signals and slots involved automatically.
+
+ \section1 CalculatorForm Implementation
+
+ In the constructor, we call \c setupUi() to load the user interface file.
+ Note that we do not need the \c{ui} prefix as \c CalculatorForm is a
+ subclass of the user interface class.
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.cpp 0
+
+ We include two slots, \c{on_inputSpinBox1_valueChanged()} and
+ \c{on_inputSpinBox2_valueChanged()}. These slots respond to the
+ \l{QSpinBox::valueChanged()}{valueChanged()} signal that both spin boxes
+ emit. Whenever there is a change in one spin box's value, we take that
+ value and add it to whatever value the other spin box has.
+
+ \snippet examples/uitools/multipleinheritance/calculatorform.cpp 1
+ \codeline
+ \snippet examples/uitools/multipleinheritance/calculatorform.cpp 2
+
+ \section1 \c main() Function
+
+ The \c main() function instantiates QApplication and \c CalculatorForm.
+ The \c calculator object is displayed by invoking the \l{QWidget::show()}
+ {show()} function.
+
+ \snippet examples/uitools/multipleinheritance/main.cpp 0
+
+ There are various approaches to include forms into applications. The
+ Multiple Inheritance approach is just one of them. See
+ \l{Using a Designer .ui File in Your Application} for more information on
+ the other approaches available.
+*/
diff --git a/doc/src/examples/musicplayerexample.qdoc b/doc/src/examples/musicplayerexample.qdoc
new file mode 100644
index 0000000..d23c1f1
--- /dev/null
+++ b/doc/src/examples/musicplayerexample.qdoc
@@ -0,0 +1,248 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example phonon/musicplayer
+ \title Music Player Example
+
+ The Music Player Example shows how to use Phonon - the multimedia
+ framework that comes with Qt - to create a simple music player.
+ The player can play music files, and provides simple playback
+ control, such as pausing, stopping, and resuming the music.
+
+ \image musicplayer.png
+
+ The player has a button group with the play, pause, and stop
+ buttons familiar from most music players. The top-most slider
+ controls the position in the media stream, and the bottom slider
+ allows adjusting the sound volume.
+
+ The user can use a file dialog to add music files to a table,
+ which displays meta information about the music - such as the
+ title, album, and artist. Each row contains information about a
+ single music file; to play it, the user selects that row and
+ presses the play button. Also, when a row is selected, the files
+ in the table are queued for playback.
+
+ Phonon offers playback of sound using an available audio device,
+ e.g., a sound card or an USB headset. For the implementation, we
+ use two objects: a \l{Phonon::}{MediaObject}, which controls the
+ playback, and an \l{Phonon::}{AudioOutput}, which can output the
+ audio to a sound device. We will explain how they cooperate when
+ we encounter them in the code. For a high-level introduction to
+ Phonon, see its \l{Phonon Overview}{overview}.
+
+ The API of Phonon is implemented through an intermediate
+ technology on each supported platform: DirectShow, QuickTime, and
+ GStreamer. The sound formats supported may therefore vary from
+ system to system. We do not in this example try to determine which
+ formats are supported, but let Phonon report an error if the user
+ tries to play an unsupported sound file.
+
+ Our player consists of one class, \c MainWindow, which both
+ constructs the GUI and handles the playback. We will now go
+ through the parts of its definition and implementation that
+ concerns Phonon.
+
+ \section1 MainWindow Class Definition
+
+ Most of the API in \c MainWindow is private, as is often the case
+ for classes that represent self-contained windows. We list Phonon
+ objects and slots we connect to their signals; we take a closer
+ look at them when we walk through the \c MainWindow
+ implementation.
+
+ \snippet examples/phonon/musicplayer/mainwindow.h 2
+
+ We use the \l{Phonon::}{SeekSlider} to move the current playback
+ position in the media stream, and the \l{Phonon::}{VolumeSlider}
+ controls the sound volume. Both of these widgets come ready made
+ with Phonon. We use another \l{Phonon::}{MediaObject},
+ metaInformationProvider, to get the meta information from the
+ music files. More on this later.
+
+ \snippet examples/phonon/musicplayer/mainwindow.h 1
+
+ The \l{Phonon::}{MediaObject} informs us of the state of the playback and
+ properties of the media it is playing back through a series of
+ signals. We connect the signals we need to slots in \c MainWindow.
+ The \c tableClicked() slot is connected to the table, so that we
+ know when the user requests playback of a new music file, by
+ clicking on the table.
+
+ \section1 MainWindow Class Implementation
+
+ The \c MainWindow class handles both the user interface and
+ Phonon. We will now take a look at the code relevant for Phonon.
+ The code required for setting up the GUI is explained elsewhere.
+
+ We start with the constructor:
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 0
+
+ We start by instantiating our media and audio output objects.
+ As mentioned, the media object knows how to playback
+ multimedia (in our case sound files) while the audio output
+ can send it to a sound device.
+
+ For the playback to work, the media and audio output objects need
+ to get in contact with each other, so that the media object can
+ send the sound to the audio output. Phonon is a graph based
+ framework, i.e., its objects are nodes that can be connected by
+ paths. Objects are connected using the \c createPath() function,
+ which is part of the Phonon namespace.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 1
+
+ We also connect signals of the media object to slots in our \c
+ MainWindow. We will examine them shortly.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 2
+
+ Finally, we call private helper functions to set up the GUI.
+ The \c setupUi() function contains code for setting up the seek
+ , and volume slider. We move on to \c setupUi():
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 3
+ \dots
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 4
+
+ After creating the widgets, they must be supplied with the
+ \l{Phonon::}{MediaObject} and \l{Phonon::}{AudioOutput} objects
+ they should control.
+
+ In the \c setupActions(), we connect the actions for the play,
+ pause, and stop tool buttons, to slots of the media object.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 5
+
+ We move on to the the slots of \c MainWindow, starting with \c
+ addFiles():
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 6
+
+ In the \c addFiles() slot, we add files selected by the user to
+ the \c sources list. We then set the first source selected on the
+ \c metaInformationProvider \l{Phonon::}{MediaObject}, which will
+ send a state changed signal when the meta information is resolved;
+ we have this signal connected to the \c metaStateChanged() slot.
+
+ The media object informs us of state changes by sending the \c
+ stateChanged() signal. The \c stateChanged() slot is connected
+ to this signal.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 9
+
+ The \l{Phonon::MediaObject::}{errorString()} function gives a
+ description of the error that is suitable for users of a Phonon
+ application. The two values of the \l{Phonon::}{ErrorState} enum
+ helps us determine whether it is possible to try to play the same
+ file again.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 10
+
+ We update the GUI when the playback state changes, i.e., when it
+ starts, pauses, stops, or resumes.
+
+ The media object will report other state changes, as defined by the
+ \l{Phonon::}{State} enum.
+
+ The \c tick() slot is connected to a \l{Phonon::}{MediaObject} signal which is
+ emitted when the playback position changes:
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 11
+
+ The \c time is given in milliseconds.
+
+ When the table is clicked on with the mouse, \c tableClick()
+ is invoked:
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 12
+
+ Since we stop the media object, we first check whether it is
+ currently playing. \c row contains the row in the table that was
+ clicked upon; the indices of \c sources follows the table, so we
+ can simply use \c row to find the new source.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 13
+
+ When the media source changes, we simply need to select the
+ corresponding row in the table.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 14
+
+ When \c metaStateChanged() is invoked, \c
+ metaInformationProvider has resolved the meta data for its current
+ source. A \l{Phonon::}{MediaObject} will do this before
+ entering \l{Phonon::}{StoppedState}. Note that we could also
+ have used the \l{Phonon::MediaObject::}{metaDataChanged()} signal for
+ this purpose.
+
+ Some of the meta data is then chosen to be displayed in the
+ music table. A file might not contain the meta data requested,
+ in which case an empty string is returned.
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 15
+
+ If we have media sources in \c sources of which meta information
+ is not resolved, we set a new source on the \c
+ metaInformationProvider, which will invoke \c metaStateChanged()
+ again.
+
+ We move on to the \c aboutToFinish() slot:
+
+ \snippet examples/phonon/musicplayer/mainwindow.cpp 16
+
+ When a file is finished playing, the Music Player will move on and
+ play the next file in the table. This slot is connected to the
+ \l{Phonon::}{MediaObject}'s
+ \l{Phonon::MediaObject::}{aboutToFinish()} signal, which is
+ guaranteed to be emitted while there is still time to enqueue
+ another file for playback.
+
+ \section1 The main() function.
+
+ Phonon requires that the application has a name; it is set with
+ \l{QCoreApplication::}{setApplicationName()}. This is because
+ D-Bus, which is used by Phonon on Linux systems, demands this.
+
+ \snippet examples/phonon/musicplayer/main.cpp 1
+*/
diff --git a/doc/src/examples/network-chat.qdoc b/doc/src/examples/network-chat.qdoc
new file mode 100644
index 0000000..3caeb9a
--- /dev/null
+++ b/doc/src/examples/network-chat.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/network-chat
+ \title Network Chat Example
+
+ The Network Chat example demonstrates a stateful peer-to-peer Chat client
+ that uses broadcasting with QUdpSocket and QNetworkInterface to discover
+ its peers.
+
+ \image network-chat-example.png
+*/
diff --git a/doc/src/examples/orderform.qdoc b/doc/src/examples/orderform.qdoc
new file mode 100644
index 0000000..f6f2607
--- /dev/null
+++ b/doc/src/examples/orderform.qdoc
@@ -0,0 +1,378 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example richtext/orderform
+ \title Order Form Example
+
+ The Order Form example shows how to generate rich text documents by
+ combining a simple template with data input by the user in a dialog. Data
+ is extracted from a \c DetailsDialog object and displayed on a QTextEdit
+ with a QTextCursor, using various formats. Each form generated is added
+ to a QTabWidget for easy access.
+
+ \image orderform-example.png
+
+ \section1 DetailsDialog Definition
+
+ The \c DetailsDialog class is a subclass of QDialog, implementing a slot
+ \c verify() to allow contents of the \c DetailsDialog to be verified later.
+ This is further explained in \c DetailsDialog Implementation.
+
+ \snippet examples/richtext/orderform/detailsdialog.h 0
+
+ The constructor of \c DetailsDialog accepts parameters \a title and
+ \a parent. The class defines four \e{getter} functions: \c orderItems(),
+ \c senderName(), \c senderAddress(), and \c sendOffers() to allow data
+ to be accessed externally.
+
+ The class definition includes input widgets for the required
+ fields, \c nameEdit and \c addressEdit. Also, a QCheckBox and a
+ QDialogButtonBox are defined; the former to provide the user with the
+ option to receive information on products and offers, and the latter
+ to ensure that buttons used are arranged according to the user's native
+ platform. In addition, a QTableWidget, \c itemsTable, is used to hold
+ order details.
+
+ The screenshot below shows the \c DetailsDialog we intend to create.
+
+ \image orderform-example-detailsdialog.png
+
+ \section1 DetailsDialog Implementation
+
+ The constructor of \c DetailsDialog instantiates the earlier defined fields
+ and their respective labels. The label for \c offersCheckBox is set and the
+ \c setupItemsTable() function is invoked to setup and populate
+ \c itemsTable. The QDialogButtonBox object, \c buttonBox, is instantiated
+ with \gui OK and \gui Cancel buttons. This \c buttonBox's \c accepted() and
+ \c rejected() signals are connected to the \c verify() and \c reject()
+ slots in \c DetailsDialog.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 0
+
+ A QGridLayout is used to place all the objects on the \c DetailsDialog.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 1
+
+ The \c setupItemsTable() function instantiates the QTableWidget object,
+ \c itemsTable, and sets the number of rows based on the QStringList
+ object, \c items, which holds the type of items ordered. The number of
+ columns is set to 2, providing a "name" and "quantity" layout. A \c for
+ loop is used to populate the \c itemsTable and the \c name item's flag
+ is set to Qt::ItemIsEnabled or Qt::ItemIsSelectable. For demonstration
+ purposes, the \c quantity item is set to a 1 and all items in the
+ \c itemsTable have this value for quantity; but this can be modified by
+ editing the contents of the cells at run time.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 2
+
+ The \c orderItems() function extracts data from the \c itemsTable and
+ returns it in the form of a QList<QPair<QString,int>> where each QPair
+ corresponds to an item and the quantity ordered.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 3
+
+ The \c senderName() function is used to return the value of the QLineEdit
+ used to store the name field for the order form.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 4
+
+ The \c senderAddress() function is used to return the value of the
+ QTextEdit containing the address for the order form.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 5
+
+ The \c sendOffers() function is used to return a \c true or \c false
+ value that is used to determine if the customer in the order form
+ wishes to receive more information on the company's offers and promotions.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 6
+
+ The \c verify() function is an additionally implemented slot used to
+ verify the details entered by the user into the \c DetailsDialog. If
+ the details entered are incomplete, a QMessageBox is displayed
+ providing the user the option to discard the \c DetailsDialog. Otherwise,
+ the details are accepted and the \c accept() function is invoked.
+
+ \snippet examples/richtext/orderform/detailsdialog.cpp 7
+
+ \section1 MainWindow Definition
+
+ The \c MainWindow class is a subclass of QMainWindow, implementing two
+ slots - \c openDialog() and \c printFile(). It also contains a private
+ instance of QTabWidget, \c letters.
+
+ \snippet examples/richtext/orderform/mainwindow.h 0
+
+ \section1 MainWindow Implementation
+
+ The \c MainWindow constructor sets up the \c fileMenu and the required
+ actions, \c newAction and \c printAction. These actions' \c triggered()
+ signals are connected to the additionally implemented openDialog() slot
+ and the default close() slot. The QTabWidget, \c letters, is
+ instantiated and set as the window's central widget.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 0
+
+ The \c createLetter() function creates a new QTabWidget with a QTextEdit,
+ \c editor, as the parent. This function accepts four parameters that
+ correspond to we obtained through \c DetailsDialog, in order to "fill"
+ the \c editor.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 1
+
+ We then obtain the cursor for the \c editor using QTextEdit::textCursor().
+ The \c cursor is then moved to the start of the document using
+ QTextCursor::Start.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 2
+
+ Recall the structure of a \l{Rich Text Document Structure}
+ {Rich Text Document}, where sequences of frames and
+ tables are always separated by text blocks, some of which may contain no
+ information.
+
+ In the case of the Order Form Example, the document structure for this portion
+ is described by the table below:
+
+ \table
+ \row
+ \o {1, 8} frame with \e{referenceFrameFormat}
+ \row
+ \o block \o \c{A company}
+ \row
+ \o block
+ \row
+ \o block \o \c{321 City Street}
+ \row
+ \o block
+ \row
+ \o block \o \c{Industry Park}
+ \row
+ \o block
+ \row
+ \o block \o \c{Another country}
+ \endtable
+
+ This is accomplished with the following code:
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 3
+
+ Note that \c topFrame is the \c {editor}'s top-level frame and is not shown
+ in the document structure.
+
+ We then set the \c{cursor}'s position back to its last position in
+ \c topFrame and fill in the customer's name (provided by the constructor)
+ and address - using a \c foreach loop to traverse the QString, \c address.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 4
+
+ The \c cursor is now back in \c topFrame and the document structure for
+ the above portion of code is:
+
+ \table
+ \row
+ \o block \o \c{Donald}
+ \row
+ \o block \o \c{47338 Park Avenue}
+ \row
+ \o block \o \c{Big City}
+ \endtable
+
+ For spacing purposes, we invoke \l{QTextCursor::insertBlock()}
+ {insertBlock()} twice. The \l{QDate::currentDate()}{currentDate()} is
+ obtained and displayed. We use \l{QTextFrameFormat::setWidth()}
+ {setWidth()} to increase the width of \c bodyFrameFormat and we insert
+ a new frame with that width.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 5
+
+ The following code inserts standard text into the order form.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 6
+ \snippet examples/richtext/orderform/mainwindow.cpp 7
+
+ This part of the document structure now contains the date, a frame with
+ \c bodyFrameFormat, as well as the standard text.
+
+ \table
+ \row
+ \o block
+ \row
+ \o block
+ \row
+ \o block \o \c{Date: 25 May 2007}
+ \row
+ \o block
+ \row
+ \o {1, 4} frame with \e{bodyFrameFormat}
+ \row
+ \o block \o \c{I would like to place an order for the following items:}
+ \row
+ \o block
+ \row
+ \o block
+ \endtable
+
+ A QTextTableFormat object, \c orderTableFormat, is used to hold the type
+ of item and the quantity ordered.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 8
+
+ We use \l{QTextTable::cellAt()}{cellAt()} to set the headers for the
+ \c orderTable.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 9
+
+ Then, we iterate through the QList of QPair objects to populate
+ \c orderTable.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 10
+
+ The resulting document structure for this section is:
+
+ \table
+ \row
+ \o {1, 11} \c{orderTable} with \e{orderTableFormat}
+ \row
+ \o block \o \c{Product}
+ \row
+ \o block \o \c{Quantity}
+ \row
+ \o block \o \c{T-shirt}
+ \row
+ \o block \o \c{4}
+ \row
+ \o block \o \c{Badge}
+ \row
+ \o block \o \c{3}
+ \row
+ \o block \o \c{Reference book}
+ \row
+ \o block \o \c{2}
+ \row
+ \o block \o \c{Coffee cup}
+ \row
+ \o block \o \c{5}
+ \endtable
+
+ The \c cursor is then moved back to \c{topFrame}'s
+ \l{QTextFrame::lastPosition()}{lastPosition()} and more standard text
+ is inserted.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 11
+ \snippet examples/richtext/orderform/mainwindow.cpp 12
+
+ Another QTextTable is inserted, to display the customer's
+ preference regarding offers.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 13
+
+ The document structure for this portion is:
+
+ \table
+ \row
+ \o block
+ \row
+ \o block\o \c{Please update my...}
+ \row
+ \o {1, 5} block
+ \row
+ \o {1, 4} \c{offersTable}
+ \row
+ \o block \o \c{I want to receive...}
+ \row
+ \o block \o \c{I do not want to recieve...}
+ \row
+ \o block \o \c{X}
+ \endtable
+
+ The \c cursor is moved to insert "Sincerely" along with the customer's
+ name. More blocks are inserted for spacing purposes. The \c printAction
+ is enabled to indicate that an order form can now be printed.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 14
+
+ The bottom portion of the document structure is:
+
+ \table
+ \row
+ \o block
+ \row
+ \o {1, 5} block\o \c{Sincerely,}
+ \row
+ \o block
+ \row
+ \o block
+ \row
+ \o block
+ \row
+ \o block \o \c{Donald}
+ \endtable
+
+ The \c createSample() function is used for illustration purposes, to create
+ a sample order form.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 15
+
+ The \c openDialog() function opens a \c DetailsDialog object. If the
+ details in \c dialog are accepted, the \c createLetter() function is
+ invoked using the parameters extracted from \c dialog.
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 16
+
+ In order to print out the order form, a \c printFile() function is
+ included, as shown below:
+
+ \snippet examples/richtext/orderform/mainwindow.cpp 17
+
+ This function also allows the user to print a selected area with
+ QTextCursor::hasSelection(), instead of printing the entire document.
+
+ \section1 \c main() Function
+
+ The \c main() function instantiates \c MainWindow and sets its size to
+ 640x480 pixels before invoking the \c show() function and
+ \c createSample() function.
+
+ \snippet examples/richtext/orderform/main.cpp 0
+
+*/
diff --git a/doc/src/examples/overpainting.qdoc b/doc/src/examples/overpainting.qdoc
new file mode 100644
index 0000000..e19f54b
--- /dev/null
+++ b/doc/src/examples/overpainting.qdoc
@@ -0,0 +1,249 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/overpainting
+ \title Overpainting Example
+
+ The Overpainting example shows how QPainter can be used
+ to overpaint a scene rendered using OpenGL in a QGLWidget.
+
+ \image overpainting-example.png
+
+ QGLWidget provides a widget with integrated OpenGL graphics support
+ that enables 3D graphics to be displayed using normal OpenGL calls,
+ yet also behaves like any other standard Qt widget with support for
+ signals and slots, properties, and Qt's action system.
+
+ Usually, QGLWidget is subclassed to display a pure 3D scene; the
+ developer reimplements \l{QGLWidget::initializeGL()}{initializeGL()}
+ to initialize any required resources, \l{QGLWidget::resizeGL()}{resizeGL()}
+ to set up the projection and viewport, and
+ \l{QGLWidget::paintGL()}{paintGL()} to perform the OpenGL calls needed
+ to render the scene. However, it is possible to subclass QGLWidget
+ differently to allow 2D graphics, drawn using QPainter, to be
+ painted over a scene rendered using OpenGL.
+
+ In this example, we demonstrate how this is done by reusing the code
+ from the \l{Hello GL Example}{Hello GL} example to provide a 3D scene,
+ and painting over it with some translucent 2D graphics. Instead of
+ examining each class in detail, we only cover the parts of the
+ \c GLWidget class that enable overpainting, and provide more detailed
+ discussion in the final section of this document.
+
+ \section1 GLWidget Class Definition
+
+ The \c GLWidget class is a subclass of QGLWidget, based on the one used
+ in the \l{Hello GL Example}{Hello GL} example. Rather than describe the
+ class as a whole, we show the first few lines of the class and only
+ discuss the changes we have made to the rest of it:
+
+ \snippet examples/opengl/overpainting/glwidget.h 0
+ \dots
+ \snippet examples/opengl/overpainting/glwidget.h 1
+ \dots
+ \snippet examples/opengl/overpainting/glwidget.h 4
+
+ As usual, the widget uses \l{QGLWidget::initializeGL()}{initializeGL()}
+ to set up objects for our scene and perform other OpenGL initialization tasks.
+ The \l{QGLWidget::resizeGL()}{resizeGL()} function is used to ensure that
+ the 3D graphics in the scene are transformed correctly to the 2D viewport
+ displayed in the widget.
+
+ Instead of implementing \l{QGLWidget::paintGL()}{paintGL()} to handle updates
+ to the widget, we implement a normal QWidget::paintEvent(). This
+ allows us to mix OpenGL calls and QPainter operations in a controlled way.
+
+ In this example, we also implement QWidget::showEvent() to help with the
+ initialization of the 2D graphics used.
+
+ The new private member functions and variables relate exclusively to the
+ 2D graphics and animation. The \c animate() slot is called periodically by the
+ \c animationTimer to update the widget; the \c createBubbles() function
+ initializes the \c bubbles list with instances of a helper class used to
+ draw the animation; the \c drawInstructions() function is responsible for
+ a semi-transparent messages that is also overpainted onto the OpenGL scene.
+
+ \section1 GLWidget Class Implementation
+
+ Again, we only show the parts of the \c GLWidget implementation that are
+ relevant to this example. In the constructor, we initialize a QTimer to
+ control the animation:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 0
+
+ We turn off the widget's \l{QWidget::autoFillBackground}{autoFillBackground} property to
+ instruct OpenGL not to paint a background for the widget when
+ \l{QPainter::begin()}{QPainter::begin()} is called.
+
+ As in the \l{Hello GL Example}{Hello GL} example, the destructor is responsible
+ for freeing any OpenGL-related resources:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 1
+
+ The \c initializeGL() function is fairly minimal, only setting up the display
+ list used in the scene.
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 2
+
+ To cooperate fully with QPainter, we defer matrix stack operations and attribute
+ initialization until the widget needs to be updated.
+
+ In this example, we implement \l{QWidget::paintEvent()}{paintEvent()} rather
+ than \l{QGLWidget::paintGL()}{paintGL()} to render
+ our scene. When drawing on a QGLWidget, the paint engine used by QPainter
+ performs certain operations that change the states of the OpenGL
+ implementation's matrix and property stacks. Therefore, it is necessary to
+ make all the OpenGL calls to display the 3D graphics before we construct
+ a QPainter to draw the 2D overlay.
+
+ We render a 3D scene by setting up model and projection transformations
+ and other attributes. We use an OpenGL stack operation to preserve the
+ original matrix state, allowing us to recover it later:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 4
+
+ We define a color to use for the widget's background, and set up various
+ attributes that define how the scene will be rendered.
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 6
+
+ We call the \c setupViewport() private function to set up the
+ projection used for the scene. This is unnecessary in OpenGL
+ examples that implement the \l{QGLWidget::paintGL()}{paintGL()}
+ function because the matrix stacks are usually unmodified between
+ calls to \l{QGLWidget::resizeGL()}{resizeGL()} and
+ \l{QGLWidget::paintGL()}{paintGL()}.
+
+ Since the widget's background is not drawn by the system or by Qt, we use
+ an OpenGL call to paint it before positioning the object defined earlier
+ in the scene:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 7
+
+ Once the list containing the object has been executed, the matrix stack
+ needs to be restored to its original state at the start of this function
+ before we can begin overpainting:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 8
+
+ With the 3D graphics done, we construct a QPainter for use on the widget
+ and simply overpaint the widget with 2D graphics; in this case, using a
+ helper class to draw a number of translucent bubbles onto the widget,
+ and calling \c drawInstructions() to overlay some instructions:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 10
+
+ When QPainter::end() is called, suitable OpenGL-specific calls are made to
+ write the scene, and its additional contents, onto the widget.
+
+ The implementation of the \l{QGLWidget::resizeGL()}{resizeGL()} function
+ sets up the dimensions of the viewport and defines a projection
+ transformation:
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 11
+
+ Ideally, we want to arrange the 2D graphics to suit the widget's dimensions.
+ To achieve this, we implement the \l{QWidget::showEvent()}{showEvent()} handler,
+ creating new graphic elements (bubbles) if necessary at appropriate positions
+ in the widget.
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 12
+
+ This function only has an effect if less than 20 bubbles have already been
+ created.
+
+ The \c animate() slot is called every time the widget's \c animationTimer emits
+ the \l{QTimer::timeout()}{timeout()} signal. This keeps the bubbles moving
+ around.
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 13
+
+ We simply iterate over the bubbles in the \c bubbles list, updating the
+ widget before and after each of them is moved.
+
+ The \c setupViewport() function is called from \c paintEvent()
+ and \c resizeGL().
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 14
+
+ The \c drawInstructions() function is used to prepare some basic
+ instructions that will be painted with the other 2D graphics over
+ the 3D scene.
+
+ \snippet examples/opengl/overpainting/glwidget.cpp 15
+
+ \section1 Summary
+
+ When overpainting 2D content onto 3D content, we need to use a QPainter
+ \e and make OpenGL calls to achieve the desired effect. Since QPainter
+ itself uses OpenGL calls when used on a QGLWidget subclass, we need to
+ preserve the state of various OpenGL stacks when we perform our own
+ calls, using the following approach:
+
+ \list
+ \o Reimplement QGLWidget::initializeGL(), but only perform minimal
+ initialization. QPainter will perform its own initialization
+ routines, modifying the matrix and property stacks, so it is better
+ to defer certain initialization tasks until just before you render
+ the 3D scene.
+ \o Reimplement QGLWidget::resizeGL() as in the pure 3D case.
+ \o Reimplement QWidget::paintEvent() to draw both 2D and 3D graphics.
+ \endlist
+
+ The \l{QWidget::paintEvent()}{paintEvent()} implementation performs the
+ following tasks:
+
+ \list
+ \o Push the current OpenGL modelview matrix onto a stack.
+ \o Perform initialization tasks usually done in the
+ \l{QGLWidget::initializeGL()}{initializeGL()} function.
+ \o Perform code that would normally be located in the widget's
+ \l{QGLWidget::resizeGL()}{resizeGL()} function to set the correct
+ perspective transformation and set up the viewport.
+ \o Render the scene using OpenGL calls.
+ \o Pop the OpenGL modelview matrix off the stack.
+ \o Construct a QPainter object.
+ \o Initialize it for use on the widget with the QPainter::begin() function.
+ \o Draw primitives using QPainter's member functions.
+ \o Call QPainter::end() to finish painting.
+ \endlist
+*/
diff --git a/doc/src/examples/padnavigator.qdoc b/doc/src/examples/padnavigator.qdoc
new file mode 100644
index 0000000..f43725b
--- /dev/null
+++ b/doc/src/examples/padnavigator.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/padnavigator
+ \title Pad Navigator Example
+
+ The Pad Navigator Example shows how you can use Graphics View
+ together with embedded widgets to create a simple but useful
+ dynamic user interface for embedded devices.
+
+ \image padnavigator-example.png
+*/
diff --git a/doc/src/examples/painterpaths.qdoc b/doc/src/examples/painterpaths.qdoc
new file mode 100644
index 0000000..fd27566
--- /dev/null
+++ b/doc/src/examples/painterpaths.qdoc
@@ -0,0 +1,432 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/painterpaths
+ \title Painter Paths Example
+
+ The Painter Paths example shows how painter paths can be used to
+ build complex shapes for rendering.
+
+ \image painterpaths-example.png
+
+ The QPainterPath class provides a container for painting
+ operations, enabling graphical shapes to be constructed and
+ reused.
+
+ A painter path is an object composed of a number of graphical
+ building blocks (such as rectangles, ellipses, lines, and curves),
+ and can be used for filling, outlining, and clipping. The main
+ advantage of painter paths over normal drawing operations is that
+ complex shapes only need to be created once, but they can be drawn
+ many times using only calls to QPainter::drawPath().
+
+ The example consists of two classes:
+
+ \list
+ \o The \c RenderArea class which is a custom widget displaying
+ a single painter path.
+ \o The \c Window class which is the applications main window
+ displaying several \c RenderArea widgets, and allowing the user
+ to manipulate the painter paths' filling, pen, color
+ and rotation angle.
+ \endlist
+
+ First we will review the \c Window class, then we will take a look
+ at the \c RenderArea class.
+
+ \section1 Window Class Definition
+
+ The \c Window class inherits QWidget, and is the applications main
+ window displaying several \c RenderArea widgets, and allowing the
+ user to manipulate the painter paths' filling, pen, color and
+ rotation angle.
+
+ \snippet examples/painting/painterpaths/window.h 0
+
+ We declare three private slots to respond to user input regarding
+ filling and color: \c fillRuleChanged(), \c fillGradientChanged()
+ and \c penColorChanged().
+
+ When the user changes the pen width and the rotation angle, the
+ new value is passed directly on to the \c RenderArea widgets using
+ the QSpinBox::valueChanged() signal. The reason why we must
+ implement slots to update the filling and color, is that QComboBox
+ doesn't provide a similar signal passing the new value as
+ argument; so we need to retrieve the new value, or values, before
+ we can update the \c RenderArea widgets.
+
+ \snippet examples/painting/painterpaths/window.h 1
+
+ We also declare a couple of private convenience functions: \c
+ populateWithColors() populates a given QComboBox with items
+ corresponding to the color names Qt knows about, and \c
+ currentItemData() returns the current item for a given QComboBox.
+
+ \snippet examples/painting/painterpaths/window.h 2
+
+ Then we declare the various components of the main window
+ widget. We also declare a convenience constant specifying the
+ number of \c RenderArea widgets.
+
+ \section1 Window Class Implementation
+
+ In the implementation of the \c Window class we first declare the
+ constant \c Pi with six significant figures:
+
+ \snippet examples/painting/painterpaths/window.cpp 0
+
+ In the constructor, we then define the various painter paths and
+ create corresponding \c RenderArea widgets which will render the
+ graphical shapes:
+
+ \snippet examples/painting/painterpaths/window.cpp 1
+
+ We construct a rectangle with sharp corners using the
+ QPainterPath::moveTo() and QPainterPath::lineTo()
+ functions.
+
+ QPainterPath::moveTo() moves the current point to the point passed
+ as argument. A painter path is an object composed of a number of
+ graphical building blocks, i.e. subpaths. Moving the current point
+ will also start a new subpath (implicitly closing the previously
+ current path when the new one is started). The
+ QPainterPath::lineTo() function adds a straight line from the
+ current point to the given end point. After the line is drawn, the
+ current point is updated to be at the end point of the line.
+
+ We first move the current point starting a new subpath, and we
+ draw three of the rectangle's sides. Then we call the
+ QPainterPath::closeSubpath() function which draws a line to the
+ beginning of the current subpath. A new subpath is automatically
+ begun when the current subpath is closed. The current point of the
+ new path is (0, 0). We could also have called
+ QPainterPath::lineTo() to draw the last line as well, and then
+ explicitly start a new subpath using the QPainterPath::moveTo()
+ function.
+
+ QPainterPath also provide the QPainterPath::addRect() convenience
+ function, which adds a given rectangle to the path as a closed
+ subpath. The rectangle is added as a clockwise set of lines. The
+ painter path's current position after the rect has been added is
+ at the top-left corner of the rectangle.
+
+ \snippet examples/painting/painterpaths/window.cpp 2
+
+ Then we construct a rectangle with rounded corners. As before, we
+ use the QPainterPath::moveTo() and QPainterPath::lineTo()
+ functions to draw the rectangle's sides. To create the rounded
+ corners we use the QPainterPath::arcTo() function.
+
+ QPainterPath::arcTo() creates an arc that occupies the given
+ rectangle (specified by a QRect or the rectangle's coordinates),
+ beginning at the given start angle and extending the given degrees
+ counter-clockwise. Angles are specified in degrees. Clockwise arcs
+ can be specified using negative angles. The function connects the
+ current point to the starting point of the arc if they are not
+ already connected.
+
+ \snippet examples/painting/painterpaths/window.cpp 3
+
+ We also use the QPainterPath::arcTo() function to construct the
+ ellipse path. First we move the current point starting a new
+ path. Then we call QPainterPath::arcTo() with starting angle 0.0
+ and 360.0 degrees as the last argument, creating an ellipse.
+
+ Again, QPainterPath provides a convenience function (
+ QPainterPath::addEllipse()) which creates an ellipse within a
+ given bounding rectangle and adds it to the painter path. If the
+ current subpath is closed, a new subpath is started. The ellipse
+ is composed of a clockwise curve, starting and finishing at zero
+ degrees (the 3 o'clock position).
+
+ \snippet examples/painting/painterpaths/window.cpp 4
+
+ When constructing the pie chart path we continue to use a
+ combination of the mentioned functions: First we move the current
+ point, starting a new subpath. Then we create a line from the
+ center of the chart to the arc, and the arc itself. When we close
+ the subpath, we implicitly construct the last line back to the
+ center of the chart.
+
+ \snippet examples/painting/painterpaths/window.cpp 5
+
+ Constructing a polygon is equivalent to constructing a rectangle.
+
+ QPainterPath also provide the QPainterPath::addPolygon()
+ convenience function which adds the given polygon to the path as a
+ new subpath. Current position after the polygon has been added is
+ the last point in polygon.
+
+ \snippet examples/painting/painterpaths/window.cpp 6
+
+ Then we create a path consisting of a group of subpaths: First we
+ move the current point, and create a circle using the
+ QPainterPath::arcTo() function with starting angle 0.0, and 360
+ degrees as the last argument, as we did when we created the
+ ellipse path. Then we move the current point again, starting a
+ new subpath, and construct three sides of a square using the
+ QPainterPath::lineTo() function.
+
+ Now, when we call the QPainterPath::closeSubpath() fucntion the
+ last side is created. Remember that the
+ QPainterPath::closeSubpath() function draws a line to the
+ beginning of the \e current subpath, i.e the square.
+
+ QPainterPath provide a convenience function,
+ QPainterPath::addPath() which adds a given path to the path that
+ calls the function.
+
+ \snippet examples/painting/painterpaths/window.cpp 7
+
+ When creating the text path, we first create the font. Then we set
+ the font's style strategy which tells the font matching algorithm
+ what type of fonts should be used to find an appropriate default
+ family. QFont::ForceOutline forces the use of outline fonts.
+
+ To construct the text, we use the QPainterPath::addText() function
+ which adds the given text to the path as a set of closed subpaths
+ created from the supplied font. The subpaths are positioned so
+ that the left end of the text's baseline lies at the specified
+ point.
+
+ \snippet examples/painting/painterpaths/window.cpp 8
+
+ To create the Bezier path, we use the QPainterPath::cubicTo()
+ function which adds a Bezier curve between the current point and
+ the given end point with the given control point. After the curve
+ is added, the current point is updated to be at the end point of
+ the curve.
+
+ In this case we omit to close the subpath so that we only have a
+ simple curve. But there is still a logical line from the curve's
+ endpoint back to the beginning of the subpath; it becomes visible
+ when filling the path as can be seen in the applications main
+ window.
+
+ \snippet examples/painting/painterpaths/window.cpp 9
+
+ The final path that we construct shows that you can use
+ QPainterPath to construct rather complex shapes using only the
+ previous mentioned QPainterPath::moveTo(), QPainterPath::lineTo()
+ and QPainterPath::closeSubpath() functions.
+
+ \snippet examples/painting/painterpaths/window.cpp 10
+
+ Now that we have created all the painter paths that we need, we
+ create a corresponding \c RenderArea widget for each. In the end,
+ we make sure that the number of render areas is correct using the
+ Q_ASSERT() macro.
+
+ \snippet examples/painting/painterpaths/window.cpp 11
+
+ Then we create the widgets associated with the painter paths' fill
+ rule.
+
+ There are two available fill rules in Qt: The Qt::OddEvenFill rule
+ determine whether a point is inside the shape by drawing a
+ horizontal line from the point to a location outside the shape,
+ and count the number of intersections. If the number of
+ intersections is an odd number, the point is inside the
+ shape. This rule is the default.
+
+ The Qt::WindingFill rule determine whether a point is inside the
+ shape by drawing a horizontal line from the point to a location
+ outside the shape. Then it determines whether the direction of the
+ line at each intersection point is up or down. The winding number
+ is determined by summing the direction of each intersection. If
+ the number is non zero, the point is inside the shape.
+
+ The Qt::WindingFill rule can in most cases be considered as the
+ intersection of closed shapes.
+
+ \snippet examples/painting/painterpaths/window.cpp 12
+
+ We also create the other widgets associated with the filling, the
+ pen and the rotation angle.
+
+ \snippet examples/painting/painterpaths/window.cpp 16
+
+ We connect the comboboxes \l {QComboBox::activated()}{activated()}
+ signals to the associated slots in the \c Window class, while we
+ connect the spin boxes \l
+ {QSpinBox::valueChanged()}{valueChanged()} signal directly to the
+ \c RenderArea widget's respective slots.
+
+ \snippet examples/painting/painterpaths/window.cpp 17
+
+ We add the \c RenderArea widgets to a separate layout which we
+ then add to the main layout along with the rest of the widgets.
+
+ \snippet examples/painting/painterpaths/window.cpp 18
+
+ Finally, we initialize the \c RenderArea widgets by calling the \c
+ fillRuleChanged(), \c fillGradientChanged() and \c
+ penColorChanged() slots, and we set the inital pen width and
+ window title.
+
+ \snippet examples/painting/painterpaths/window.cpp 19
+ \codeline
+ \snippet examples/painting/painterpaths/window.cpp 20
+ \codeline
+ \snippet examples/painting/painterpaths/window.cpp 21
+
+ The private slots are implemented to retrieve the new value, or
+ values, from the associated comboboxes and update the RenderArea
+ widgets.
+
+ First we determine the new value, or values, using the private \c
+ currentItemData() function and the qvariant_cast() template
+ function. Then we call the associated slot for each of the \c
+ RenderArea widgets to update the painter paths.
+
+ \snippet examples/painting/painterpaths/window.cpp 22
+
+ The \c populateWithColors() function populates the given combobox
+ with items corresponding to the color names Qt knows about
+ provided by the static QColor::colorNames() function.
+
+ \snippet examples/painting/painterpaths/window.cpp 23
+
+ The \c currentItemData() function simply return the current item
+ of the given combobox.
+
+ \section1 RenderArea Class Definition
+
+ The \c RenderArea class inherits QWidget, and is a custom widget
+ displaying a single painter path.
+
+ \snippet examples/painting/painterpaths/renderarea.h 0
+
+ We declare several public slots updating the \c RenderArea
+ widget's associated painter path. In addition we reimplement the
+ QWidget::minimumSizeHint() and QWidget::sizeHint() functions to
+ give the \c RenderArea widget a reasonable size within our
+ application, and we reimplement the QWidget::paintEvent() event
+ handler to draw its painter path.
+
+ \snippet examples/painting/painterpaths/renderarea.h 1
+
+ Each instance of the \c RenderArea class has a QPainterPath, a
+ couple of fill colors, a pen width, a pen color and a rotation
+ angle.
+
+ \section1 RenderArea Class Implementation
+
+ The constructor takes a QPainterPath as argument (in addition to
+ the optional QWidget parent):
+
+ \snippet examples/painting/painterpaths/renderarea.cpp 0
+
+ In the constructor we initialize the \c RenderArea widget with the
+ QPainterPath parameter as well as initializing the pen width and
+ rotation angle. We also set the widgets \l
+ {QWidget::backgroundRole()}{background role}; QPalette::Base is
+ typically white.
+
+ \snippet examples/painting/painterpaths/renderarea.cpp 1
+ \codeline
+ \snippet examples/painting/painterpaths/renderarea.cpp 2
+
+ Then we reimplement the QWidget::minimumSizeHint() and
+ QWidget::sizeHint() functions to give the \c RenderArea widget a
+ reasonable size within our application.
+
+ \snippet examples/painting/painterpaths/renderarea.cpp 3
+ \codeline
+ \snippet examples/painting/painterpaths/renderarea.cpp 4
+ \codeline
+ \snippet examples/painting/painterpaths/renderarea.cpp 5
+ \codeline
+ \snippet examples/painting/painterpaths/renderarea.cpp 6
+ \codeline
+ \snippet examples/painting/painterpaths/renderarea.cpp 7
+
+ The various public slots updates the \c RenderArea widget's
+ painter path by setting the associated property and make a call to
+ the QWidget::update() function, forcing a repaint of the widget
+ with the new rendering preferences.
+
+ The QWidget::update() slot does not cause an immediate repaint;
+ instead it schedules a paint event for processing when Qt returns
+ to the main event loop.
+
+ \snippet examples/painting/painterpaths/renderarea.cpp 8
+
+ A paint event is a request to repaint all or parts of the
+ widget. The paintEvent() function is an event handler that can be
+ reimplemented to receive the widget's paint events. We reimplement
+ the event handler to render the \c RenderArea widget's painter
+ path.
+
+ First, we create a QPainter for the \c RenderArea instance, and
+ set the painter's render hints. The QPainter::RenderHints are used
+ to specify flags to QPainter that may, or may not, be respected by
+ any given engine. QPainter::Antialiasing indicates that the engine
+ should anti-alias the edges of primitives if possible, i.e. put
+ additional pixels around the original ones to smooth the edges.
+
+ \snippet examples/painting/painterpaths/renderarea.cpp 9
+
+ Then we scale the QPainter's coordinate system to ensure that the
+ painter path is rendered in the right size, i.e that it grows with
+ the \c RenderArea widget when the application is resized. When we
+ constructed the various painter paths, they were all rnedered
+ within a square with a 100 pixel width wich is equivalent to \c
+ RenderArea::sizeHint(). The QPainter::scale() function scales the
+ coordinate system by the \c RenderArea widget's \e current width
+ and height divided by 100.
+
+ Now, when we are sure that the painter path has the right size, we
+ can translate the coordinate system to make the painter path
+ rotate around the \c RenderArea widget's center. After we have
+ performed the rotation, we must remember to translate the
+ coordinate system back again.
+
+ \snippet examples/painting/painterpaths/renderarea.cpp 10
+
+ Then we set the QPainter's pen with the instance's rendering
+ preferences. We create a QLinearGradient and set its colors
+ corresponding to the \c RenderArea widget's fill colors. Finally,
+ we set the QPainter's brush (the gradient is automatically
+ converted into a QBrush), and draw the \c RenderArea widget's
+ painter path using the QPainter::drawPath() function.
+*/
diff --git a/doc/src/examples/pbuffers.qdoc b/doc/src/examples/pbuffers.qdoc
new file mode 100644
index 0000000..347cf3d
--- /dev/null
+++ b/doc/src/examples/pbuffers.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/pbuffers
+ \title Pixel Buffers Example
+
+ The Pixel Buffers example demonstrates how to use the
+ QGLPixelBuffer class to render into an off-screen buffer and use
+ the contents as a dynamic texture in a QGLWidget.
+
+ \image pbuffers-example.png
+*/
diff --git a/doc/src/examples/pbuffers2.qdoc b/doc/src/examples/pbuffers2.qdoc
new file mode 100644
index 0000000..5426852
--- /dev/null
+++ b/doc/src/examples/pbuffers2.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/pbuffers2
+ \title Pixel Buffers 2 Example
+
+ The Pixel Buffers 2 example demonstrates how to use the
+ QGLPixelBuffer class to render into an off-screen buffer and use
+ the contents as a dynamic texture in a QGLWidget.
+
+ \image pbuffers2-example.png
+*/
diff --git a/doc/src/examples/pixelator.qdoc b/doc/src/examples/pixelator.qdoc
new file mode 100644
index 0000000..2a8b43d
--- /dev/null
+++ b/doc/src/examples/pixelator.qdoc
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/pixelator
+ \title Pixelator Example
+
+ The Pixelator example shows how delegates can be used to customize the way that
+ items are rendered in standard item views.
+
+ \image pixelator-example.png
+
+ By default, QTreeView, QTableView, and QListView use a standard item delegate
+ to display and edit a set of common data types that are sufficient for many
+ applications. However, an application may need to represent items of data in a
+ particular way, or provide support for rendering more specialized data types,
+ and this often requires the use of a custom delegate.
+
+ In this example, we show how to use custom delegates to modify the appearance
+ of standard views. To do this, we implement the following components:
+
+ \list
+ \i A model which represents each pixel in an image as an item of data, where each
+ item contains a value for the brightness of the corresponding pixel.
+ \i A custom delegate that uses the information supplied by the model to represent
+ each pixel as a black circle on a white background, where the radius of the
+ circle corresponds to the darkness of the pixel.
+ \endlist
+
+ This example may be useful for developers who want to implement their own table
+ models or custom delegates. The process of creating custom delegates for editing
+ item data is covered in the \l{Spin Box Delegate Example}{Spin Box Delegate}
+ example.
+
+ \section1 ImageModel Class Definition
+
+ The \c ImageModel class is defined as follows:
+
+ \snippet examples/itemviews/pixelator/imagemodel.h 0
+
+ Since we only require a simple, read-only table model, we only need to implement
+ functions to indicate the dimensions of the image and supply data to other
+ components.
+
+ For convenience, the image to be used is passed in the constructor.
+
+ \section1 ImageModel Class Implementation
+
+ The constructor is trivial:
+
+ \snippet examples/itemviews/pixelator/imagemodel.cpp 0
+
+ The \c setImage() function sets the image that will be used by the model:
+
+ \snippet examples/itemviews/pixelator/imagemodel.cpp 1
+
+ The QAbstractItemModel::reset() call tells the view(s) that the model
+ has changed.
+
+ The \c rowCount() and \c columnCount() functions return the height and width of
+ the image respectively:
+
+ \snippet examples/itemviews/pixelator/imagemodel.cpp 2
+ \snippet examples/itemviews/pixelator/imagemodel.cpp 3
+
+ Since the image is a simple two-dimensional structure, the \c parent arguments
+ to these functions are unused. They both simply return the relevant size from
+ the underlying image object.
+
+ The \c data() function returns data for the item that corresponds to a given
+ model index in a format that is suitable for a particular role:
+
+ \snippet examples/itemviews/pixelator/imagemodel.cpp 4
+
+ In this implementation, we only check that the model index is valid, and that
+ the role requested is the \l{Qt::ItemDataRole}{DisplayRole}. If so, the function
+ returns the grayscale value of the relevant pixel in the image; otherwise, a null
+ model index is returned.
+
+ This model can be used with QTableView to display the integer brightness values
+ for the pixels in the image. However, we will implement a custom delegate to
+ display this information in a more artistic way.
+
+ The \c headerData() function is also reimplemented:
+
+ \snippet examples/itemviews/pixelator/imagemodel.cpp 5
+
+ We return (1, 1) as the size hint for a header item. If we
+ didn't, the headers would default to a larger size, preventing
+ us from displaying really small items (which can be specified
+ using the \gui{Pixel size} combobox).
+
+ \section1 PixelDelegate Class Definition
+
+ The \c PixelDelegate class is defined as follows:
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.h 0
+
+ This class provides only basic features for a delegate so, unlike the
+ \l{Spin Box Delegate Example}{Spin Box Delegate} example, we subclass
+ QAbstractItemDelegate instead of QItemDelegate.
+
+ We only need to reimplement \l{QAbstractItemDelegate::paint()}{paint()} and
+ \l{QAbstractItemDelegate::sizeHint()}{sizeHint()} in this class.
+ However, we also provide a delegate-specific \c setPixelSize() function so
+ that we can change the delegate's behavior via the signals and slots mechanism.
+
+ \section1 PixelDelegate Class Implementation
+
+ The \c PixelDelegate constructor is used to set up a default value for
+ the size of each "pixel" that it renders. The base class constructor is
+ also called to ensure that the delegate is set up with a parent object,
+ if one is supplied:
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 0
+
+ Each item is rendered by the delegate's
+ \l{QAbstractItemDelegate::paint()}{paint()} function. The view calls this
+ function with a ready-to-use QPainter object, style information that the
+ delegate should use to correctly draw the item, and an index to the item in
+ the model:
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 1
+
+ The first task the delegate has to perform is to draw the item's background
+ correctly. Usually, selected items appear differently to non-selected items,
+ so we begin by testing the state passed in the style option and filling the
+ background if necessary.
+
+ The radius of each circle is calculated in the following lines of code:
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 3
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 4
+
+ First, the largest possible radius of the circle is determined by taking the
+ smallest dimension of the style option's \c rect attribute.
+ Using the model index supplied, we obtain a value for the brightness of the
+ relevant pixel in the image. The radius of the circle is calculated by
+ scaling the brightness to fit within the item and subtracting it from the
+ largest possible radius.
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 5
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 6
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 7
+
+ We save the painter's state, turn on antialiasing (to obtain smoother
+ curves), and turn off the pen.
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 8
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 9
+
+ The foreground of the item (the circle representing a pixel) must be
+ rendered using an appropriate brush. For unselected items, we will use a
+ solid black brush; selected items are drawn using a predefined brush from
+ the style option's palette.
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 10
+
+ Finally, we paint the circle within the rectangle specified by the style
+ option and we call \l{QPainter::}{restore()} on the painter.
+
+ The \c paint() function does not have to be particularly complicated; it is
+ only necessary to ensure that the state of the painter when the function
+ returns is the same as it was when it was called. This usually
+ means that any transformations applied to the painter must be preceded by
+ a call to QPainter::save() and followed by a call to QPainter::restore().
+
+ The delegate's \l{QAbstractItemDelegate::}{sizeHint()} function
+ returns a size for the item based on the predefined pixel size, initially set
+ up in the constructor:
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 11
+
+ The delegate's size is updated whenever the pixel size is changed.
+ We provide a custom slot to do this:
+
+ \snippet examples/itemviews/pixelator/pixeldelegate.cpp 12
+
+ \section1 Using The Custom Delegate
+
+ In this example, we use a main window to display a table of data, using the
+ custom delegate to render each cell in a particular way. Much of the
+ \c MainWindow class performs tasks that are not related to item views. Here,
+ we only quote the parts that are relevant. You can look at the rest of the
+ implementation by following the links to the code at the top of this
+ document.
+
+ In the constructor, we set up a table view, turn off its grid, and hide its
+ headers:
+
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 0
+ \dots
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 1
+
+ This enables the items to be drawn without any gaps between them. Removing
+ the headers also prevents the user from adjusting the sizes of individual
+ rows and columns.
+
+ We also set the minimum section size to 1 on the headers. If we
+ didn't, the headers would default to a larger size, preventing
+ us from displaying really small items (which can be specified
+ using the \gui{Pixel size} combobox).
+
+ The custom delegate is constructed with the main window as its parent, so
+ that it will be deleted correctly later, and we set it on the table view.
+
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 2
+
+ Each item in the table view will be rendered by the \c PixelDelegate
+ instance.
+
+ We construct a spin box to allow the user to change the size of each "pixel"
+ drawn by the delegate:
+
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 3
+
+ This spin box is connected to the custom slot we implemented in the
+ \c PixelDelegate class. This ensures that the delegate always draws each
+ pixel at the currently specified size:
+
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 4
+ \dots
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 5
+
+ We also connect the spin box to a slot in the \c MainWindow class. This
+ forces the view to take into account the new size hints for each item;
+ these are provided by the delegate in its \c sizeHint() function.
+
+ \snippet examples/itemviews/pixelator/mainwindow.cpp 6
+
+ We explicitly resize the columns and rows to match the
+ \gui{Pixel size} combobox.
+*/
diff --git a/doc/src/examples/plugandpaint.qdoc b/doc/src/examples/plugandpaint.qdoc
new file mode 100644
index 0000000..3cdd8a4
--- /dev/null
+++ b/doc/src/examples/plugandpaint.qdoc
@@ -0,0 +1,554 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/plugandpaint
+ \title Plug & Paint Example
+
+ The Plug & Paint example demonstrates how to write Qt
+ applications that can be extended through plugins.
+
+ \image plugandpaint.png Screenshot of the Plug & Paint example
+
+ A plugin is a dynamic library that can be loaded at run-time to
+ extend an application. Qt makes it possible to create custom
+ plugins and to load them using QPluginLoader. To ensure that
+ plugins don't get lost, it is also possible to link them
+ statically to the executable. The Plug & Paint example uses
+ plugins to support custom brushes, shapes, and image filters. A
+ single plugin can provide multiple brushes, shapes, and/or
+ filters.
+
+ If you want to learn how to make your own application extensible
+ through plugins, we recommend that you start by reading this
+ overview, which explains how to make an application use plugins.
+ Afterward, you can read the
+ \l{tools/plugandpaintplugins/basictools}{Basic Tools} and
+ \l{tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ overviews, which show how to implement static and dynamic
+ plugins, respectively.
+
+ Plug & Paint consists of the following classes:
+
+ \list
+ \o \c MainWindow is a QMainWindow subclass that provides the menu
+ system and that contains a \c PaintArea as the central widget.
+ \o \c PaintArea is a QWidget that allows the user to draw using a
+ brush and to insert shapes.
+ \o \c PluginDialog is a dialog that shows information about the
+ plugins detected by the application.
+ \o \c BrushInterface, \c ShapeInterface, and \c FilterInterface are
+ abstract base classes that can be implemented by plugins to
+ provide custom brushes, shapes, and image filters.
+ \endlist
+
+ \section1 The Plugin Interfaces
+
+ We will start by reviewing the interfaces defined in \c
+ interfaces.h. These interfaces are used by the Plug & Paint
+ application to access extra functionality. They are implemented
+ in the plugins.
+
+
+ \snippet examples/tools/plugandpaint/interfaces.h 0
+
+ The \c BrushInterface class declares four pure virtual functions.
+ The first pure virtual function, \c brushes(), returns a list of
+ strings that identify the brushes provided by the plugin. By
+ returning a QStringList instead of a QString, we make it possible
+ for a single plugin to provide multiple brushes. The other
+ functions have a \c brush parameter to identify which brush
+ (among those returned by \c brushes()) is used.
+
+ \c mousePress(), \c mouseMove(), and \c mouseRelease() take a
+ QPainter and one or two \l{QPoint}s, and return a QRect
+ identifying which portion of the image was altered by the brush.
+
+ The class also has a virtual destructor. Interface classes
+ usually don't need such a destructor (because it would make
+ little sense to \c delete the object that implements the
+ interface through a pointer to the interface), but some compilers
+ emit a warning for classes that declare virtual functions but no
+ virtual destructor. We provide the destructor to keep these
+ compilers happy.
+
+ \snippet examples/tools/plugandpaint/interfaces.h 1
+
+ The \c ShapeInterface class declares a \c shapes() function that
+ works the same as \c{BrushInterface}'s \c brushes() function, and
+ a \c generateShape() function that has a \c shape parameter.
+ Shapes are represented by a QPainterPath, a data type that can
+ represent arbitrary 2D shapes or combinations of shapes. The \c
+ parent parameter can be used by the plugin to pop up a dialog
+ asking the user to specify more information.
+
+ \snippet examples/tools/plugandpaint/interfaces.h 2
+
+ The \c FilterInterface class declares a \c filters() function
+ that returns a list of filter names, and a \c filterImage()
+ function that applies a filter to an image.
+
+ \snippet examples/tools/plugandpaint/interfaces.h 4
+
+ To make it possible to query at run-time whether a plugin
+ implements a given interface, we must use the \c
+ Q_DECLARE_INTERFACE() macro. The first argument is the name of
+ the interface. The second argument is a string identifying the
+ interface in a unique way. By convention, we use a "Java package
+ name" syntax to identify interfaces. If we later change the
+ interfaces, we must use a different string to identify the new
+ interface; otherwise, the application might crash. It is therefore
+ a good idea to include a version number in the string, as we did
+ above.
+
+ The \l{tools/plugandpaintplugins/basictools}{Basic Tools} plugin
+ and the \l{tools/plugandpaintplugins/extrafilters}{Extra Filters}
+ plugin shows how to derive from \c BrushInterface, \c
+ ShapeInterface, and \c FilterInterface.
+
+ A note on naming: It might have been tempting to give the \c
+ brushes(), \c shapes(), and \c filters() functions a more generic
+ name, such as \c keys() or \c features(). However, that would
+ have made multiple inheritance impractical. When creating
+ interfaces, we should always try to give unique names to the pure
+ virtual functions.
+
+ \section1 The MainWindow Class
+
+ The \c MainWindow class is a standard QMainWindow subclass, as
+ found in many of the other examples (e.g.,
+ \l{mainwindows/application}{Application}). Here, we'll
+ concentrate on the parts of the code that are related to plugins.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 4
+
+ The \c loadPlugins() function is called from the \c MainWindow
+ constructor to detect plugins and update the \gui{Brush},
+ \gui{Shapes}, and \gui{Filters} menus. We start by handling static
+ plugins (available through QPluginLoader::staticInstances())
+
+ To the application that uses the plugin, a Qt plugin is simply a
+ QObject. That QObject implements plugin interfaces using multiple
+ inheritance.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 5
+
+ The next step is to load dynamic plugins. We initialize the \c
+ pluginsDir member variable to refer to the \c plugins
+ subdirectory of the Plug & Paint example. On Unix, this is just a
+ matter of initializing the QDir variable with
+ QApplication::applicationDirPath(), the path of the executable
+ file, and to do a \l{QDir::cd()}{cd()}. On Windows and Mac OS X,
+ this file is usually located in a subdirectory, so we need to
+ take this into account.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 6
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 7
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 8
+
+ We use QDir::entryList() to get a list of all files in that
+ directory. Then we iterate over the result using \l foreach and
+ try to load the plugin using QPluginLoader.
+
+ The QObject provided by the plugin is accessible through
+ QPluginLoader::instance(). If the dynamic library isn't a Qt
+ plugin, or if it was compiled against an incompatible version of
+ the Qt library, QPluginLoader::instance() returns a null pointer.
+
+ If QPluginLoader::instance() is non-null, we add it to the menus.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 9
+
+ At the end, we enable or disable the \gui{Brush}, \gui{Shapes},
+ and \gui{Filters} menus based on whether they contain any items.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 10
+
+ For each plugin (static or dynamic), we check which interfaces it
+ implements using \l qobject_cast(). First, we try to cast the
+ plugin instance to a \c BrushInterface; if it works, we call the
+ private function \c addToMenu() with the list of brushes returned
+ by \c brushes(). Then we do the same with the \c ShapeInterface
+ and the \c FilterInterface.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 3
+
+ The \c aboutPlugins() slot is called on startup and can be
+ invoked at any time through the \gui{About Plugins} action. It
+ pops up a \c PluginDialog, providing information about the loaded
+ plugins.
+
+ \image plugandpaint-plugindialog.png Screenshot of the Plugin dialog
+
+
+ The \c addToMenu() function is called from \c loadPlugin() to
+ create \l{QAction}s for custom brushes, shapes, or filters and
+ add them to the relevant menu. The QAction is created with the
+ plugin from which it comes from as the parent; this makes it
+ convenient to get access to the plugin later.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 0
+
+ The \c changeBrush() slot is invoked when the user chooses one of
+ the brushes from the \gui{Brush} menu. We start by finding out
+ which action invoked the slot using QObject::sender(). Then we
+ get the \c BrushInterface out of the plugin (which we
+ conveniently passed as the QAction's parent) and we call \c
+ PaintArea::setBrush() with the \c BrushInterface and the string
+ identifying the brush. Next time the user draws on the paint
+ area, \c PaintArea will use this brush.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 1
+
+ The \c insertShape() is invoked when the use chooses one of the
+ shapes from the \gui{Shapes} menu. We retrieve the QAction that
+ invoked the slot, then the \c ShapeInterface associated with that
+ QAction, and finally we call \c ShapeInterface::generateShape()
+ to obtain a QPainterPath.
+
+ \snippet examples/tools/plugandpaint/mainwindow.cpp 2
+
+ The \c applyFilter() slot is similar: We retrieve the QAction
+ that invoked the slot, then the \c FilterInterface associated to
+ that QAction, and finally we call \c
+ FilterInterface::filterImage() to apply the filter onto the
+ current image.
+
+ \section1 The PaintArea Class
+
+ The \c PaintArea class contains some code that deals with \c
+ BrushInterface, so we'll review it briefly.
+
+ \snippet examples/tools/plugandpaint/paintarea.cpp 0
+
+ In \c setBrush(), we simply store the \c BrushInterface and the
+ brush that are given to us by \c MainWindow.
+
+ \snippet examples/tools/plugandpaint/paintarea.cpp 1
+
+ In the \l{QWidget::mouseMoveEvent()}{mouse move event handler},
+ we call the \c BrushInterface::mouseMove() function on the
+ current \c BrushInterface, with the current brush. The mouse
+ press and mouse release handlers are very similar.
+
+ \section1 The PluginDialog Class
+
+ The \c PluginDialog class provides information about the loaded
+ plugins to the user. Its constructor takes a path to the plugins
+ and a list of plugin file names. It calls \c findPlugins()
+ to fill the QTreeWdiget with information about the plugins:
+
+ \snippet examples/tools/plugandpaint/plugindialog.cpp 0
+
+ The \c findPlugins() is very similar to \c
+ MainWindow::loadPlugins(). It uses QPluginLoader to access the
+ static and dynamic plugins. Its helper function \c
+ populateTreeWidget() uses \l qobject_cast() to find out which
+ interfaces are implemented by the plugins:
+
+ \snippet examples/tools/plugandpaint/plugindialog.cpp 1
+
+ \section1 Importing Static Plugins
+
+ The \l{tools/plugandpaintplugins/basictools}{Basic Tools} plugin
+ is built as a static plugin, to ensure that it is always
+ available to the application. This requires using the
+ Q_IMPORT_PLUGIN() macro somewhere in the application (in a \c
+ .cpp file) and specifying the plugin in the \c .pro file.
+
+ For Plug & Paint, we have chosen to put Q_IMPORT_PLUGIN() in \c
+ main.cpp:
+
+ \snippet examples/tools/plugandpaint/main.cpp 0
+
+ The argument to Q_IMPORT_PLUGIN() is the plugin's name, as
+ specified with Q_EXPORT_PLUGIN2() in the \l{Exporting the
+ Plugin}{plugin}.
+
+ In the \c .pro file, we need to specify the static library.
+ Here's the project file for building Plug & Paint:
+
+ \snippet examples/tools/plugandpaint/plugandpaint.pro 0
+
+ The \c LIBS line variable specifies the library \c pnp_basictools
+ located in the \c ../plugandpaintplugins/basictools directory.
+ (Although the \c LIBS syntax has a distinct Unix flavor, \c qmake
+ supports it on all platforms.)
+
+ The \c CONFIG() code at the end is necessary for this example
+ because the example is part of the Qt distribution and Qt can be
+ configured to be built simultaneously in debug and in release
+ modes. You don't need to for your own plugin applications.
+
+ This completes our review of the Plug & Paint application. At
+ this point, you might want to take a look at the
+ \l{tools/plugandpaintplugins/basictools}{Basic Tools} example
+ plugin.
+*/
+
+/*!
+ \example tools/plugandpaintplugins/basictools
+ \title Plug & Paint Basic Tools Example
+
+ The Basic Tools example is a static plugin for the
+ \l{tools/plugandpaint}{Plug & Paint} example. It provides a set
+ of basic brushes, shapes, and filters. Through the Basic Tools
+ example, we will review the four steps involved in writing a Qt
+ plugin:
+
+ \list 1
+ \o Declare a plugin class.
+ \o Implement the interfaces provided by the plugin.
+ \o Export the plugin using the Q_EXPORT_PLUGIN2() macro.
+ \o Build the plugin using an adequate \c .pro file.
+ \endlist
+
+ \section1 Declaration of the Plugin Class
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.h 0
+
+ We start by including \c interfaces.h, which defines the plugin
+ interfaces for the \l{tools/plugandpaint}{Plug & Paint}
+ application. For the \c #include to work, we need to add an \c
+ INCLUDEPATH entry to the \c .pro file with the path to Qt's \c
+ examples/tools directory.
+
+ The \c BasicToolsPlugin class is a QObject subclass that
+ implements the \c BrushInterface, the \c ShapeInterface, and the
+ \c FilterInterface. This is done through multiple inheritance.
+ The \c Q_INTERFACES() macro is necessary to tell \l{moc}, Qt's
+ meta-object compiler, that the base classes are plugin
+ interfaces. Without the \c Q_INTERFACES() macro, we couldn't use
+ \l qobject_cast() in the \l{tools/plugandpaint}{Plug & Paint}
+ application to detect interfaces.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.h 2
+
+ In the \c public section of the class, we declare all the
+ functions from the three interfaces.
+
+ \section1 Implementation of the Brush Interface
+
+ Let's now review the implementation of the \c BasicToolsPlugin
+ member functions inherited from \c BrushInterface.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 0
+
+ The \c brushes() function returns a list of brushes provided by
+ this plugin. We provide three brushes: \gui{Pencil}, \gui{Air
+ Brush}, and \gui{Random Letters}.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 1
+
+ On a mouse press event, we just call \c mouseMove() to draw the
+ spot where the event occurred.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 2
+
+ In \c mouseMove(), we start by saving the state of the QPainter
+ and we compute a few variables that we'll need later.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 3
+
+ Then comes the brush-dependent part of the code:
+
+ \list
+ \o If the brush is \gui{Pencil}, we just call
+ QPainter::drawLine() with the current QPen.
+
+ \o If the brush is \gui{Air Brush}, we start by setting the
+ painter's QBrush to Qt::Dense6Pattern to obtain a dotted
+ pattern. Then we draw a circle filled with that QBrush several
+ times, resulting in a thick line.
+
+ \o If the brush is \gui{Random Letters}, we draw a random letter
+ at the new cursor position. Most of the code is for setting
+ the font to be bold and larger than the default font and for
+ computing an appropriate bounding rect.
+ \endlist
+
+ At the end, we restore the painter state to what it was upon
+ entering the function and we return the bounding rectangle.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 4
+
+ When the user releases the mouse, we do nothing and return an
+ empty QRect.
+
+ \section1 Implementation of the Shape Interface
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 5
+
+ The plugin provides three shapes: \gui{Circle}, \gui{Star}, and
+ \gui{Text...}. The three dots after \gui{Text} are there because
+ the shape pops up a dialog asking for more information. We know
+ that the shape names will end up in a menu, so we include the
+ three dots in the shape name.
+
+ A cleaner but more complicated design would have been to
+ distinguish between the internal shape name and the name used in
+ the user interface.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 6
+
+ The \c generateShape() creates a QPainterPath for the specified
+ shape. If the shape is \gui{Text}, we pop up a QInputDialog to
+ let the user enter some text.
+
+ \section1 Implementation of the Filter Interface
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 7
+
+ The plugin provides three filters: \gui{Invert Pixels}, \gui{Swap
+ RGB}, and \gui{Grayscale}.
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 8
+
+ The \c filterImage() function takes a filter name and a QImage as
+ parameters and returns an altered QImage. The first thing we do
+ is to convert the image to a 32-bit RGB format, to ensure that
+ the algorithms will work as expected. For example,
+ QImage::invertPixels(), which is used to implement the
+ \gui{Invert Pixels} filter, gives counterintuitive results for
+ 8-bit images, because they invert the indices into the color
+ table instead of inverting the color table's entries.
+
+ \section1 Exporting the Plugin
+
+ Whereas applications have a \c main() function as their entry
+ point, plugins need to contain exactly one occurrence of the
+ Q_EXPORT_PLUGIN2() macro to specify which class provides the
+ plugin:
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictoolsplugin.cpp 9
+
+ This line may appear in any \c .cpp file that is part of the
+ plugin's source code.
+
+ \section1 The .pro File
+
+ Here's the project file for building the Basic Tools plugin:
+
+ \snippet examples/tools/plugandpaintplugins/basictools/basictools.pro 0
+
+ The \c .pro file differs from typical \c .pro files in many
+ respects. First, it starts with a \c TEMPLATE entry specifying \c
+ lib. (The default template is \c app.) It also adds \c plugin to
+ the \c CONFIG variable. This is necessary on some platforms to
+ avoid generating symbolic links with version numbers in the file
+ name, which is appropriate for most dynamic libraries but not for
+ plugins.
+
+ To make the plugin a static plugin, all that is required is to
+ specify \c static in addition to \c plugin. The
+ \l{tools/plugandpaintplugins/extrafilters}{Extra Filters} plugin,
+ which is compiled as a dynamic plugin, doesn't specify \c static
+ in its \c .pro file.
+
+ The \c INCLUDEPATH variable sets the search paths for global
+ headers (i.e., header files included using \c{#include <...>}).
+ We add Qt's \c examples/tools directory (strictly speaking,
+ \c{examples/tools/plugandpaintplugins/basictools/../..}) to the
+ list, so that we can include \c <plugandpaint/interfaces.h>.
+
+ The \c TARGET variable specifies which name we want to give the
+ target library. We use \c pnp_ as the prefix to show that the
+ plugin is designed to work with Plug & Paint. On Unix, \c lib is
+ also prepended to that name. On all platforms, a
+ platform-specific suffix is appended (e.g., \c .dll on Windows,
+ \c .a on Linux).
+
+ The \c CONFIG() code at the end is necessary for this example
+ because the example is part of the Qt distribution and Qt can be
+ configured to be built simultaneously in debug and in release
+ modes. You don't need to for your own plugins.
+*/
+
+/*!
+ \example tools/plugandpaintplugins/extrafilters
+ \title Plug & Paint Extra Filters Example
+
+ The Extra Filters example is a plugin for the
+ \l{tools/plugandpaint}{Plug & Paint} example. It provides a set
+ of filters in addition to those provided by the
+ \l{tools/plugandpaintplugins/basictools}{Basic Tools} plugin.
+
+ Since the approach is identical to
+ \l{tools/plugandpaintplugins/basictools}{Basic Tools}, we won't
+ review the code here. The only part of interes is the
+ \c .pro file, since Extra Filters is a dynamic plugin
+ (\l{tools/plugandpaintplugins/basictools}{Basic Tools} is
+ linked statically into the Plug & Paint executable).
+
+ Here's the project file for building the Extra Filters plugin:
+
+ \snippet examples/tools/plugandpaintplugins/extrafilters/extrafilters.pro 0
+
+ The \c .pro file differs from typical \c .pro files in many
+ respects. First, it starts with a \c TEMPLATE entry specifying \c
+ lib. (The default template is \c app.) It also adds \c plugin to
+ the \c CONFIG variable. This is necessary on some platforms to
+ avoid generating symbolic links with version numbers in the file
+ name, which is appropriate for most dynamic libraries but not for
+ plugins.
+
+ The \c INCLUDEPATH variable sets the search paths for global
+ headers (i.e., header files included using \c{#include <...>}).
+ We add Qt's \c examples/tools directory (strictly speaking,
+ \c{examples/tools/plugandpaintplugins/basictools/../..}) to the
+ list, so that we can include \c <plugandpaint/interfaces.h>.
+
+ The \c TARGET variable specifies which name we want to give the
+ target library. We use \c pnp_ as the prefix to show that the
+ plugin is designed to work with Plug & Paint. On Unix, \c lib is
+ also prepended to that name. On all platforms, a
+ platform-specific suffix is appended (e.g., \c .dll on Windows,
+ \c .so on Linux).
+
+ The \c DESTDIR variable specifies where we want to install the
+ plugin. We put it in Plug & Paint's \c plugins subdirectory,
+ since that's where the application looks for dynamic plugins.
+
+ The \c CONFIG() code at the end is necessary for this example
+ because the example is part of the Qt distribution and Qt can be
+ configured to be built simultaneously in debug and in release
+ modes. You don't need to for your own plugins.
+*/
diff --git a/doc/src/examples/portedasteroids.qdoc b/doc/src/examples/portedasteroids.qdoc
new file mode 100644
index 0000000..d32732f
--- /dev/null
+++ b/doc/src/examples/portedasteroids.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/portedasteroids
+ \title Ported Asteroids Example
+
+ This GraphicsView example is a port of the
+ Asteroids game, which was based on QCanvas.
+
+ \image portedasteroids-example.png
+*/
diff --git a/doc/src/examples/portedcanvas.qdoc b/doc/src/examples/portedcanvas.qdoc
new file mode 100644
index 0000000..76943df
--- /dev/null
+++ b/doc/src/examples/portedcanvas.qdoc
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example graphicsview/portedcanvas
+ \title Ported Canvas Example
+
+ This GraphicsView example is a port of the old
+ QCanvas example from Qt 3.
+
+ \sa {Porting to Graphics View}
+
+ \image portedcanvas-example.png
+*/
diff --git a/doc/src/examples/previewer.qdoc b/doc/src/examples/previewer.qdoc
new file mode 100644
index 0000000..9cbeec1
--- /dev/null
+++ b/doc/src/examples/previewer.qdoc
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example webkit/previewer
+ \title Previewer Example
+
+ The Previewer example shows how to use QtWebKit's QWebView to preview
+ HTML data written in a QPlainTextEdit.
+
+ \image previewer-example.png
+
+ \section1 The User Interface
+
+ Before we begin, we create a user interface using \QD. Two QGroupBox
+ objects - the editor group box and the previewer group box are separated
+ by a QSplitter. In the editor group box, we have a QPlainTextEdit object,
+ \c plainTextEdit, and two QPushButton objects. In the previewer group box,
+ we have a QWebView object, \c webView.
+
+ \image previewer-ui.png
+
+ \section1 Previewer Class Definition
+
+ The \c Previewer class is a subclass of both QWidget and Ui::Form.
+ We subclass Ui::Form in order to embed the \QD user interface form
+ created earlier. This method of embedding forms is known as the
+ \l{The Multiple Inheritance Approach}{multiple inheritance approach}.
+
+ In our \c previewer.h file, we have a constructor and a slot,
+ \c on_previewButton_clicked().
+
+ \snippet examples/webkit/previewer/previewer.h 0
+
+ \section1 Previewer Class Implementation
+
+ The \c{Previewer}'s constructor is only responsible for setting up the
+ user interface.
+
+ \snippet examples/webkit/previewer/previewer.cpp 0
+
+ The \c on_previewButton_clicked() is a slot corresponding to the
+ \c{previewButton}'s \l{QPushButton::}{clicked()} signal. When the
+ \c previewButton is clicked, we extract the contents of \c plainTextEdit,
+ and then invoke the \l{QWebView::}{setHtml()} function to display our
+ contents as HTML.
+
+ \snippet examples/webkit/previewer/previewer.cpp 1
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class for the Previewer example is a subclass of
+ QMainWindow with a constructor and five private slots: \c open(),
+ \c openUrl(), \c save(), \c about() and \c updateTextEdit().
+
+ \snippet examples/webkit/previewer/mainwindow.h 0
+
+ The private objects in \c MainWindow are \c centralWidget, which is
+ a \c Previewer object, \c fileMenu, \c helpMenu and the QAction objects
+ \c openAct, \c openUrlAct, \c saveAct, \c exitAct, \c aboutAct and
+ \c aboutQtAct.
+
+ \snippet examples/webkit/previewer/mainwindow.h 1
+
+ There are three private functions: \c createActions(), \c createMenus()
+ and \c setStartupText(). The \c createActions() and \c createMenus()
+ functions are necessary to set up the main window's actions and
+ assign them to the \gui File and \gui Help menus. The \c setStartupText()
+ function, on the other hand, displays a description about the example
+ in its HTML Previewer window.
+
+ \section1 MainWindow Class Implementation
+
+ The \c{MainWindow}'s constructor invokes \c createActions() and
+ \c createMenus() to set up the \gui File menu and \gui Help menu. Then,
+ the \c Previewer object, \c centralWidget, is set to the main window's
+ central widget. Also, we connect \c webView's
+ \l{QWebView::}{loadFinished()} signal to our \c updateTextEdit() slot.
+ Finally, we call the \c setStartupText() function to display the
+ description of the example.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 0
+
+ Within the \c createActions() function, we instantiate all our private
+ QAction objects which we declared in \c{mainwindow.h}. We set the
+ short cut and status tip for these actions and connect their
+ \l{QAction::}{triggered()} signal to appropriate slots.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 1
+ \dots
+
+ The \c createMenus() function instantiates the QMenu items, \c fileMenu
+ and \c helpMenu and adds them to the main window's
+ \l{QMainWindow::menuBar()}{menu bar}.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 2
+
+ The example also provides an \c about() slot to describe its purpose.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 3
+
+ The \c MainWindow class provides two types of \gui Open functions:
+ \c open() and \c openUrl(). The \c open() function opens an HTML file
+ with \c fileName, and reads it with QTextStream. The function then
+ displays the output on \c plainTextEdit. The file's name is obtained
+ using QFileDialog's \l{QFileDialog::}{getOpenFileName()} function.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 4
+
+ The \c openUrl() function, on the other hand, displays a QInputDialog
+ to obtain a URL, and displays it on \c webView.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 5
+
+ In order to save a HTML file, the \c save() function first extracts the
+ contents of \c plainTextEdit and displays a QFileDialog to obtain
+ \c fileName. Then, we use a QTextStream object, \c in, to write to
+ \c file.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 6
+
+ Earlier, in \c{MainWindow}'s constructor, we connected \c{webView}'s
+ \l{QWebView::}{loadFinished()} signal to our private \c updateTextEdit()
+ slot. This slot updates the contents of \c plainTextEdit with the HTML
+ source of the web page's main frame, obtained using \l{QWebFrame}'s
+ \l{QWebFrame::}{toHtml()} function.
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 7
+
+ To provide a description about the Previewer example, when it starts up,
+ we use the \c setStartupText() function, as shown below:
+
+ \snippet examples/webkit/previewer/mainwindow.cpp 8
+
+
+ \section1 The \c{main()} Function
+
+ The \c main() function instantiates a \c MainWindow object, \c mainWindow,
+ and displays it with the \l{QWidget::}{show()} function.
+
+ \snippet examples/webkit/previewer/main.cpp 0
+
+*/ \ No newline at end of file
diff --git a/doc/src/examples/qobjectxmlmodel.qdoc b/doc/src/examples/qobjectxmlmodel.qdoc
new file mode 100644
index 0000000..ce1dab6
--- /dev/null
+++ b/doc/src/examples/qobjectxmlmodel.qdoc
@@ -0,0 +1,353 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xmlpatterns/qobjectxmlmodel
+ \title QObject XML Model Example
+
+ This example shows how to use QtXmlPatterns to query QObject trees
+ by modeling the non-XML data structure of a QObject tree to look
+ like XML.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ This example illustrates two important points about using XQuery to
+ query non-XML data modeled to look like XML. The first point is that
+ a custom node model class doesn't always have to actually build the
+ node model. Sometimes the node model can be an already existing data
+ structure, like the QObject tree used in this example. The second
+ point is to explain what is required to make non-XML data look like
+ XML.
+
+ In this example, we want to model a QObject tree to look like
+ XML. That is easy to do because a QObject tree maps to the XML tree
+ structure in a staightforward way. Each QObject node is modeled as
+ an XML element node. However, when we want to add the QMetaObject tree
+ to the QObject tree node model, we are trying to add a second tree to
+ the node model. The QMetaObject tree exists \e{behind} the QObject
+ tree. Adding the QMetaObject tree to the node model changes the two
+ dimensional tree into a three dimensional tree.
+
+ The query engine can only traverse two dimensional trees, because an
+ XML document is always a two dimensional tree. If we want to add the
+ QMetaObject tree to the node model, we have to somehow flatten it
+ into the the same plane as the QObject tree. This requires that the
+ node model class must build an auxiliary data structure and make it
+ part of the two dimensional QObject node model. How to do this is
+ explained in \l{Including The QMetaObject Tree}.
+
+ \section2 The User Interface
+
+ The UI for this example was created using Qt Designer:
+
+ \image qobjectxmlmodel-example.png
+
+ \section1 Code Walk-Through
+
+ The strategy for this example is different from the strategy for the
+ \l{File System Example}{file system example}. In the file system
+ example, the node model class had to actually build a node model
+ because the non-XML data to be traversed was the computer's file
+ system, a structure stored on disk in a form that the query engine
+ couldn't use. The node model class had to build an analog of the
+ computer's file system in memory.
+
+ For this example, the data structure to be traversed already exists
+ in memory in a usable form. It is the QObject tree of the example
+ application itself. All we need is the pointer to the root of the
+ QObject tree.
+
+ \note When we add the QMetaObject tree to the node model, the node
+ model class will have to build an auxiliary data structure to move
+ the QMetaObject tree into the same plane as the QObject tree. This
+ is explained later in \l{Including The QMetaObject Tree}.
+
+ \section2 The Custom Node Model Class: QObjextXmlModel
+
+ The node model class for this example is QObjextXmlModel, which is
+ derived from QSimpleXmlNodeModel. QObjextXmlModel implements the
+ callback interface functions that don't have implementations in
+ QSimpleXmlNodeModel:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h 0
+
+ The node model class declares three data members:
+
+ \target Three Data Members
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h 2
+
+ The constructor sets \c m_baseURI to the QUrl constructed from the
+ \l{QCoreApplication::applicationFilePath()}{file path} of the
+ application executable. This is the value returned by
+ \l{QAbstractXmlNodeModel::documentUri()}{documentUri()}. The
+ constructor sets \c{m_root} to point to the QObject tree for the
+ example application. This is the node model that the query engine
+ will use. And the constructor calls a local function to build the
+ auxiliary data structure (\c{m_allMetaObjects}) for including the
+ QMetaObject tree in the node model. How this auxiliary data
+ structure is incorporated into the QObject node model is discussed
+ in \l{Including The QMetaObject Tree}.
+
+ \section3 Accessing The Node Model
+
+ Since the query engine knows nothing about QObject trees, it can
+ only access them by calling functions in the node model callback
+ interface. The query engine passes a QXmlNodeModelIndex to uniquely
+ identify a node in the node model. The QXmlNodeModelIndex is
+ constructed from a pointer to the QObject that represents the node.
+ \l{QAbstractXmlNodeModel::createIndex()}{createIndex()} creates the
+ QXmlNodeModelIndex, as in the local \c{root()} function, for example:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 0
+
+ A QObject represents an element node in the node model, but we also
+ need to represent attribute nodes. For example, the class name of a
+ QObject is an attribute of the QObject, so it should be an attribute
+ node in the node model. A QObject's class name is obtained from the
+ QObject. (Actually, it is in the QMetaObject, which is obtained from
+ the QObject). This means that a single QObject logically represents
+ multiple nodes in the node model: the element node and potentially
+ many attribute nodes.
+
+ To uniquely identify an attribute node, we need the pointer to the
+ QObject containing the attribute, and an additional value that
+ identifies the attribute in the QObject. For this \e{additional
+ data} value, we use \c{enum QObjectNodeType}:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h 3
+
+ Ignore the \c{MetaObjectXXX} values for now. They will be explained
+ in \l{Including The QMetaObject Tree}. Here we are interested in the
+ three node types for QObject nodes: \c{IsQObject}, which represents
+ the element node type for a QObject, and \c{QObjectProperty} and
+ \c{QObjectClassName}, which represent the attribute node types for
+ the attributes of a QObject.
+
+ The \l{QAbstractXmlNodeModel::createIndex()}{createIndex()}
+ function called in the \c{root()} snippet above is the overload that
+ accepts a \c{void*} pointer and a second parameter,
+ \c{additionalData}, with default value 0 (\c{IsQObject}). Wherever
+ you see a call to \l{QAbstractXmlNodeModel::createIndex()}
+ {createIndex()} that only passes the QObject pointer, it is creating
+ the node index for a QObject element node. To create the node index
+ for the class name attribute, for example, the \l{QObject
+ attributes} {attributes()} function uses
+ \c{createIndex(object,QObjectClassName)}.
+
+ \target QObject attributes
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 6
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 8
+
+ \l{QObject attributes} {attributes()} is one of the callback
+ functions you have to implement in your custom node model class. It
+ returns a QVector of \l{QXmlNodeModelIndex} {node indexes} for all
+ the attribute nodes for QObject \c{n}. It calls
+ \l{QAbstractXmlNodeModel::createIndex()} {createIndex()} in two places.
+ Both calls use the QObject pointer from the current node \c{n} (the
+ element node), and just add a different value for the \e{additional data}
+ parameter. This makes sense because, in XML, the attributes of an
+ element are part of that element.
+
+ \section3 Traversing The Node Model
+
+ The query engine traverses the QObject tree by calling back to the
+ node model class's implementation of \l{QObject nextFromSimpleAxis}
+ {nextFromSimpleAxis()}. This function is the heart of the callback
+ interface, and it will probably be the most complex to implement in
+ your custom node model class. Below is a partial listing of the
+ implementation for this example. The full listing will be shown in
+ \l{Including The QMetaObject Tree}, where we discuss traversing the
+ QMetaObject tree.
+
+ \target QObject nextFromSimpleAxis
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 2
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 4
+
+ The main switch uses \c toNodeType(), which obtains the node
+ type from \l{QXmlNodeModelIndex::additionalData()}:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 1
+
+ \c{case IsObject} case is the most interesting. It switches again on
+ the value of the \c{axis} parameter, which specifies the direction
+ the query engine wants to take from the current node. It is one of
+ the four enum values of \l{QAbstractXmlNodeModel::SimpleAxis}. The
+ \l{QAbstractXmlNodeModel::Parent} {Parent} and
+ \l{QAbstractXmlNodeModel::FirstChild} {FirstChild} cases reduce to
+ calls to QObject::parent() and QObject::children()
+ respectively. Note that a default constructed QXmlNodeModelIndex is
+ returned in the \l{QAbstractXmlNodeModel::Parent} {Parent} case if
+ the current node is the root, and in the
+ \l{QAbstractXmlNodeModel::FirstChild} {FirstChild} case if the
+ current node has no children.
+
+ For the \l{QAbstractXmlNodeModel::NextSibling} {NextSibling} and
+ \l{QAbstractXmlNodeModel::PreviousSibling} {PreviousSibling} axes,
+ the helper function \c{qObjectSibling()} is called, with +1 to
+ traverse to the \l{QAbstractXmlNodeModel::NextSibling} {NextSibling}
+ and -1 to traverse to the
+ \l{QAbstractXmlNodeModel::PreviousSibling} {PreviousSibling}.
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 5
+
+ \c{qObjectSibling()} determines whether or not the node has any
+ siblings. It is called with \c{n}, the index of the current node.
+ If the current node is a child, then it has a parent with children
+ (the current node one of these).
+ So, we get the \l{QObject::parent()}{parent}, obtain the parent's
+ \l{QObject::children()} {child list}, find the current node in the
+ list, and construct the node index for the next or previous child
+ (sibling) and return it.
+
+ \note In \l{QObject nextFromSimpleAxis} {nextFromSimpleAxis()}, the
+ special case of asking for the
+ \l{QAbstractXmlNodeModel::PreviousSibling} {PreviousSibling} of the
+ root node is discussed in \l{Including The QMetaObject Tree}.
+
+ Traversing away from a \c{QObjectClassName} attribute node or a
+ \c{QObjectProperty} attribute node might seem a bit confusing at
+ first glance. The only move allowed from an attribute node is to the
+ \l{QAbstractXmlNodeModel::Parent} {Parent}, because attribute nodes
+ don't have children. But these two cases simply return the
+ \l{QXmlNodeModelIndex} {node index} of the current node.
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 7
+
+ Since \c n is the QXmlNodeModelIndex of the current node, all this
+ does is create another QXmlNodeModelIndex for the current node and
+ return it. This was explained above in \l{Accessing The Node Model},
+ where we saw that each QObject in the node model actually represents
+ an element node and potentially many attribute nodes. Traversing to
+ the parent node of an attribute simply creates a node index for the
+ same QObject, but with an \e{additional data} value of 0
+ (\c{IsQObject}).
+
+ If we only wanted to traverse the QObject tree with XQuery, we could
+ just implement the rest of the virtual callback functions listed
+ earlier and we would be done. The implementations for the remaining
+ functions are straightforward. But if we also want to use XQuery to
+ traverse the QMetaObject tree, we must include the QMetaObject tree
+ in the custom node model.
+
+ \section3 Including The QMetaObject Tree
+
+ The \l{Meta-Object System} {metaobject system} not only enables Qt's
+ \l{Signals and Slots} {signals and slots}, it also provides type
+ information that is useful at run-time; e.g., getting and setting
+ properties without knowing the property names at compile time. Each
+ QObject has an associated QMetaObject tree which contains all this
+ useful type information. Given a QObject, its QMetaObject is
+ obtained with QObject::metaObject(). Then QMetaObject::superClass()
+ can be called repeatedly to get the QMetaObject for each class in the
+ class hierarchy for the original QObject.
+
+ However, the QMetaObject hierarchy is a second tree in a plan that
+ exists logically behind the plane of the QObject tree. The QtXmlPatterns
+ query engine can only traverse a two dimensional node model that
+ represents an XML tree. If we want to include the QMetaObject in the
+ same node model that represents the QObject tree, we must find a way
+ to flatten the QMetaObject tree into the same plane as the QObject
+ tree.
+
+ The node model class declares \l{All MetaObjects}{m_allMetaObjects}
+ as a vector of pointers to QMetaObject:
+
+ \target All MetaObjects
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h 1
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.h 4
+
+ This vector gets populated by the QObjectXmlModel constructor by
+ calling the private allMetaObjects() function:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 9
+
+ The first half of the function is an example of the standard code
+ pattern for using QtXmlPatterns to run an XQuery. First it creates an
+ instance of QXmlQuery. Then it \l{QXmlQuery::bindVariable()}{binds}
+ the XQuery variable \c{$root} to the root node of the of the node
+ model; i.e., the root of the QObject tree. Then it
+ \l{QXmlQuery::setQuery()} {sets the query} to be an XQuery that
+ returns all the QObjects in the node model. Finally, the query is
+ evaluated into a \l{QXmlResultItems} {result item list}.
+
+ \note \l{QXmlQuery::bindVariable()} must be called before
+ \l{QXmlQuery::setQuery()}, because setting the query causes
+ QtXmlPatterns to \e compile the XQuery, which requires knowledge of
+ the variable bindings.
+
+ The second half of the function traverses the \l{QXmlResultItems}
+ {result item list}, getting the QMetaObject hierarchy for each
+ QObject and appending it to \l{All MetaObjects} {m_allMetaObjects},
+ if it isn't already there. But how do we include this vector of
+ pointers to QMetaObjects in the node model? The key insight is
+ shown in the full listing of \l{Full Listing of nextFromSimpleAxis}
+ {nextFromSimpleAxis()}, where we are interested now in the
+ \c{MetaObjectXXX} cases:
+
+ \target Full Listing of nextFromSimpleAxis
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 2
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 3
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 4
+
+ But first, revisit the \c{PreviousSibling} case for the
+ \c{IsQObject} case:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 10
+
+ When asking for the previous sibling of the root of the QObject
+ tree, it creates a node model index with a null QObject pointer and
+ an \c{additionalData} value of \c{MetaObjects}. This effectively
+ allows the query engine to jump from the QObject tree to the
+ QMetaObject tree.
+
+ The query engine can jump from the QMetaObject tree back to the
+ QObject tree in the \c{NextSibling} case of case \c{MetaObjects},
+ where the \c{root()} function is called:
+
+ \snippet examples/xmlpatterns/qobjectxmlmodel/qobjectxmlmodel.cpp 11
+
+ Having jumped from the QObject tree to the QMetaObject tree, the
+ query engine will use the \c{MetaObject}, \c{MetaObjectClassName},
+ and \c{MetaObjectSuperClass} cases, which are similar to the cases
+ for \c{IsQObject}, \c{QObjectProperty}, and \c{QObjectClassName}.
+*/
diff --git a/doc/src/examples/qtconcurrent-imagescaling.qdoc b/doc/src/examples/qtconcurrent-imagescaling.qdoc
new file mode 100644
index 0000000..74b4be0
--- /dev/null
+++ b/doc/src/examples/qtconcurrent-imagescaling.qdoc
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qtconcurrent/imagescaling
+ \title QtConcurrent Image Scaling Example
+
+ The QtConcurrent Map example shows how to use the asynchronous
+ QtConcurrent API to load and scale a collection of images.
+*/
diff --git a/doc/src/examples/qtconcurrent-map.qdoc b/doc/src/examples/qtconcurrent-map.qdoc
new file mode 100644
index 0000000..9f5295d
--- /dev/null
+++ b/doc/src/examples/qtconcurrent-map.qdoc
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qtconcurrent/map
+ \title QtConcurrent Map Example
+
+ The QtConcurrent Map example shows how to use the synchronous (blocking)
+ QtConcurrent API to scale a collection of images.
+*/
diff --git a/doc/src/examples/qtconcurrent-progressdialog.qdoc b/doc/src/examples/qtconcurrent-progressdialog.qdoc
new file mode 100644
index 0000000..41909fb
--- /dev/null
+++ b/doc/src/examples/qtconcurrent-progressdialog.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qtconcurrent/progressdialog
+ \title QtConcurrent Progress Dialog Example
+
+ The QtConcurrent Progress Dialog example shows how to use the
+ QFutureWatcher class to monitor the progress of a long-running operation.
+
+ \image qtconcurrent-progressdialog.png
+*/
diff --git a/doc/src/examples/qtconcurrent-runfunction.qdoc b/doc/src/examples/qtconcurrent-runfunction.qdoc
new file mode 100644
index 0000000..5c40552
--- /dev/null
+++ b/doc/src/examples/qtconcurrent-runfunction.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qtconcurrent/runfunction
+ \title QtConcurrent Run Function Example
+
+ The QtConcurrent Run Function example shows how to apply concurrency to
+ a standard function, using QFuture instances to retrieve return values
+ at a later time.
+*/
diff --git a/doc/src/examples/qtconcurrent-wordcount.qdoc b/doc/src/examples/qtconcurrent-wordcount.qdoc
new file mode 100644
index 0000000..d7d3227
--- /dev/null
+++ b/doc/src/examples/qtconcurrent-wordcount.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qtconcurrent/wordcount
+ \title QtConcurrent Word Count Example
+
+ The QtConcurrent Word Count example demonstrates the use of the map-reduce
+ algorithm when applied to the problem of counting words in a collection
+ of files.
+*/
diff --git a/doc/src/examples/qtscriptcalculator.qdoc b/doc/src/examples/qtscriptcalculator.qdoc
new file mode 100644
index 0000000..1d713f8
--- /dev/null
+++ b/doc/src/examples/qtscriptcalculator.qdoc
@@ -0,0 +1,105 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example script/calculator
+ \title QtScript Calculator Example
+ \ingroup scripting
+
+ In this simple QtScript example, we show how to implement the
+ functionality of a calculator widget.
+
+ \image qtscript-calculator-example.png
+
+ The program logic in this example is a fairly straight port of the logic in the C++ \l{Calculator Example}.
+ The graphical user interface is defined in a UI file.
+
+ The C++ part of the example consists of four steps:
+ \list
+ \o Evaluate the script code that defines the \c{Calculator} class.
+
+ \snippet examples/script/calculator/main.cpp 0a
+ \snippet examples/script/calculator/main.cpp 0b
+
+ \o Create a widget from the UI file using QUiLoader.
+
+ \snippet examples/script/calculator/main.cpp 1
+
+ \o Call the Calculator constructor function to create a new \c{Calculator} script object, passing the widget as argument.
+
+ \snippet examples/script/calculator/main.cpp 2
+
+ \o Show the widget and start the application event loop.
+
+ \snippet examples/script/calculator/main.cpp 3
+
+ \endlist
+
+ On the script side, the \c{Calculator} constructor function
+ initializes the instance variables of the new \c{Calculator}
+ object, and connects the clicked() signal of the form's buttons
+ to corresponding functions defined in the \c{Calculator} prototype
+ object; the effect is that when a button is clicked, the proper
+ script function will be invoked to carry out the operation.
+
+ \snippet examples/script/calculator/calculator.js 0
+
+ A \c{Calculator} object is just a plain script object; it is not
+ a widget. Instead, it stores a reference to the calculator form
+ (the widget) in an instance variable, \c{ui}. The calculator
+ script functions can access components of the form by referring
+ to the proper children of the \c{ui} member.
+
+ \snippet examples/script/calculator/calculator.js 1
+
+ The digitClicked() function uses the special local variable
+ __qt_sender__ to access the object that triggered the signal;
+ this gives us a simple way to retrieve the value of the digit
+ that was clicked.
+
+ \snippet examples/script/calculator/calculator.js 2
+
+ The changeSign() function shows how we retrieve the text property
+ of the calculator's display, change it appropriately, and write
+ back the new value.
+
+
+*/
diff --git a/doc/src/examples/qtscriptcustomclass.qdoc b/doc/src/examples/qtscriptcustomclass.qdoc
new file mode 100644
index 0000000..f8d85a2
--- /dev/null
+++ b/doc/src/examples/qtscriptcustomclass.qdoc
@@ -0,0 +1,198 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example script/customclass
+ \title Custom Script Class Example
+
+ The Custom Script Class example shows how to use QScriptClass and QScriptClassPropertyIterator
+ to implement a custom script class.
+
+ The script class we are going to implement is called \c{ByteArray}. It provides a wrapper around
+ the QByteArray class in Qt, with a simplified API. Why do we need such a class? Well, neither the
+ ECMAScript \c{Array} class or \c{String} class is appropriate to use when working with arrays of
+ bytes. Our \c{ByteArray} class will have the right semantics; objects will use only the amount of
+ memory that is really needed (a byte is stored as a byte, not as a floating-point number or a
+ Unicode character) and can be passed directly to C++ slots taking QByteArray arguments (no costly
+ conversion necessary).
+
+ \section1 ByteArray Class In Use
+
+ When the \c{ByteArray} class has been made available to the
+ scripting environment, \c{ByteArray} objects can be constructed like
+ so:
+
+ \snippet doc/src/snippets/code/doc_src_examples_qtscriptcustomclass.qdoc 0
+
+ \c{ByteArray} objects behave similar to normal \c{Array} objects. Every \c{ByteArray} object has
+ a \c{length} property, that holds the length of the array. If a new value is assigned to the \c{length}
+ property, the array is resized. If the array is enlarged, the new bytes are initialized to 0.
+ (This is a difference from normal \c{Array} objects; \c{ByteArray} objects are always dense arrays.)
+ Use normal array operations to read or write bytes in the array. The following code sets all the
+ bytes of an array to a certain value:
+
+ \snippet doc/src/snippets/code/doc_src_examples_qtscriptcustomclass.qdoc 1
+
+ When assigning a value to an array element, the value is truncated to eight bits:
+
+ \snippet doc/src/snippets/code/doc_src_examples_qtscriptcustomclass.qdoc 2
+
+ Like normal \c{Array} objects, if the array index is greater than the current length
+ of the array, the array is resized accordingly:
+
+ \snippet doc/src/snippets/code/doc_src_examples_qtscriptcustomclass.qdoc 3
+
+ Property names that aren't valid array indexes are treated
+ like normal object properties (again, the same is the case for normal \c{Array} objects);
+ in other words, it's perfectly fine to do something like this:
+
+ \snippet doc/src/snippets/code/doc_src_examples_qtscriptcustomclass.qdoc 4
+
+ The above assignment won't affect the contents of the array, but will rather assign a value
+ to the object property named "foo".
+
+ \c{ByteArray} objects have a set of methods: chop(), equals(), left(), mid(), toBase64() and so on.
+ These map directly onto the corresponding methods in QByteArray.
+
+ \snippet doc/src/snippets/code/doc_src_examples_qtscriptcustomclass.qdoc 5
+
+ \section1 ByteArray Class Implementation
+
+ To implement the \c{ByteArray} script class in C++, we create a subclass of QScriptClass,
+ called ByteArrayClass, and reimplement the virtual functions from QScriptClass. We also provide
+ a Qt Script constructor function suitable for being added to a QScriptEngine's environment.
+
+ The ByteArrayClass constructor prepares the script class:
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 0
+
+ First, the constructor registers a pair of conversion functions, so that C++ QByteArray objects
+ and Qt Script \c{ByteArray} objects can move seamlessly between the C++ side and the script side.
+ For example, if a \c{ByteArray} object is passed to a C++ slot that takes a QByteArray
+ argument, the actual QByteArray that the \c{ByteArray} object wraps will be passed correctly.
+
+ Second, we store a handle to the string "length", so that we can quickly compare a given property name
+ to "length" later on.
+
+ Third, we initialize the standard \c{ByteArray} prototype, to be returned by our prototype()
+ reimplementation later on. (The implementation of the prototype is discussed later.)
+
+ Fourth, we initialize a constructor function for \c{ByteArray}, to be returned by the
+ constructor() function. We set the internal data of the constructor to be a pointer to
+ this ByteArrayClass object, so that the constructor, when it is invoked, can extract the
+ pointer and use it to create a new \c{ByteArray} object.
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 1
+
+ The newInstance() function isn't part of the QScriptClass API; its purpose is to offer
+ a convenient way to construct a \c{ByteArray} object from an existing QByteArray. We store the
+ QByteArray as the internal data of the new object, and return the new object.
+ QScriptEngine::newObject() will call the prototype() function of our class, ensuring that
+ the prototype of the new object will be the standard \c{ByteArray} prototype.
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 2
+
+ construct() is the native function that will act as a constructor for \c{ByteArray}
+ in scripts. We extract the pointer to the class, then call a newInstance() overload
+ that takes an initial size as argument, and return the new script object.
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 3
+
+ queryProperty() is the function that Qt Script will call whenever someone tries to access
+ a property of a \c{ByteArray} object. We first get a pointer to the underlying QByteArray.
+ We check if the property being accessed is the special \c{length} property; if so, we
+ return, indicating that we will handle every kind of access to this property (e.g. both
+ read and write). Otherwise, we attempt to convert the property name to an array index. If
+ this fails, we return, indicating that we don't want to handle this property. Otherwise, we
+ have a valid array index, and store it in the \c{id} argument, so that we don't have to
+ recompute it in e.g. property() or setProperty(). If the index is greater than or equal to
+ the QByteArray's size, we indicate that we don't want to handle read access (but we still want
+ to handle writes, if requested).
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 4
+
+ In the property() reimplementation, we do similar checks as in queryProperty() to find out
+ which property is being requested, and then return the value of that property.
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 5
+
+ The setProperty() reimplementation has a structure that is similar to property(). If the \c{length} property
+ is being set, we resize the underlying QByteArray to the given length. Otherwise, we grab the
+ array index that was calculated in the queryProperty() function, enlarge the array if necessary,
+ and write the given value to the array.
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 6
+
+ The propertyFlags() reimplementation specifies that the \c{length} property can't be deleted,
+ and that it is not enumerable. Array elements can't be deleted.
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 7
+
+ We want the array elements to show up when a \c{ByteArray} object is used in for-in
+ statements and together with QScriptValueIterator. Therefore, we reimplement the
+ newIterator() function and have it return a new iterator for a given \c{ByteArray}.
+
+ \section1 ByteArray Iterator Implementation
+
+ \snippet examples/script/customclass/bytearrayclass.cpp 8
+
+ The \c{ByteArrayClassPropertyIterator} class is simple. It maintains an index into the
+ underlying QByteArray, and checks and updates the index in hasNext(), next() and so on.
+
+ \section1 ByteArray Prototype Implementation
+
+ The prototype class, ByteArrayPrototype, implements the \c{ByteArray} functions as slots.
+
+ \snippet examples/script/customclass/bytearrayprototype.h 0
+
+ There is a small helper function, thisByteArray(), that returns a pointer to the QByteArray
+ being operated upon:
+
+ \snippet examples/script/customclass/bytearrayprototype.cpp 0
+
+ The slots simply forward the calls to the QByteArray. Examples:
+
+ \snippet examples/script/customclass/bytearrayprototype.cpp 1
+
+ The remove() function is noteworthy; if we look at QByteArray::remove(), we see that it
+ should return a reference to the QByteArray itself (i.e. not a copy). To get the same
+ behavior in scripts, we return the script object (thisObject()).
+*/
diff --git a/doc/src/examples/qtscripttetrix.qdoc b/doc/src/examples/qtscripttetrix.qdoc
new file mode 100644
index 0000000..c96db6a
--- /dev/null
+++ b/doc/src/examples/qtscripttetrix.qdoc
@@ -0,0 +1,92 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example script/qstetrix
+ \title Qt Script Tetrix Example
+
+ The QSTetrix example is a Qt Script version of the classic Tetrix game.
+
+ \image tetrix-example.png
+
+ \section1 Overview
+
+ The program logic in this example is a fairly straight port of the
+ logic in the C++ \l{Tetrix Example}. You may find it useful to compare
+ the implementations of the \c TetrixBoard, \c TetrixPiece and
+ \c TetrixWindow classes to see how Qt Script is used to implement
+ methods, call Qt functions, and emit signals.
+
+ \section1 Setting up the GUI
+
+ The graphical user interface is defined in a \c{.ui} file, creating
+ using Qt Designer, and is set up in the example's C++ \c{main.cpp} file.
+
+ \snippet examples/script/qstetrix/main.cpp 0
+
+ We define a custom UI loader that handles our \c TetrixBoard widget; this
+ is the main component of the UI (where the pieces are drawn).
+
+ \snippet examples/script/qstetrix/main.cpp 1
+
+ We initialize the script engine to have the Qt namespace, so that
+ e.g., \l{Qt::Key_Left}{Qt.Key_Left} will be available to script code.
+ We also make the application object available (for the
+ \l{QApplication::}{quit()} slot).
+
+ \snippet examples/script/qstetrix/main.cpp 2
+
+ Several scripts are evaluated as part of the engine setup process.
+ The \c{tetrixpiece.js} file contains the definition of the \c TetrixPiece
+ class, which is used to populate the play field. The \c{tetrixboard.js}
+ file contains the definition of the \c TetrixBoard class, which contains
+ the main game logic. Finally, \c{tetrixwindow.js} contains the definition
+ of the \c TetrixWindow class, which wires up the top-level widget.
+
+ \snippet examples/script/qstetrix/main.cpp 3
+
+ A form is created from the UI file. A new \c TetrixWindow script object
+ is then constructed, passing the form as its argument.
+
+ \snippet examples/script/qstetrix/main.cpp 4
+
+ The form is shown, and the event loop is entered.
+*/
diff --git a/doc/src/examples/querymodel.qdoc b/doc/src/examples/querymodel.qdoc
new file mode 100644
index 0000000..296f609
--- /dev/null
+++ b/doc/src/examples/querymodel.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/querymodel
+ \title Query Model Example
+
+ The Query Model example shows how to make customized versions of
+ data obtained from a SQL query, using a model that encapsulates
+ the query and table views to display the results.
+
+ \image querymodel-example.png
+*/
diff --git a/doc/src/examples/queuedcustomtype.qdoc b/doc/src/examples/queuedcustomtype.qdoc
new file mode 100644
index 0000000..bbd1427
--- /dev/null
+++ b/doc/src/examples/queuedcustomtype.qdoc
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example threads/queuedcustomtype
+ \title Queued Custom Type Example
+
+ The Queued Custom Type example shows how to send custom types between
+ threads with queued signals and slots.
+
+ \image queuedcustomtype-example.png
+
+ Contents:
+
+ \tableofcontents
+
+ \section1 Overview
+
+ In the \l{Custom Type Sending Example}, we showed how to use a custom type
+ with signal-slot communication within the same thread.
+
+ In this example, we create a new value class, \c Block, and register it
+ with the meta-object system to enable us to send instances of it between
+ threads using queued signals and slots.
+
+ \section1 The Block Class
+
+ The \c Block class is similar to the \c Message class described in the
+ \l{Custom Type Example}. It provides the default constructor, copy
+ constructor and destructor in the public section of the class that the
+ meta-object system requires. It describes a colored rectangle.
+
+ \snippet examples/threads/queuedcustomtype/block.h custom type definition and meta-type declaration
+
+ We will still need to register it with the meta-object system at
+ run-time by calling the qRegisterMetaType() template function before
+ we make any signal-slot connections that use this type.
+ Even though we do not intend to use the type with QVariant in this example,
+ it is good practice to also declare the new type with Q_DECLARE_METATYPE().
+
+ The implementation of the \c Block class is trivial, so we avoid quoting
+ it here.
+
+ \section1 The Window Class
+
+ We define a simple \c Window class with a public slot that accepts a
+ \c Block object. The rest of the class is concerned with managing the
+ user interface and handling images.
+
+ \snippet examples/threads/queuedcustomtype/window.h Window class definition
+
+ The \c Window class also contains a worker thread, provided by a
+ \c RenderThread object. This will emit signals to send \c Block objects
+ to the window's \c addBlock(Block) slot.
+
+ The parts of the \c Window class that are most relevant are the constructor
+ and the \c addBlock(Block) slot.
+
+ The constructor creates a thread for rendering images, sets up a user
+ interface containing a label and two push buttons that are connected to
+ slots in the same class.
+
+ \snippet examples/threads/queuedcustomtype/window.cpp Window constructor start
+ \snippet examples/threads/queuedcustomtype/window.cpp set up widgets and connections
+ \snippet examples/threads/queuedcustomtype/window.cpp connecting signal with custom type
+
+ In the last of these connections, we connect a signal in the
+ \c RenderThread object to the \c addBlock(Block) slot in the window.
+
+ \dots
+ \snippet examples/threads/queuedcustomtype/window.cpp Window constructor finish
+
+ The rest of the constructor simply sets up the layout of the window.
+
+ The \c addBlock(Block) slot receives blocks from the rendering thread via
+ the signal-slot connection set up in the constructor:
+
+ \snippet examples/threads/queuedcustomtype/window.cpp Adding blocks to the display
+
+ We simply paint these onto the label as they arrive.
+
+ \section1 The RenderThread Class
+
+ The \c RenderThread class processes an image, creating \c Block objects
+ and using the \c sendBlock(Block) signal to send them to other components
+ in the example.
+
+ \snippet examples/threads/queuedcustomtype/renderthread.h RenderThread class definition
+
+ The constructor and destructor are not quoted here. These take care of
+ setting up the thread's internal state and cleaning up when it is destroyed.
+
+ Processing is started with the \c processImage() function, which calls the
+ \c RenderThread class's reimplementation of the QThread::run() function:
+
+ \snippet examples/threads/queuedcustomtype/renderthread.cpp processing the image (start)
+
+ Ignoring the details of the way the image is processed, we see that the
+ signal containing a block is emitted in the usual way:
+
+ \dots
+ \snippet examples/threads/queuedcustomtype/renderthread.cpp processing the image (finish)
+
+ Each signal that is emitted will be queued and delivered later to the
+ window's \c addBlock(Block) slot.
+
+ \section1 Registering the Type
+
+ In the example's \c{main()} function, we perform the registration of the
+ \c Block class as a custom type with the meta-object system by calling the
+ qRegisterMetaType() template function:
+
+ \snippet examples/threads/queuedcustomtype/main.cpp main function
+
+ This call is placed here to ensure that the type is registered before any
+ signal-slot connections are made that use it.
+
+ The rest of the \c{main()} function is concerned with setting a seed for
+ the pseudo-random number generator, creating and showing the window, and
+ setting a default image. See the source code for the implementation of the
+ \c createImage() function.
+
+ \section1 Further Reading
+
+ This example showed how a custom type can be registered with the
+ meta-object system so that it can be used with signal-slot connections
+ between threads. For ordinary communication involving direct signals and
+ slots, it is enough to simply declare the type in the way described in the
+ \l{Custom Type Sending Example}.
+
+ In practice, both the Q_DECLARE_METATYPE() macro and the qRegisterMetaType()
+ template function can be used to register custom types, but
+ qRegisterMetaType() is only required if you need to perform signal-slot
+ communication or need to create and destroy objects of the custom type
+ at run-time.
+
+ More information on using custom types with Qt can be found in the
+ \l{Creating Custom Qt Types} document.
+*/
diff --git a/doc/src/examples/qxmlstreambookmarks.qdoc b/doc/src/examples/qxmlstreambookmarks.qdoc
new file mode 100644
index 0000000..7059043
--- /dev/null
+++ b/doc/src/examples/qxmlstreambookmarks.qdoc
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xml/streambookmarks
+ \title QXmlStream Bookmarks Example
+
+ The QXmlStream Bookmarks example provides a reader for XML Bookmark
+ Exchange Language (XBEL) files using Qt's QXmlStreamReader class
+ for reading, and QXmlStreamWriter class for writing the files.
+
+ \image xmlstreamexample-screenshot.png
+
+ \section1 XbelWriter Class Definition
+
+ The \c XbelWriter class is a subclass of QXmlStreamReader, which provides
+ an XML parser with a streaming API. \c XbelWriter also contains a private
+ instance of QTreeWidget in order to display the bookmarks according to
+ hierarchies.
+
+ \snippet examples/xml/streambookmarks/xbelwriter.h 0
+
+ \section1 XbelWriter Class Implementation
+
+ The \c XbelWriter constructor accepts a \a treeWidget to initialize within
+ its definition. We enable \l{QXmlStreamWriter}'s auto-formatting property
+ to ensure line-breaks and indentations are added automatically to empty
+ sections between elements, increasing readability as the data is split into
+ several lines.
+
+ \snippet examples/xml/streambookmarks/xbelwriter.cpp 0
+
+ The \c writeFile() function accepts a QIODevice object and sets it using
+ \c setDevice(). This function then writes the document type
+ definition(DTD), the start element, the version, and \c{treeWidget}'s
+ top-level items.
+
+ \snippet examples/xml/streambookmarks/xbelwriter.cpp 1
+
+ The \c writeItem() function accepts a QTreeWidget object and writes it
+ to the stream, depending on its \c tagName, which can either be a "folder",
+ "bookmark", or "separator".
+
+ \snippet examples/xml/streambookmarks/xbelwriter.cpp 2
+
+ \section1 XbelReader Class Definition
+
+ The \c XbelReader class is a subclass of QXmlStreamReader, the pendent
+ class for QXmlStreamWriter. \c XbelReader contains a private instance
+ of QTreeWidget to group bookmarks according to their hierarchies.
+
+ \snippet examples/xml/streambookmarks/xbelreader.h 0
+
+ \section1 XbelReader Class Implementation
+
+ The \c XbelReader constructor accepts a QTreeWidget to initialize the
+ \c treeWidget within its definition. A QStyle object is used to set
+ \c{treeWidget}'s style property. The \c folderIcon is set to QIcon::Normal
+ mode where the pixmap is only displayed when the user is not interacting
+ with the icon. The QStyle::SP_DirClosedIcon, QStyle::SP_DirOpenIcon, and
+ QStyle::SP_FileIcon correspond to standard pixmaps that follow the style
+ of your GUI.
+
+ \snippet examples/xml/streambookmarks/xbelreader.cpp 0
+
+ The \c read() function accepts a QIODevice and sets it using
+ \l{QXmlStreamReader::setDevice()}{setDevice()}. The actual process
+ of reading only takes place in event the file is a valid XBEL 1.0
+ file. Otherwise, the \l{QXmlStreamReader::raiseError()}
+ {raiseError()} function is used to display an error message.
+
+ \snippet examples/xml/streambookmarks/xbelreader.cpp 1
+
+ The \c readUnknownElement() function reads an unknown element. The
+ Q_ASSERT() macro is used to provide a pre-condition for the function.
+
+ \snippet examples/xml/streambookmarks/xbelreader.cpp 2
+
+ The \c readXBEL() function reads the name of a startElement and calls
+ the appropriate function to read it, depending on whether if its a
+ "folder", "bookmark" or "separator". Otherwise, it calls
+ \c readUnknownElement().
+
+ \snippet examples/xml/streambookmarks/xbelreader.cpp 3
+
+ The \c readTitle() function reads the bookmark's title.
+
+ \snippet examples/xml/streambookmarks/xbelreader.cpp 4
+
+ The \c readSeparator() function creates a separator and sets its flags.
+ The text is set to 30 "0xB7", the HEX equivalent for period, and then
+ read using \c readElementText().
+
+ \snippet examples/xml/streambookmarks/xbelreader.cpp 5
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class is a subclass of QMainWindow, with a
+ \c File menu and a \c Help menu.
+
+ \snippet examples/xml/streambookmarks/mainwindow.h 0
+
+ \section1 MainWindow Class Implementation
+
+ The \c MainWindow constructor instantiates the QTreeWidget object, \c
+ treeWidget and sets its header with a QStringList object, \c labels.
+ The constructor also invokes \c createActions() and \c createMenus()
+ to set up the menus and their corresponding actions. The \c statusBar()
+ is used to display the message "Ready" and the window's size is fixed
+ to 480x320 pixels.
+
+ \snippet examples/xml/streambookmarks/mainwindow.cpp 0
+
+ The \c open() function enables the user to open an XBEL file using
+ QFileDialog::getOpenFileName(). A warning message is displayed along
+ with the \c fileName and \c errorString if the file cannot be read or
+ if there is a parse error.
+
+ \snippet examples/xml/streambookmarks/mainwindow.cpp 1
+
+ The \c saveAs() function displays a QFileDialog, prompting the user for
+ a \c fileName using QFileDialog::getSaveFileName(). Similar to the
+ \c open() function, this function also displays a warning message if
+ the file cannot be written to.
+
+ \snippet examples/xml/streambookmarks/mainwindow.cpp 2
+
+ The \c about() function displays a QMessageBox with a brief description
+ of the example.
+
+ \snippet examples/xml/streambookmarks/mainwindow.cpp 3
+
+ In order to implement the \c open(), \c saveAs(), \c exit(), \c about()
+ and \c aboutQt() functions, we connect them to QAction objects and
+ add them to the \c fileMenu and \c helpMenu. The connections are as shown
+ below:
+
+ \snippet examples/xml/streambookmarks/mainwindow.cpp 4
+
+ The \c createMenus() function creates the \c fileMenu and \c helpMenu
+ and adds the QAction objects to them in order to create the menu shown
+ in the screenshot below:
+
+ \table
+ \row
+ \o \inlineimage xmlstreamexample-filemenu.png
+ \o \inlineimage xmlstreamexample-helpmenu.png
+ \endtable
+
+ \snippet examples/xml/streambookmarks/mainwindow.cpp 5
+
+ \section1 \c{main()} Function
+
+ The \c main() function instantiates \c MainWindow and invokes the \c show()
+ function.
+
+ \snippet examples/xml/streambookmarks/main.cpp 0
+
+ See the \l{http://pyxml.sourceforge.net/topics/xbel/}
+ {XML Bookmark Exchange Language Resource Page} for more information
+ about XBEL files.
+*/
diff --git a/doc/src/examples/recentfiles.qdoc b/doc/src/examples/recentfiles.qdoc
new file mode 100644
index 0000000..185cbf1
--- /dev/null
+++ b/doc/src/examples/recentfiles.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example mainwindows/recentfiles
+ \title Recent Files Example
+
+ The Recent Files example shows how a standard File menu can be extended to show
+ the most recent files loaded by a main window application.
+
+ \image recentfiles-example.png
+*/
diff --git a/doc/src/examples/recipes.qdoc b/doc/src/examples/recipes.qdoc
new file mode 100644
index 0000000..ba06b7e
--- /dev/null
+++ b/doc/src/examples/recipes.qdoc
@@ -0,0 +1,164 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xmlpatterns/recipes
+ \title Recipes Example
+
+ The recipes example shows how to use QtXmlPatterns to query XML data
+ loaded from a file.
+
+ \tableofcontents
+
+ \section1 Introduction
+
+ In this case, the XML data represents a cookbook, \c{cookbook.xml},
+ which contains \c{<cookbook>} as its document element, which in turn
+ contains a sequence of \c{<recipe>} elements. This XML data is
+ searched using queries stored in XQuery files (\c{*.xq}).
+
+ \section2 The User Interface
+
+ The UI for this example was created using \l{Qt Designer Manual} {Qt
+ Designer}:
+
+ \image recipes-example.png
+
+ The UI consists of three \l{QGroupBox} {group boxes} arranged
+ vertically. The top one contains a \l{QTextEdit} {text viewer} that
+ displays the XML text from the cookbook file. The middle group box
+ contains a \l{QComboBox} {combo box} for choosing the \l{A Short
+ Path to XQuery} {XQuery} to run and a \l{QTextEdit} {text viewer}
+ for displaying the text of the selected XQuery. The \c{.xq} files in
+ the file list above are shown in the combo box menu. Choosing an
+ XQuery loads, parses, and runs the selected XQuery. The query result
+ is shown in the bottom group box's \l{QTextEdit} {text viewer}.
+
+ \section2 Running your own XQueries
+
+ You can write your own XQuery files and run them in the example
+ program. The file \c{xmlpatterns/recipes/recipes.qrc} is the \l{The
+ Qt Resource System} {resource file} for this example. It is used in
+ \c{main.cpp} (\c{Q_INIT_RESOURCE(recipes);}). It lists the XQuery
+ files (\c{.xq}) that can be selected in the combobox.
+
+ \quotefromfile examples/xmlpatterns/recipes/recipes.qrc
+ \printuntil
+
+ To add your own queries to the example's combobox, store your
+ \c{.xq} files in the \c{examples/xmlpatterns/recipes/files}
+ directory and add them to \c{recipes.qrc} as shown above.
+
+ \section1 Code Walk-Through
+
+ The example's main() function creates the standard instance of
+ QApplication. Then it creates an instance of the UI class, shows it,
+ and starts the Qt event loop:
+
+ \snippet examples/xmlpatterns/recipes/main.cpp 0
+
+ \section2 The UI Class: QueryMainWindow
+
+ The example's UI is a conventional Qt GUI application inheriting
+ QMainWindow and the class generated by \l{Qt Designer Manual} {Qt
+ Designer}:
+
+ \snippet examples/xmlpatterns/recipes/querymainwindow.h 0
+
+ The constructor finds the window's \l{QComboBox} {combo box} child
+ widget and connects its \l{QComboBox::currentIndexChanged()}
+ {currentIndexChanged()} signal to the window's \c{displayQuery()}
+ slot. It then calls \c{loadInputFile()} to load \c{cookbook.xml} and
+ display its contents in the top group box's \l{QTextEdit} {text
+ viewer} . Finally, it finds the XQuery files (\c{.xq}) and adds each
+ one to the \l{QComboBox} {combo box} menu.
+
+ \snippet examples/xmlpatterns/recipes/querymainwindow.cpp 0
+
+ The work is done in the \l{displayQuery() slot} {displayQuery()}
+ slot and the \l{evaluate() function} {evaluate()} function it
+ calls. \l{displayQuery() slot} {displayQuery()} loads and displays
+ the selected query file and passes the XQuery text to \l{evaluate()
+ function} {evaluate()}.
+
+ \target displayQuery() slot
+ \snippet examples/xmlpatterns/recipes/querymainwindow.cpp 1
+
+ \l{evaluate() function} {evaluate()} demonstrates the standard
+ QtXmlPatterns usage pattern. First, an instance of QXmlQuery is
+ created (\c{query}). The \c{query's} \l{QXmlQuery::bindVariable()}
+ {bindVariable()} function is then called to bind the \c cookbook.xml
+ file to the XQuery variable \c inputDocument. \e{After} the variable
+ is bound, \l{QXmlQuery::setQuery()} {setQuery()} is called to pass
+ the XQuery text to the \c query.
+
+ \note \l{QXmlQuery::setQuery()} {setQuery()} must be called
+ \e{after} \l{QXmlQuery::bindVariable()} {bindVariable()}.
+
+ Passing the XQuery to \l{QXmlQuery::setQuery()} {setQuery()} causes
+ QtXmlPatterns to parse the XQuery. \l{QXmlQuery::isValid()} is
+ called to ensure that the XQuery was correctly parsed.
+
+ \target evaluate() function
+ \snippet examples/xmlpatterns/recipes/querymainwindow.cpp 2
+
+ If the XQuery is valid, an instance of QXmlFormatter is created to
+ format the query result as XML into a QBuffer. To evaluate the
+ XQuery, an overload of \l{QXmlQuery::evaluateTo()} {evaluateTo()} is
+ called that takes a QAbstractXmlReceiver for its output
+ (QXmlFormatter inherits QAbstractXmlReceiver). Finally, the
+ formatted XML result is displayed in the UI's bottom text view.
+
+ \note Each XQuery \c{.xq} file must declare the \c{$inputDocument}
+ variable to represent the \c cookbook.xml document:
+
+ \code
+ (: All ingredients for Mushroom Soup. :)
+ declare variable $inputDocument external;
+
+ doc($inputDocument)/cookbook/recipe[@xml:id = "MushroomSoup"]/ingredient/
+ <p>{@name, @quantity}</p>
+ \endcode
+
+ \note If you add add your own query.xq files, you must declare the
+ \c{$inputDocument} and use it as shown above.
+
+*/
diff --git a/doc/src/examples/regexp.qdoc b/doc/src/examples/regexp.qdoc
new file mode 100644
index 0000000..de6cbfc
--- /dev/null
+++ b/doc/src/examples/regexp.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/regexp
+ \title Regular Expressions Example
+
+ The Regular Expressions (RegExp) example shows how regular expressions in Qt are
+ applied to text by providing an environment in which new regular expressions can be
+ created and tested on custom text strings.
+
+ \image regexp-example.png
+*/
diff --git a/doc/src/examples/relationaltablemodel.qdoc b/doc/src/examples/relationaltablemodel.qdoc
new file mode 100644
index 0000000..5e944c2
--- /dev/null
+++ b/doc/src/examples/relationaltablemodel.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/relationaltablemodel
+ \title Relational Table Model Example
+
+ The Relational Table Model example shows how to use table views with a relational
+ model to visualize the relations between items in a database.
+
+ \image relationaltablemodel-example.png
+*/
diff --git a/doc/src/examples/remotecontrol.qdoc b/doc/src/examples/remotecontrol.qdoc
new file mode 100644
index 0000000..698ad1f
--- /dev/null
+++ b/doc/src/examples/remotecontrol.qdoc
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example help/remotecontrol
+ \title Remote Control Example
+
+ This example shows how to use and control Qt Assistant
+ as a help viewer.
+*/ \ No newline at end of file
diff --git a/doc/src/examples/rsslisting.qdoc b/doc/src/examples/rsslisting.qdoc
new file mode 100644
index 0000000..73ff68c
--- /dev/null
+++ b/doc/src/examples/rsslisting.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xml/rsslisting
+ \title RSS-Listing Example
+
+ This example shows how to create a widget that displays news items
+ from RDF news sources.
+
+ \image rsslistingexample.png
+*/
diff --git a/doc/src/examples/samplebuffers.qdoc b/doc/src/examples/samplebuffers.qdoc
new file mode 100644
index 0000000..1c8202c
--- /dev/null
+++ b/doc/src/examples/samplebuffers.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/samplebuffers
+ \title Sample Buffers Example
+
+ The Sample Buffers example demonstrates how to use and enable
+ sample buffers in a QGLWidget.
+
+ \image samplebuffers-example.png
+*/
diff --git a/doc/src/examples/saxbookmarks.qdoc b/doc/src/examples/saxbookmarks.qdoc
new file mode 100644
index 0000000..3db87d6
--- /dev/null
+++ b/doc/src/examples/saxbookmarks.qdoc
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xml/saxbookmarks
+ \title SAX Bookmarks Example
+
+ The SAX Bookmarks example provides a reader for XML Bookmark Exchange Language (XBEL)
+ files that uses Qt's SAX-based API to read and parse the files. The DOM Bookmarks
+ example provides an alternative way to read this type of file.
+
+ \image saxbookmarks-example.png
+
+ See the \l{XML Bookmark Exchange Language Resource Page} for more
+ information about XBEL files.
+*/
diff --git a/doc/src/examples/screenshot.qdoc b/doc/src/examples/screenshot.qdoc
new file mode 100644
index 0000000..b989a32
--- /dev/null
+++ b/doc/src/examples/screenshot.qdoc
@@ -0,0 +1,262 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example desktop/screenshot
+ \title Screenshot Example
+
+ The Screenshot example shows how to take a screenshot of the
+ desktop using QApplication and QDesktopWidget. It also shows how
+ to use QTimer to provide a single-shot timer, and how to
+ reimplement the QWidget::resizeEvent() event handler to make sure
+ that an application resizes smoothly and without data loss.
+
+ \image screenshot-example.png
+
+ With the application the users can take a screenshot of their
+ desktop. They are provided with a couple of options:
+
+ \list
+ \o Delaying the screenshot, giving them time to rearrange
+ their desktop.
+ \o Hiding the application's window while the screenshot is taken.
+ \endlist
+
+ In addition the application allows the users to save their
+ screenshot if they want to.
+
+ \section1 Screenshot Class Definition
+
+ \snippet examples/desktop/screenshot/screenshot.h 0
+
+ The \c Screenshot class inherits QWidget and is the application's
+ main widget. It displays the application options and a preview of
+ the screenshot.
+
+ We reimplement the QWidget::resizeEvent() function to make sure
+ that the preview of the screenshot scales properly when the user
+ resizes the application widget. We also need several private slots
+ to facilitate the options:
+
+ \list
+ \o The \c newScreenshot() slot prepares a new screenshot.
+ \o The \c saveScreenshot() slot saves the last screenshot.
+ \o The \c shootScreen() slot takes the screenshot.
+ \o The \c updateCheckBox() slot enables or disables the
+ \gui {Hide This Window} option.
+ \endlist
+
+ We also declare some private functions: We use the \c
+ createOptionsGroupBox(), \c createButtonsLayout() and \c
+ createButton() functions when we construct the widget. And we call
+ the private \c updateScreenshotLabel() function whenever a new
+ screenshot is taken or when a resize event changes the size of the
+ screenshot preview label.
+
+ In addition we need to store the screenshot's original pixmap. The
+ reason is that when we display the preview of the screenshot, we
+ need to scale its pixmap, storing the original we make sure that
+ no data are lost in that process.
+
+ \section1 Screenshot Class Implementation
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 0
+
+ In the constructor we first create the QLabel displaying the
+ screenshot preview.
+
+ We set the QLabel's size policy to be QSizePolicy::Expanding both
+ horizontally and vertically. This means that the QLabel's size
+ hint is a sensible size, but the widget can be shrunk and still be
+ useful. Also, the widget can make use of extra space, so it should
+ get as much space as possible. Then we make sure the QLabel is
+ aligned in the center of the \c Screenshot widget, and set its
+ minimum size.
+
+ We create the applications's buttons and the group box containing
+ the application's options, and put it all into a main
+ layout. Finally we take the initial screenshot, and set the inital
+ delay and the window title, before we resize the widget to a
+ suitable size.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 1
+
+ The \c resizeEvent() function is reimplemented to receive the
+ resize events dispatched to the widget. The purpose is to scale
+ the preview screenshot pixmap without deformation of its content,
+ and also make sure that the application can be resized smoothly.
+
+ To achieve the first goal, we scale the screenshot pixmap using
+ Qt::KeepAspectRatio. We scale the pixmap to a rectangle as large
+ as possible inside the current size of the screenshot preview
+ label, preserving the aspect ratio. This means that if the user
+ resizes the application window in only one direction, the preview
+ screenshot keeps the same size.
+
+ To reach our second goal, we make sure that the preview screenshot
+ only is repainted (using the private \c updateScreenshotLabel()
+ function) when it actually changes its size.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 2
+
+ The private \c newScreenshot() slot is called when the user
+ requests a new screenshot; but the slot only prepares a new
+ screenshot.
+
+ First we see if the \gui {Hide This Window} option is checked, if
+ it is we hide the \c Screenshot widget. Then we disable the \gui
+ {New Screenshot} button, to make sure the user only can request
+ one screenshot at a time.
+
+ We create a timer using the QTimer class which provides repetitive
+ and single-shot timers. We set the timer to time out only once,
+ using the static QTimer::singleShot() function. This function
+ calls the private \c shootScreen() slot after the time interval
+ specified by the \gui {Screenshot Delay} option. It is \c
+ shootScreen() that actually performs the screenshot.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 3
+
+ The \c saveScreenshot() slot is called when the user push the \gui
+ Save button, and it presents a file dialog using the QFileDialog
+ class.
+
+ QFileDialog enables a user to traverse the file system in order to
+ select one or many files or a directory. The easiest way to create
+ a QFileDialog is to use the convenience static
+ functions.
+
+ We define the default file format to be png, and we make the file
+ dialog's initial path the path the application is run from. We
+ create the file dialog using the static
+ QFileDialog::getSaveFileName() function which returns a file name
+ selected by the user. The file does not have to exist. If the file
+ name is valid, we use the QPixmap::save() function to save the
+ screenshot's original pixmap in that file.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 4
+
+ The \c shootScreen() slot is called to take the screenshot. If the
+ user has chosen to delay the screenshot, we make the application
+ beep when the screenshot is taken using the static
+ QApplication::beep() function.
+
+ The QApplication class manages the GUI application's control flow
+ and main settings. It contains the main event loop, where all
+ events from the window system and other sources are processed and
+ dispatched.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 5
+
+ We take the screenshot using the static QPixmap::grabWindow()
+ function. The function grabs the contents of the window passed as
+ an argument, makes a pixmap out of it and returns that pixmap.
+
+ We identify the argument window using the QWidget::winID()
+ function which returns the window system identifier. Here it
+ returns the identifier of the current QDesktopWidget retrieved by
+ the QApplication::desktop() function. The QDesktopWidget class
+ provides access to screen information, and inherits
+ QWidget::winID().
+
+ We update the screenshot preview label using the private \c
+ updateScreenshotLabel() function. Then we enable the \gui {New
+ Screenshot} button, and finally we make the \c Screenshot widget
+ visible if it was hidden during the screenshot.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 6
+
+ The \gui {Hide This Window} option is enabled or disabled
+ depending on the delay of the screenshot. If there is no delay,
+ the application window cannot be hidden and the option's checkbox
+ is disabled.
+
+ The \c updateCheckBox() slot is called whenever the user changes
+ the delay using the \gui {Screenshot Delay} option.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 7
+
+ The private \c createOptionsGroupBox() function is called from the
+ constructor.
+
+ First we create a group box that will contain all of the options'
+ widgets. Then we create a QSpinBox and a QLabel for the \gui
+ {Screenshot Delay} option, and connect the spinbox to the \c
+ updateCheckBox() slot. Finally, we create a QCheckBox for the \gui
+ {Hide This Window} option, add all the options' widgets to a
+ QGridLayout and install the layout on the group box.
+
+ Note that we don't have to specify any parents for the widgets
+ when we create them. The reason is that when we add a widget to a
+ layout and install the layout on another widget, the layout's
+ widgets are automatically reparented to the widget the layout is
+ installed on.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 8
+
+ The private \c createButtonsLayout() function is called from the
+ constructor. We create the application's buttons using the private
+ \c createButton() function, and add them to a QHBoxLayout.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 9
+
+ The private \c createButton() function is called from the \c
+ createButtonsLayout() function. It simply creates a QPushButton
+ with the provided text, connects it to the provided receiver and
+ slot, and returns a pointer to the button.
+
+ \snippet examples/desktop/screenshot/screenshot.cpp 10
+
+ The private \c updateScreenshotLabel() function is called whenever
+ the screenshot changes, or when a resize event changes the size of
+ the screenshot preview label. It updates the screenshot preview's
+ label using the QLabel::setPixmap() and QPixmap::scaled()
+ functions.
+
+ QPixmap::scaled() returns a copy of the given pixmap scaled to a
+ rectangle of the given size according to the given
+ Qt::AspectRatioMode and Qt::TransformationMode.
+
+ We scale the original pixmap to fit the current screenshot label's
+ size, preserving the aspect ratio and giving the resulting pixmap
+ smoothed edges.
+*/
+
diff --git a/doc/src/examples/scribble.qdoc b/doc/src/examples/scribble.qdoc
new file mode 100644
index 0000000..4dc1783
--- /dev/null
+++ b/doc/src/examples/scribble.qdoc
@@ -0,0 +1,432 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/scribble
+ \title Scribble Example
+
+ The Scribble example shows how to reimplement some of QWidget's
+ event handlers to receive the events generated for the
+ application's widgets.
+
+ We reimplement the mouse event handlers to implement drawing, the
+ paint event handler to update the application and the resize event
+ handler to optimize the application's appearance. In addition we
+ reimplement the close event handler to intercept the close events
+ before terminating the application.
+
+ The example also demonstrates how to use QPainter to draw an image
+ in real time, as well as to repaint widgets.
+
+ \image scribble-example.png Screenshot of the Scribble example
+
+ With the Scribble application the users can draw an image. The
+ \gui File menu gives the users the possibility to open and edit an
+ existing image file, save an image and exit the application. While
+ drawing, the \gui Options menu allows the users to to choose the
+ pen color and pen width, as well as clear the screen. In addition
+ the \gui Help menu provides the users with information about the
+ Scribble example in particular, and about Qt in general.
+
+ The example consists of two classes:
+
+ \list
+ \o \c ScribbleArea is a custom widget that displays a QImage and
+ allows to the user to draw on it.
+ \o \c MainWindow provides a menu above the \c ScribbleArea.
+ \endlist
+
+ We will start by reviewing the \c ScribbleArea class, which
+ contains the interesting, then we will take a look at the \c
+ MainWindow class that uses it.
+
+ \section1 ScribbleArea Class Definition
+
+ \snippet examples/widgets/scribble/scribblearea.h 0
+
+ The \c ScribbleArea class inherits from QWidget. We reimplement
+ the \c mousePressEvent(), \c mouseMoveEvent() and \c
+ mouseReleaseEvent() functions to implement the drawing. We
+ reimplement the \c paintEvent() function to update the scribble
+ area, and the \c resizeEvent() function to ensure that the QImage
+ on which we draw is at least as large as the widget at any time.
+
+ We need several public functions: \c openImage() loads an image
+ from a file into the scribble area, allowing the user to edit the
+ image; \c save() writes the currently displayed image to file; \c
+ clearImage() slot clears the image displayed in the scribble
+ area. We need the private \c drawLineTo() function to actually do
+ the drawing, and \c resizeImage() to change the size of a
+ QImage. The \c print() slot handles printing.
+
+ We also need the following private variables:
+
+ \list
+ \o \c modified is \c true if there are unsaved
+ changes to the image displayed in the scribble area.
+ \o \c scribbling is \c true while the user is pressing
+ the left mouse button within the scribble area.
+ \o \c penWidth and \c penColor hold the currently
+ set width and color for the pen used in the application.
+ \o \c image stores the image drawn by the user.
+ \o \c lastPoint holds the position of the cursor at the last
+ mouse press or mouse move event.
+ \endlist
+
+ \section1 ScribbleArea Class Implementation
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 0
+
+ In the constructor, we set the Qt::WA_StaticContents
+ attribute for the widget, indicating that the widget contents are
+ rooted to the top-left corner and don't change when the widget is
+ resized. Qt uses this attribute to optimize paint events on
+ resizes. This is purely an optimization and should only be used
+ for widgets whose contents are static and rooted to the top-left
+ corner.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 1
+ \snippet examples/widgets/scribble/scribblearea.cpp 2
+
+ In the \c openImage() function, we load the given image. Then we
+ resize the loaded QImage to be at least as large as the widget in
+ both directions using the private \c resizeImage() function and
+ we set the \c image member variable to be the loaded image. At
+ the end, we call QWidget::update() to schedule a repaint.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 3
+ \snippet examples/widgets/scribble/scribblearea.cpp 4
+
+ The \c saveImage() function creates a QImage object that covers
+ only the visible section of the actual \c image and saves it using
+ QImage::save(). If the image is successfully saved, we set the
+ scribble area's \c modified variable to \c false, because there is
+ no unsaved data.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 5
+ \snippet examples/widgets/scribble/scribblearea.cpp 6
+ \codeline
+ \snippet examples/widgets/scribble/scribblearea.cpp 7
+ \snippet examples/widgets/scribble/scribblearea.cpp 8
+
+ The \c setPenColor() and \c setPenWidth() functions set the
+ current pen color and width. These values will be used for future
+ drawing operations.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 9
+ \snippet examples/widgets/scribble/scribblearea.cpp 10
+
+ The public \c clearImage() slot clears the image displayed in the
+ scribble area. We simply fill the entire image with white, which
+ corresponds to RGB value (255, 255, 255). As usual when we modify
+ the image, we set \c modified to \c true and schedule a repaint.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 11
+ \snippet examples/widgets/scribble/scribblearea.cpp 12
+
+ For mouse press and mouse release events, we use the
+ QMouseEvent::button() function to find out which button caused
+ the event. For mose move events, we use QMouseEvent::buttons()
+ to find which buttons are currently held down (as an OR-combination).
+
+ If the users press the left mouse button, we store the position
+ of the mouse cursor in \c lastPoint. We also make a note that the
+ user is currently scribbling. (The \c scribbling variable is
+ necessary because we can't assume that a mouse move and mouse
+ release event is always preceded by a mouse press event on the
+ same widget.)
+
+ If the user moves the mouse with the left button pressed down or
+ releases the button, we call the private \c drawLineTo() function
+ to draw.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 13
+ \snippet examples/widgets/scribble/scribblearea.cpp 14
+
+ In the reimplementation of the \l
+ {QWidget::paintEvent()}{paintEvent()} function, we simply create
+ a QPainter for the scribble area, and draw the image.
+
+ At this point, you might wonder why we don't just draw directly
+ onto the widget instead of drawing in a QImage and copying the
+ QImage onto screen in \c paintEvent(). There are at least three
+ good reasons for this:
+
+ \list
+ \o The window system requires us to be able to redraw the widget
+ \e{at any time}. For example, if the window is minimized and
+ restored, the window system might have forgotten the contents
+ of the widget and send us a paint event. In other words, we
+ can't rely on the window system to remember our image.
+
+ \o Qt normally doesn't allow us to paint outside of \c
+ paintEvent(). In particular, we can't paint from the mouse
+ event handlers. (This behavior can be changed using the
+ Qt::WA_PaintOnScreen widget attribute, though.)
+
+ \o If initialized properly, a QImage is guaranteed to use 8-bit
+ for each color channel (red, green, blue, and alpha), whereas
+ a QWidget might have a lower color depth, depending on the
+ monitor configuration. This means that if we load a 24-bit or
+ 32-bit image and paint it onto a QWidget, then copy the
+ QWidget into a QImage again, we might lose some information.
+ \endlist
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 15
+ \snippet examples/widgets/scribble/scribblearea.cpp 16
+
+ When the user starts the Scribble application, a resize event is
+ generated and an image is created and displayed in the scribble
+ area. We make this initial image slightly larger than the
+ application's main window and scribble area, to avoid always
+ resizing the image when the user resizes the main window (which
+ would be very inefficient). But when the main window becomes
+ larger than this initial size, the image needs to be resized.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 17
+ \snippet examples/widgets/scribble/scribblearea.cpp 18
+
+ In \c drawLineTo(), we draw a line from the point where the mouse
+ was located when the last mouse press or mouse move occurred, we
+ set \c modified to true, we generate a repaint event, and we
+ update \c lastPoint so that next time \c drawLineTo() is called,
+ we continue drawing from where we left.
+
+ We could call the \c update() function with no parameter, but as
+ an easy optimization we pass a QRect that specifies the rectangle
+ inside the scribble are needs updating, to avoid a complete
+ repaint of the widget.
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 19
+ \snippet examples/widgets/scribble/scribblearea.cpp 20
+
+ QImage has no nice API for resizing an image. There's a
+ QImage::copy() function that could do the trick, but when used to
+ expand an image, it fills the new areas with black, whereas we
+ want white.
+
+ So the trick is to create a brand new QImage with the right size,
+ to fill it with white, and to draw the old image onto it using
+ QPainter. The new image is given the QImage::Format_RGB32
+ format, which means that each pixel is stored as 0xffRRGGBB
+ (where RR, GG, and BB are the red, green and blue
+ color channels, ff is the hexadecimal value 255).
+
+ Printing is handled by the \c print() slot:
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 21
+
+ We construct a high resolution QPrinter object for the required
+ output format, using a QPrintDialog to ask the user to specify a
+ page size and indicate how the output should be formatted on the page.
+
+ If the dialog is accepted, we perform the task of printing to the paint
+ device:
+
+ \snippet examples/widgets/scribble/scribblearea.cpp 22
+
+ Printing an image to a file in this way is simply a matter of
+ painting onto the QPrinter. We scale the image to fit within the
+ available space on the page before painting it onto the paint
+ device.
+
+ \section1 MainWindow Class Definition
+
+ \snippet examples/widgets/scribble/mainwindow.h 0
+
+ The \c MainWindow class inherits from QMainWindow. We reimplement
+ the \l{QWidget::closeEvent()}{closeEvent()} handler from QWidget.
+ The \c open(), \c save(), \c penColor() and \c penWidth()
+ slots correspond to menu entries. In addition we create four
+ private functions.
+
+ We use the boolean \c maybeSave() function to check if there are
+ any unsaved changes. If there are unsaved changes, we give the
+ user the opportunity to save these changes. The function returns
+ \c false if the user clicks \gui Cancel. We use the \c saveFile()
+ function to let the user save the image currently displayed in
+ the scribble area.
+
+ \section1 MainWindow Class Implementation
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 0
+
+ In the constructor, we create a scribble area which we make the
+ central widget of the \c MainWindow widget. Then we create the
+ associated actions and menus.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 1
+ \snippet examples/widgets/scribble/mainwindow.cpp 2
+
+ Close events are sent to widgets that the users want to close,
+ usually by clicking \gui{File|Exit} or by clicking the \gui X
+ title bar button. By reimplementing the event handler, we can
+ intercept attempts to close the application.
+
+ In this example, we use the close event to ask the user to save
+ any unsaved changes. The logic for that is located in the \c
+ maybeSave() function. If \c maybeSave() returns true, there are
+ no modifications or the users successfully saved them, and we
+ accept the event. The application can then terminate normally. If
+ \c maybeSave() returns false, the user clicked \gui Cancel, so we
+ "ignore" the event, leaving the application unaffected by it.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 3
+ \snippet examples/widgets/scribble/mainwindow.cpp 4
+
+ In the \c open() slot we first give the user the opportunity to
+ save any modifications to the currently displayed image, before a
+ new image is loaded into the scribble area. Then we ask the user
+ to choose a file and we load the file in the \c ScribbleArea.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 5
+ \snippet examples/widgets/scribble/mainwindow.cpp 6
+
+ The \c save() slot is called when the users choose the \gui {Save
+ As} menu entry, and then choose an entry from the format menu. The
+ first thing we need to do is to find out which action sent the
+ signal using QObject::sender(). This function returns the sender
+ as a QObject pointer. Since we know that the sender is an action
+ object, we can safely cast the QObject. We could have used a
+ C-style cast or a C++ \c static_cast<>(), but as a defensive
+ programming technique we use a qobject_cast(). The advantage is
+ that if the object has the wrong type, a null pointer is
+ returned. Crashes due to null pointers are much easier to diagnose
+ than crashes due to unsafe casts.
+
+ Once we have the action, we extract the chosen format using
+ QAction::data(). (When the actions are created, we use
+ QAction::setData() to set our own custom data attached to the
+ action, as a QVariant. More on this when we review \c
+ createActions().)
+
+ Now that we know the format, we call the private \c saveFile()
+ function to save the currently displayed image.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 7
+ \snippet examples/widgets/scribble/mainwindow.cpp 8
+
+ We use the \c penColor() slot to retrieve a new color from the
+ user with a QColorDialog. If the user chooses a new color, we
+ make it the scribble area's color.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 9
+ \snippet examples/widgets/scribble/mainwindow.cpp 10
+
+ To retrieve a new pen width in the \c penWidth() slot, we use
+ QInputDialog. The QInputDialog class provides a simple
+ convenience dialog to get a single value from the user. We use
+ the static QInputDialog::getInteger() function, which combines a
+ QLabel and a QSpinBox. The QSpinBox is initialized with the
+ scribble area's pen width, allows a range from 1 to 50, a step of
+ 1 (meaning that the up and down arrow increment or decrement the
+ value by 1).
+
+ The boolean \c ok variable will be set to \c true if the user
+ clicked \gui OK and to \c false if the user pressed \gui Cancel.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 11
+ \snippet examples/widgets/scribble/mainwindow.cpp 12
+
+ We implement the \c about() slot to create a message box
+ describing what the example is designed to show.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 13
+ \snippet examples/widgets/scribble/mainwindow.cpp 14
+
+ In the \c createAction() function we create the actions
+ representing the menu entries and connect them to the appropiate
+ slots. In particular we create the actions found in the \gui
+ {Save As} sub-menu. We use QImageWriter::supportedImageFormats()
+ to get a list of the supported formats (as a QList<QByteArray>).
+
+ Then we iterate through the list, creating an action for each
+ format. We call QAction::setData() with the file format, so we
+ can retrieve it later as QAction::data(). We could also have
+ deduced the file format from the action's text, by truncating the
+ "...", but that would have been inelegant.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 15
+ \snippet examples/widgets/scribble/mainwindow.cpp 16
+
+ In the \c createMenu() function, we add the previously created
+ format actions to the \c saveAsMenu. Then we add the rest of the
+ actions as well as the \c saveAsMenu sub-menu to the \gui File,
+ \gui Options and \gui Help menus.
+
+ The QMenu class provides a menu widget for use in menu bars,
+ context menus, and other popup menus. The QMenuBar class provides
+ a horizontal menu bar with a list of pull-down \l{QMenu}s. At the
+ end we put the \gui File and \gui Options menus in the \c
+ {MainWindow}'s menu bar, which we retrieve using the
+ QMainWindow::menuBar() function.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 17
+ \snippet examples/widgets/scribble/mainwindow.cpp 18
+
+ In \c mayBeSave(), we check if there are any unsaved changes. If
+ there are any, we use QMessageBox to give the user a warning that
+ the image has been modified and the opportunity to save the
+ modifications.
+
+ As with QColorDialog and QFileDialog, the easiest way to create a
+ QMessageBox is to use its static functions. QMessageBox provides
+ a range of different messages arranged along two axes: severity
+ (question, information, warning and critical) and complexity (the
+ number of necessary response buttons). Here we use the \c
+ warning() function sice the message is rather important.
+
+ If the user chooses to save, we call the private \c saveFile()
+ function. For simplicitly, we use PNG as the file format; the
+ user can always press \gui Cancel and save the file using another
+ format.
+
+ The \c maybeSave() function returns \c false if the user clicks
+ \gui Cancel; otherwise it returns \c true.
+
+ \snippet examples/widgets/scribble/mainwindow.cpp 19
+ \snippet examples/widgets/scribble/mainwindow.cpp 20
+
+ In \c saveFile(), we pop up a file dialog with a file name
+ suggestion. The static QFileDialog::getSaveFileName() function
+ returns a file name selected by the user. The file does not have
+ to exist.
+*/
diff --git a/doc/src/examples/sdi.qdoc b/doc/src/examples/sdi.qdoc
new file mode 100644
index 0000000..cfe351c
--- /dev/null
+++ b/doc/src/examples/sdi.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example mainwindows/sdi
+ \title SDI Example
+
+ The SDI example shows how to create a Single Document Interface. It uses a number of
+ top-level windows to display the contents of different text files.
+
+ \image sdi-example.png
+*/
diff --git a/doc/src/examples/securesocketclient.qdoc b/doc/src/examples/securesocketclient.qdoc
new file mode 100644
index 0000000..e93bf20
--- /dev/null
+++ b/doc/src/examples/securesocketclient.qdoc
@@ -0,0 +1,53 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/securesocketclient
+ \title Secure Socket Client Example
+
+ The Secure Socket Client example shows how to use QSslSocket to
+ communicate over an encrypted (SSL) connection. It also demonstrates how
+ to deal with authenticity problems, and how to display security and
+ certificate information.
+
+ \image securesocketclient.png
+ \image securesocketclient2.png
+*/
diff --git a/doc/src/examples/semaphores.qdoc b/doc/src/examples/semaphores.qdoc
new file mode 100644
index 0000000..a387350
--- /dev/null
+++ b/doc/src/examples/semaphores.qdoc
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example threads/semaphores
+ \title Semaphores Example
+
+ The Semaphores example shows how to use QSemaphore to control
+ access to a circular buffer shared by a producer thread and a
+ consumer thread.
+
+ The producer writes data to the buffer until it reaches the end
+ of the buffer, at which point it restarts from the beginning,
+ overwriting existing data. The consumer thread reads the data as
+ it is produced and writes it to standard error.
+
+ Semaphores make it possible to have a higher level of concurrency
+ than mutexes. If accesses to the buffer were guarded by a QMutex,
+ the consumer thread couldn't access the buffer at the same time
+ as the producer thread. Yet, there is no harm in having both
+ threads working on \e{different parts} of the buffer at the same
+ time.
+
+ The example comprises two classes: \c Producer and \c Consumer.
+ Both inherit from QThread. The circular buffer used for
+ communicating between these two classes and the semaphores that
+ protect it are global variables.
+
+ An alternative to using QSemaphore to solve the producer-consumer
+ problem is to use QWaitCondition and QMutex. This is what the
+ \l{threads/waitconditions}{Wait Conditions} example does.
+
+ \section1 Global Variables
+
+ Let's start by reviewing the circular buffer and the associated
+ semaphores:
+
+ \snippet examples/threads/semaphores/semaphores.cpp 0
+
+ \c DataSize is the amout of data that the producer will generate.
+ To keep the example as simple as possible, we make it a constant.
+ \c BufferSize is the size of the circular buffer. It is less than
+ \c DataSize, meaning that at some point the producer will reach
+ the end of the buffer and restart from the beginning.
+
+ To synchronize the producer and the consumer, we need two
+ semaphores. The \c freeBytes semaphore controls the "free" area
+ of the buffer (the area that the producer hasn't filled with data
+ yet or that the consumer has already read). The \c usedBytes
+ semaphore controls the "used" area of the buffer (the area that
+ the producer has filled but that the consumer hasn't read yet).
+
+ Together, the semaphores ensure that the producer is never more
+ than \c BufferSize bytes ahead of the consumer, and that the
+ consumer never reads data that the producer hasn't generated yet.
+
+ The \c freeBytes semaphore is initialized with \c BufferSize,
+ because initially the entire buffer is empty. The \c usedBytes
+ semaphore is initialized to 0 (the default value if none is
+ specified).
+
+ \section1 Producer Class
+
+ Let's review the code for the \c Producer class:
+
+ \snippet examples/threads/semaphores/semaphores.cpp 1
+ \snippet examples/threads/semaphores/semaphores.cpp 2
+
+ The producer generates \c DataSize bytes of data. Before it
+ writes a byte to the circular buffer, it must acquire a "free"
+ byte using the \c freeBytes semaphore. The QSemaphore::acquire()
+ call might block if the consumer hasn't kept up the pace with the
+ producer.
+
+ At the end, the producer releases a byte using the \c usedBytes
+ semaphore. The "free" byte has successfully been transformed into
+ a "used" byte, ready to be read by the consumer.
+
+ \section1 Consumer Class
+
+ Let's now turn to the \c Consumer class:
+
+ \snippet examples/threads/semaphores/semaphores.cpp 3
+ \snippet examples/threads/semaphores/semaphores.cpp 4
+
+ The code is very similar to the producer, except that this time
+ we acquire a "used" byte and release a "free" byte, instead of
+ the opposite.
+
+ \section1 The main() Function
+
+ In \c main(), we create the two threads and call QThread::wait()
+ to ensure that both threads get time to finish before we exit:
+
+ \snippet examples/threads/semaphores/semaphores.cpp 5
+ \snippet examples/threads/semaphores/semaphores.cpp 6
+
+ So what happens when we run the program? Initially, the producer
+ thread is the only one that can do anything; the consumer is
+ blocked waiting for the \c usedBytes semaphore to be released (its
+ initial \l{QSemaphore::available()}{available()} count is 0).
+ Once the producer has put one byte in the buffer,
+ \c{freeBytes.available()} is \c BufferSize - 1 and
+ \c{usedBytes.available()} is 1. At that point, two things can
+ happen: Either the consumer thread takes over and reads that
+ byte, or the consumer gets to produce a second byte.
+
+ The producer-consumer model presented in this example makes it
+ possible to write highly concurrent multithreaded applications.
+ On a multiprocessor machine, the program is potentially up to
+ twice as fast as the equivalent mutex-based program, since the
+ two threads can be active at the same time on different parts of
+ the buffer.
+
+ Be aware though that these benefits aren't always realized.
+ Acquiring and releasing a QSemaphore has a cost. In practice, it
+ would probably be worthwhile to divide the buffer into chunks and
+ to operate on chunks instead of individual bytes. The buffer size
+ is also a parameter that must be selected carefully, based on
+ experimentation.
+*/
diff --git a/doc/src/examples/settingseditor.qdoc b/doc/src/examples/settingseditor.qdoc
new file mode 100644
index 0000000..5ce1e49
--- /dev/null
+++ b/doc/src/examples/settingseditor.qdoc
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/settingseditor
+ \title Settings Editor Example
+
+ The Settings Editor example shows how Qt's standard settings support is used in an
+ application by providing an editor that enables the user to view the settings for
+ installed applications, and modify those that can be edited.
+
+ \image settingseditor-example.png
+*/
diff --git a/doc/src/examples/shapedclock.qdoc b/doc/src/examples/shapedclock.qdoc
new file mode 100644
index 0000000..369553b
--- /dev/null
+++ b/doc/src/examples/shapedclock.qdoc
@@ -0,0 +1,145 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/shapedclock
+ \title Shaped Clock Example
+
+ The Shaped Clock example shows how to apply a widget mask to a top-level
+ widget to produce a shaped window.
+
+ \image shapedclock-example.png
+
+ Widget masks are used to customize the shapes of top-level widgets by restricting
+ the available area for painting. On some window systems, setting certain window flags
+ will cause the window decoration (title bar, window frame, buttons) to be disabled,
+ allowing specially-shaped windows to be created. In this example, we use this feature
+ to create a circular window containing an analog clock.
+
+ Since this example's window does not provide a \gui File menu or a close
+ button, we provide a context menu with an \gui Exit entry so that the example
+ can be closed. Click the right mouse button over the window to open this menu.
+
+ \section1 ShapedClock Class Definition
+
+ The \c ShapedClock class is based on the \c AnalogClock class defined in the
+ \l{Analog Clock Example}{Analog Clock} example. The whole class definition is
+ presented below:
+
+ \snippet examples/widgets/shapedclock/shapedclock.h 0
+
+ The \l{QWidget::paintEvent()}{paintEvent()} implementation is the same as that found
+ in the \c AnalogClock class. We implement \l{QWidget::sizeHint()}{sizeHint()}
+ so that we don't have to resize the widget explicitly. We also provide an event
+ handler for resize events. This allows us to update the mask if the clock is resized.
+
+ Since the window containing the clock widget will have no title bar, we provide
+ implementations for \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()} and
+ \l{QWidget::mousePressEvent()}{mousePressEvent()} to allow the clock to be dragged
+ around the screen. The \c dragPosition variable lets us keep track of where the user
+ last clicked on the widget.
+
+ \section1 ShapedClock Class Implementation
+
+ The \c ShapedClock constructor performs many of the same tasks as the \c AnalogClock
+ constructor. We set up a timer and connect it to the widget's update() slot:
+
+ \snippet examples/widgets/shapedclock/shapedclock.cpp 0
+
+ We inform the window manager that the widget is not to be decorated with a window
+ frame by setting the Qt::FramelessWindowHint flag on the widget. As a result, we need
+ to provide a way for the user to move the clock around the screen.
+
+ Mouse button events are delivered to the \c mousePressEvent() handler:
+
+ \snippet examples/widgets/shapedclock/shapedclock.cpp 1
+
+ If the left mouse button is pressed over the widget, we record the displacement in
+ global (screen) coordinates between the top-left position of the widget's frame (even
+ when hidden) and the point where the mouse click occurred. This displacement will be
+ used if the user moves the mouse while holding down the left button. Since we acted
+ on the event, we accept it by calling its \l{QEvent::accept()}{accept()} function.
+
+ \image shapedclock-dragging.png
+
+ The \c mouseMoveEvent() handler is called if the mouse is moved over the widget.
+
+ \snippet examples/widgets/shapedclock/shapedclock.cpp 2
+
+ If the left button is held down while the mouse is moved, the top-left corner of the
+ widget is moved to the point given by subtracting the \c dragPosition from the current
+ cursor position in global coordinates. If we drag the widget, we also accept the event.
+
+ The \c paintEvent() function is given for completeness. See the
+ \l{Analog Clock Example}{Analog Clock} example for a description of the process used
+ to render the clock.
+
+ \snippet examples/widgets/shapedclock/shapedclock.cpp 3
+
+ In the \c resizeEvent() handler, we re-use some of the code from the \c paintEvent()
+ to determine the region of the widget that is visible to the user:
+
+ \snippet examples/widgets/shapedclock/shapedclock.cpp 4
+
+ Since the clock face is a circle drawn in the center of the widget, this is the region
+ we use as the mask.
+
+ Although the lack of a window frame may make it difficult for the user to resize the
+ widget on some platforms, it will not necessarily be impossible. The \c resizeEvent()
+ function ensures that the widget mask will always be updated if the widget's dimensions
+ change, and additionally ensures that it will be set up correctly when the widget is
+ first displayed.
+
+ Finally, we implement the \c sizeHint() for the widget so that it is given a reasonable
+ default size when it is first shown:
+
+ \snippet examples/widgets/shapedclock/shapedclock.cpp 5
+
+ \section1 Notes on Widget Masks
+
+ Since QRegion allows arbitrarily complex regions to be created, widget masks can be
+ made to suit the most unconventionally-shaped windows, and even allow widgets to be
+ displayed with holes in them.
+
+ Widget masks can also be constructed by using the contents of pixmap to define the
+ opaque part of the widget. For a pixmap with an alpha channel, a suitable mask can be
+ obtained with QPixmap::mask().
+*/
diff --git a/doc/src/examples/sharedmemory.qdoc b/doc/src/examples/sharedmemory.qdoc
new file mode 100644
index 0000000..f323977
--- /dev/null
+++ b/doc/src/examples/sharedmemory.qdoc
@@ -0,0 +1,142 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example ipc/sharedmemory
+ \title Shared Memory Example
+
+ The Shared Memory example shows how to use the QSharedMemory class
+ to implement inter-process communication using shared memory. To
+ build the example, run make. To run the example, start two instances
+ of the executable. The main() function creates an \l {QApplication}
+ {application} and an instance of our example's Dialog class. The
+ dialog is displayed and then control is passed to the application in
+ the standard way.
+
+ \snippet examples/ipc/sharedmemory/main.cpp 0
+
+ Two instances of class Dialog appear.
+
+ \image sharedmemory-example_1.png Screenshot of the Shared Memory example
+
+ Class Dialog inherits QDialog. It encapsulates the user interface
+ and an instance of QSharedMemory. It also has two public slots,
+ loadFromFile() and loadFromMemory() that correspond to the two
+ buttons on the dialog.
+
+ \snippet examples/ipc/sharedmemory/dialog.h 0
+
+ The constructor builds the user interface widgets and connects the
+ clicked() signal of each button to the corresponding slot function.
+
+ \snippet examples/ipc/sharedmemory/dialog.cpp 0
+
+ Note that "QSharedMemoryExample" is passed to the \l {QSharedMemory}
+ {QSharedMemory()} constructor to be used as the key. This will be
+ used by the system as the identifier of the underlying shared memory
+ segment.
+
+ Click the \tt {Load Image From File...} button on one of the
+ dialogs. The loadFromFile() slot is invoked. First, it tests whether
+ a shared memory segment is already attached to the process. If so,
+ that segment is detached from the process, so we can be assured of
+ starting off the example correctly.
+
+ \snippet examples/ipc/sharedmemory/dialog.cpp 1
+
+ The user is then asked to select an image file using
+ QFileDialog::getOpenFileName(). The selected file is loaded into a
+ QImage. Using a QImage lets us ensure that the selected file is a
+ valid image, and it also allows us to immediately display the image
+ in the dialog using setPixmap().
+
+ Next the image is streamed into a QBuffer using a QDataStream. This
+ gives us the size, which we then use to \l {QSharedMemory::}
+ {create()} our shared memory segment. Creating a shared memory
+ segment automatically \l {QSharedMemory::attach()} {attaches} the
+ segment to the process. Using a QBuffer here lets us get a pointer
+ to the image data, which we then use to do a memcopy() from the
+ QBuffer into the shared memory segment.
+
+ \snippet examples/ipc/sharedmemory/dialog.cpp 2
+
+ Note that we \l {QSharedMemory::} {lock()} the shared memory segment
+ before we copy into it, and we \l {QSharedMemory::} {unlock()} it
+ again immediately after the copy. This ensures we have exclusive
+ access to the shared memory segment to do our memcopy(). If some
+ other process has the segment lock, then our process will block
+ until the lock becomes available.
+
+ Note also that the function does not \l {QSharedMemory::} {detach()}
+ from the shared memory segment after the memcopy() and
+ unlock(). Recall that when the last process detaches from a shared
+ memory segment, the segment is released by the operating
+ system. Since this process only one that is attached to the shared
+ memory segment at the moment, if loadFromFile() detached from the
+ shared memory segment, the segment would be destroyed before we get
+ to the next step.
+
+ When the function returns, if the file you selected was qt.png, your
+ first dialog looks like this.
+
+ \image sharedmemory-example_2.png Screenshot of the Shared Memory example
+
+ In the second dialog, click the \tt {Display Image From Shared
+ Memory} button. The loadFromMemory() slot is invoked. It first \l
+ {QSharedMemory::attach()} {attaches} the process to the same shared
+ memory segment created by the first process. Then it \l
+ {QSharedMemory::lock()} {locks} the segment for exclusive access and
+ links a QBuffer to the image data in the shared memory segment. It
+ then streams the data into a QImage and \l {QSharedMemory::unlock()}
+ {unlocks} the segment.
+
+ \snippet examples/ipc/sharedmemory/dialog.cpp 3
+
+ In this case, the function does \l {QSharedMemory::} {detach()} from
+ the segment, because now we are effectively finished using
+ it. Finally, the QImage is displayed. At this point, both dialogs
+ should be showing the same image. When you close the first dialog,
+ the Dialog destructor calls the QSharedMemory destructor, which
+ detaches from the shared memory segment. Since this is the last
+ process to be detached from the segment, the operating system will
+ now release the shared memory.
+
+ */
diff --git a/doc/src/examples/simpledecoration.qdoc b/doc/src/examples/simpledecoration.qdoc
new file mode 100644
index 0000000..fe8700a
--- /dev/null
+++ b/doc/src/examples/simpledecoration.qdoc
@@ -0,0 +1,266 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qws/simpledecoration
+ \title Simple Decoration Example
+ \ingroup qt-embedded
+
+ The Simple Decoration example shows how to create a custom window decoration
+ for embedded applications.
+
+ \image embedded-simpledecoration-example.png
+
+ By default, Qt for Embedded Linux applications display windows with one of
+ the standard window decorations provided by Qt which are perfectly suitable
+ for many situations. Nonetheless, for certain applications and devices, it
+ is necessary to provide custom window decorations.
+
+ In this document, we examine the fundamental features of custom window
+ decorations, and create a simple decoration as an example.
+
+ \section1 Styles and Window Decorations
+
+ On many platforms, the style used for the contents of a window (including
+ scroll bars) and the style used for the window decorations (the title bar,
+ window borders, close, maximize and other buttons) are handled differently.
+ This is usually because each application is responsible for rendering the
+ contents of its own windows and the window manager renders the window
+ decorations.
+
+ Although the situation is not quite like this on Qt for Embedded Linux
+ because QApplication automatically handles window decorations as well,
+ there are still two style mechanisms at work: QStyle and its associated
+ classes are responsible for rendering widgets and subclasses of QDecoration
+ are responsible for rendering window decorations.
+
+ \image embedded-simpledecoration-example-styles.png
+
+ Three decorations are provided with Qt for Embedded Linux: \e default is
+ a basic style, \e windows resembles the classic Windows look and feel,
+ and \e styled uses the QStyle classes for QMdiSubWindow to draw window
+ decorations. Of these, \e styled is the most useful if you want to impose
+ a consistent look and feel, but the window decorations may be too large
+ for some use cases.
+
+ If none of these built-in decorations are suitable, a custom style can
+ easily be created and used. To do this, we simply need to create a
+ subclass of QDecorationDefault and apply it to a QApplication instance
+ in a running application.
+
+ \section1 MyDecoration Class Definition
+
+ The \c MyDecoration class is a subclass of QDecorationDefault, a subclass
+ of QDecoration that provides reasonable default behavior for a decoration:
+
+ \snippet examples/qws/simpledecoration/mydecoration.h decoration class definition
+
+ We only need to implement a constructor and reimplement the
+ \l{QDecorationDefault::}{region()} and \l{QDecorationDefault::}{paint()}
+ functions to provide our own custom appearance for window decorations.
+
+ To make things fairly general, we provide a number of private variables
+ to hold parameters which control certain aspects of the decoration's
+ appearance. We also define some data structures that we will use to
+ relate buttons in the window decorations to regions.
+
+ \section1 MyDecoration Class Implementation
+
+ In the constructor of the \c MyDecoration class, we set up some default
+ values for the decoration, specifying a thin window border, a title
+ bar that is just taller than the buttons it will hold, and we create a
+ list of buttons that we support:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp constructor start
+
+ We map each of these Qt::WindowFlags to QDecoration::DecorationRegion
+ enum values to help with the implementation of the
+ \l{#Finding Regions}{region() function implementation}.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp map window flags to decoration regions
+
+ In this decoration, we implement the buttons used in the decoration as
+ pixmaps. To help us relate regions of the window to these, we define
+ mappings between each \l{QDecoration::}{DecorationRegion} and its
+ corresponding pixmap for two situations: when a window is shown normally
+ and when it has been maximized. This is purely for cosmetic purposes.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp map decoration regions to pixmaps
+
+ We finish the constructor by defining the regions for buttons that we
+ understand. This will be useful when we are asked to give regions for
+ window decoration buttons.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp constructor end
+
+ \section2 Finding Regions
+
+ Each decoration needs to be able to describe the regions used for parts
+ of the window furniture, such as the close button, window borders and
+ title bar. We reimplement the \l{QDecorationDefault::}{region()} function
+ to do this for our decoration. This function returns a QRegion object
+ that describes an arbitrarily-shaped region of the screen that can itself
+ be made up of several distinct areas.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp region start
+
+ The function is called for a given \e widget, occupying a region specified
+ by \e insideRect, and is expected to return a region for the collection of
+ \l{QDecoration::}{DecorationRegion} enum values supplied in the
+ \e decorationRegion parameter.
+
+ We begin by figuring out how much space in the decoration we will need to
+ allocate for buttons, and where to place them:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp calculate the positions of buttons based on the window flags used
+
+ In a more sophisticated implementation, we might test the \e decorationRegion
+ supplied for regions related to buttons and the title bar, and only perform
+ this space allocation if asked for regions related to these.
+
+ We also use the information about the area occupied by buttons to determine
+ how large an area we can use for the window title:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp calculate the extent of the title
+
+ With these basic calculations done, we can start to compose a region, first
+ checking whether we have been asked for all of the window, and we return
+ immediately if so.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp check for all regions
+
+ We examine each decoration region in turn, adding the corresponding region
+ to the \c region object created earlier. We take care to avoid "off by one"
+ errors in the coordinate calculations.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp compose a region based on the decorations specified
+
+ Unlike the window borders and title bar, the regions occupied by buttons
+ many of the window decorations do not occupy fixed places in the window.
+ Instead, their locations depend on which other buttons are present.
+ We only add regions for buttons we can handle (defined in the \c stateRegions)
+ member variable, and only for those that are present (defined in the
+ \c buttons hash).
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp add a region for each button only if it is present
+
+ The fully composed region can then be returned:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp region end
+
+ The information returned by this function is used when the decoration is
+ painted. Ideally, this function should be implemented to perform all the
+ calculations necessary to place elements of the decoration; this makes
+ the implementation of the \c paint() function much easier.
+
+ \section2 Painting the Decoration
+
+ The \c paint() function is responsible for drawing each window element
+ for a given widget. Information about the decoration region, its state
+ and the widget itself is provided along with a QPainter object to use.
+
+ The first check we make is for a call with no regions:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp paint start
+
+ We return false to indicate that we have not painted anything. If we paint
+ something, we must return true so that the window can be composed, if
+ necessary.
+
+ Just as with the \c region() function, we test the decoration region to
+ determine which elements need to be drawn. If we paint anything, we set
+ the \c handled variable to true so that we can return the correct value
+ when we have finished.
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp paint different regions
+
+ Note that we use our own \c region() implementation to determine where
+ to draw decorations.
+
+ Since the \c region() function performs calculations to place buttons, we
+ can simply test the window flags against the buttons we support (using the
+ \c buttonHintMap defined in the constructor), and draw each button in the
+ relevant region:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp paint buttons
+
+ Finally, we return the value of \c handled to indicate whether any painting
+ was performed:
+
+ \snippet examples/qws/simpledecoration/mydecoration.cpp paint end
+
+ We now have a decoration class that we can use in an application.
+
+ \section1 Using the Decoration
+
+ In the \c main.cpp file, we set up the application as usual, but we also
+ create an instance of our decoration and set it as the standard decoration
+ for the application:
+
+ \snippet examples/qws/simpledecoration/main.cpp create application
+
+ This causes all windows opened by this application to use our decoration.
+ To demonstrate this, we show the analog clock widget from the
+ \l{Analog Clock Example}, which we build into the application:
+
+ \snippet examples/qws/simpledecoration/main.cpp start application
+
+ The application can be run either
+ \l{Running Qt for Embedded Linux Applications}{as a server or a client
+ application}. In both cases, it will use our decoration rather than the
+ default one provided with Qt.
+
+ \section1 Notes
+
+ This example does not cache any information about the state or buttons
+ used for each window. This means that the \c region() function calculates
+ the locations and regions of buttons in cases where it could re-use
+ existing information.
+
+ If you run the application as a window server, you may expect client
+ applications to use our decoration in preference to the default Qt
+ decoration. However, it is up to each application to draw its own
+ decoration, so this will not happen automatically. One way to achieve
+ this is to compile the decoration with each application that needs it;
+ another way is to build the decoration as a plugin, using the
+ QDecorationPlugin class, and load it into the server and client
+ applications.
+*/
diff --git a/doc/src/examples/simpledommodel.qdoc b/doc/src/examples/simpledommodel.qdoc
new file mode 100644
index 0000000..8d2d102
--- /dev/null
+++ b/doc/src/examples/simpledommodel.qdoc
@@ -0,0 +1,294 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/simpledommodel
+ \title Simple DOM Model Example
+
+ The Simple DOM Model example shows how an existing class can be adapted for use with
+ the model/view framework.
+
+ \image simpledommodel-example.png
+
+ Qt provides two complementary sets of classes for reading XML files: The classes based
+ around QXmlReader provide a SAX-style API for incremental reading of large files, and
+ the classes based around QDomDocument enable developers to access the contents of XML
+ files using a Document Object Model (DOM) API.
+
+ In this example, we create a model that uses the DOM API to expose the structure and
+ contents of XML documents to views via the standard QAbstractModel interface.
+
+ \section1 Design and Concepts
+
+ Reading an XML document with Qt's DOM classes is a straightforward process. Typically,
+ the contents of a file are supplied to QDomDocument, and nodes are accessed using the
+ functions provided by QDomNode and its subclasses.
+
+ \omit
+ For example, the following code
+ snippet reads the contents of a file into a QDomDocument object and traverses the
+ document, reading all the plain text that can be found:
+
+ \snippet doc/src/snippets/code/doc_src_examples_simpledommodel.qdoc 0
+
+ In principle, the functions provided by QDomNode can be used to navigate from any
+ given starting point in a document to the piece of data requested by another component.
+ Since QDomDocument maintains information about the structure of a document, we can
+ use this to implement the required virtual functions in a QAbstractItemModel subclass.
+ \endomit
+
+ The aim is to use the structure provided by QDomDocument by wrapping QDomNode objects
+ in item objects similar to the \c TreeItem objects used in the
+ \l{Simple Tree Model Example}{Simple Tree Model} example.
+
+ \section1 DomModel Class Definition
+
+ Let us begin by examining the \c DomModel class:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.h 0
+
+ The class definition contains all the basic functions that are needed for a
+ read-only model. Only the constructor and \c document() function are specific to
+ this model. The private \c domDocument variable is used to hold the document
+ that is exposed by the model; the \c rootItem variable contains a pointer to
+ the root item in the model.
+
+ \section1 DomItem Class Definition
+
+ The \c DomItem class is used to hold information about a specific QDomNode in
+ the document:
+
+ \snippet examples/itemviews/simpledommodel/domitem.h 0
+
+ Each \c DomItem provides a wrapper for a QDomNode obtained from the underlying
+ document which contains a reference to the node, it's location in the parent node's
+ list of child nodes, and a pointer to a parent wrapper item.
+
+ The \c parent(), \c child(), and \c row() functions are convenience functions for
+ the \c DomModel to use that provide basic information about the item to be discovered
+ quickly. The node() function provides access to the underlying QDomNode object.
+
+ As well as the information supplied in the constructor, the class maintains a cache
+ of information about any child items. This is used to provide a collection of
+ persistent item objects that the model can identify consistently and improve the
+ performance of the model when accessing child items.
+
+ \section1 DomItem Class Implementation
+
+ Since the \c DomItem class is only a thin wrapper around QDomNode objects, with a
+ few additional features to help improve performance and memory usage, we can provide
+ a brief outline of the class before discussing the model itself.
+
+ The constructor simply records details of the QDomNode that needs to be wrapped:
+
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 0
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 1
+
+ As a result, functions to provide the parent wrapper, the row number occupied by
+ the item in its parent's list of children, and the underlying QDomNode for each item
+ are straightforward to write:
+
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 4
+ \codeline
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 6
+ \codeline
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 3
+
+ It is necessary to maintain a collection of items which can be consistently identified
+ by the model. For that reason, we maintain a hash of child wrapper items that, to
+ minimize memory usage, is initially empty. The model uses the item's \c child()
+ function to help create model indexes, and this constructs wrappers for the children
+ of the item's QDomNode, relating the row number of each child to the newly-constructed
+ wrapper:
+
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 5
+
+ If a QDomNode was previously wrapped, the cached wrapper is returned; otherwise, a
+ new wrapper is constructed and stored for valid children, and zero is returned for
+ invalid ones.
+
+ The class's destructor deletes all the child items of the wrapper:
+
+ \snippet examples/itemviews/simpledommodel/domitem.cpp 2
+
+ These, in turn, will delete their children and free any QDomNode objects in use.
+
+ \section1 DomModel Class Implementation
+
+ The structure provided by the \c DomItem class makes the implementation of \c DomModel
+ similar to the \c TreeModel shown in the
+ \l{Simple Tree Model Example}{Simple Tree Model} example.
+
+ The constructor accepts an existing document and a parent object for the model:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 0
+
+ A shallow copy of the document is stored for future reference, and a root item is
+ created to provide a wrapper around the document. We assign the root item a row
+ number of zero only to be consistent since the root item will have no siblings.
+
+ Since the model only contains information about the root item, the destructor only
+ needs to delete this one item:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 1
+
+ All of the child items in the tree will be deleted by the \c DomItem destructor as
+ their parent items are deleted.
+
+ \section2 Basic Properties of The Model
+
+ Some aspects of the model do not depend on the structure of the underlying document,
+ and these are simple to implement.
+
+ The number of columns exposed by the model is returned by the \c columnCount()
+ function:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 2
+
+ This value is fixed, and does not depend on the location or type of the underlying
+ node in the document. We will use these three columns to display different kinds of
+ data from the underlying document.
+
+ Since we only implement a read-only model, the \c flags() function is straightforward
+ to write:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 5
+
+ Since the model is intended for use in a tree view, the \c headerData() function only
+ provides a horizontal header:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 6
+
+ The model presents the names of nodes in the first column, element attributes in the
+ second, and any node values in the third.
+
+ \section2 Navigating The Document
+
+ The index() function creates a model index for the item with the given row, column,
+ and parent in the model:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 7
+
+ The function first has to relate the parent index to an item that contains a node
+ from the underlying document. If the parent index is invalid, it refers to the root
+ node in the document, so we retrieve the root item that wraps it; otherwise, we
+ obtain a pointer to the relevant item using the QModelIndex::internalPointer()
+ function. We are able to extract a pointer in this way because any valid model index
+ will have been created by this function, and we store pointers to item objects in
+ any new indexes that we create with QAbstractItemModel::createIndex():
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 8
+
+ A child item for the given row is provided by the parent item's \c child() function.
+ If a suitable child item was found then we call
+ \l{QAbstractItemModel::createIndex()}{createIndex()} to produce a model index for the
+ requested row and column, passing a pointer to the child item for it to store
+ internally. If no suitable child item is found, an invalid model index is returned.
+
+ Note that the items themselves maintain ownership of their child items. This means
+ that the model does not need to keep track of the child items that have been created,
+ and can let the items themselves tidy up when they are deleted.
+
+ The number of rows beneath a given item in the model is returned by the \c rowCount()
+ function, and is the number of child nodes contained by the node that corresponds to
+ the specified model index:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 10
+
+ To obtain the relevant node in the underlying document, we access the item via the
+ internal pointer stored in the model index. If an invalid index is supplied, the
+ root item is used instead. We use the item's \c node() function to access the node
+ itself, and simply count the number of child nodes it contains.
+
+ Since the model is used to represent a hierarchical data structure, it needs to
+ provide an implementation for the \c parent() function. This returns a model index
+ that corresponds to the parent of a child model index supplied as its argument:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 9
+
+ For valid indexes other than the index corresponding to the root item, we obtain
+ a pointer to the relevant item using the method described in the \c index() function,
+ and use the item's \c parent() function to obtain a pointer to the parent item.
+
+ If no valid parent item exists, or if the parent item is the root item, we can simply
+ follow convention and return an invalid model index. For all other parent items, we
+ create a model index containing the appropriate row and column numbers, and a pointer
+ to the parent item we just obtained.
+
+ Data is provided by the \c data() function. For simplicity, we only provide data for
+ the \l{Qt::DisplayRole}{display role}, returning an invalid variant for all other
+ requests:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 3
+
+ As before, we obtain an item pointer for the index supplied, and use it to obtain
+ the underlying document node. Depending on the column specified, the data we return
+ is obtained in different ways:
+
+ \snippet examples/itemviews/simpledommodel/dommodel.cpp 4
+
+ For the first column, we return the node's name. For the second column, we read any
+ attributes that the node may have, and return a string that contains a space-separated
+ list of attribute-value assignments. For the third column, we return any value that
+ the node may have; this allows the contents of text nodes to be displayed in a view.
+
+ If data from any other column is requested, an invalid variant is returned.
+
+ \section1 Implementation Notes
+
+ Ideally, we would rely on the structure provided by QDomDocument to help us write
+ the \l{QAbstractItemModel::parent()}{parent()} and
+ \l{QAbstractItemModel::index()}{index()} functions that are required when subclassing
+ QAbstractItemModel. However, since Qt's DOM classes use their own system for
+ dynamically allocating memory for DOM nodes, we cannot guarantee that the QDomNode
+ objects returned for a given piece of information will be the same for subsequent
+ accesses to the document.
+
+ We use item wrappers for each QDomNode to provide consistent pointers that the model
+ can use to navigate the document structure.
+ \omit
+ Since these items contain value references to the QDomNode objects themselves, this
+ has the side effect that the DOM nodes themselves can be used to reliably navigate
+ the document [not sure about this - QDom* may return different QDomNode objects for
+ the same piece of information]. However, this advantage is redundant since we need to
+ use wrapper items to obtain it. [Possible use of QDomNode cache in the model itself.]
+ \endomit
+*/
diff --git a/doc/src/examples/simpletextviewer.qdoc b/doc/src/examples/simpletextviewer.qdoc
new file mode 100644
index 0000000..2a5e45c0
--- /dev/null
+++ b/doc/src/examples/simpletextviewer.qdoc
@@ -0,0 +1,466 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example help/simpletextviewer
+ \title Simple Text Viewer Example
+
+ The Simple Text Viewer example shows how to use \QA as a customized
+ help viewer for your application.
+
+ This is done in two stages. Firstly, documentation is created and \QA
+ is customized; secondly, the functionality to launch and control
+ \QA is added to the application.
+
+ \image simpletextviewer-example.png
+
+ The Simple Text Viewer application lets the user select and view
+ existing files.
+
+ The application provides its own custom documentation that is
+ available from the \gui Help menu in the main window's menu bar
+ or by clicking the \gui Help button in the application's find file
+ dialog.
+
+ The example consists of four classes:
+
+ \list
+ \o \c Assistant provides functionality to launch \QA.
+ \o \c MainWindow is the main application window.
+ \o \c FindFileDialog allows the user to search for
+ files using wildcard matching.
+ \o \c TextEdit provides a rich text browser that makes
+ sure that images referenced in HTML documents are
+ displayed properly.
+ \endlist
+
+ Note that we will only comment on the parts of the implementation
+ that are relevant to the main issue, that is making Qt Assistant
+ act as a customized help viewer for our Simple Text Viewer
+ application.
+
+ \section1 Creating Documentation and Customizing \QA
+
+ How to create the actual documentation in the form of HTML pages is
+ not in the scope of this example. In general, HTML pages can either
+ be written by hand or generated with the help of documentation tools
+ like qdoc or Doxygen. For the purposes of this example we assume that
+ the HTML files have already been created. So, the only thing that
+ remains to be done is to tell \QA how to structure and display the
+ help information.
+
+ \section2 Organizing Documentation for \QA
+
+ Plain HTML files only contain text or documentation about specific topics,
+ but they usually include no information about how several HTML documents
+ relate to each other or in which order they are supposed to be read.
+ What is missing is a table of contents along with an index to access
+ certain help contents quickly, without having to browse through a lot
+ of documents in order to find a piece of information.
+
+ To organize the documentation and make it available for \QA, we have
+ to create a Qt help project (.qhp) file. The first and most important
+ part of the project file is the definition of the namespace. The namespace
+ has to be unique and will be the first part of the page URL in \QA.
+ In addition, we have to set a virtual folder which acts as a common
+ folder for documentation sets. This means, that two documentation sets
+ identified by two different namespaces can cross reference HTML files
+ since those files are in one big virtual folder. However, for this
+ example, we'll only have one documentation set available, so the
+ virtual folder name and functionality are not important.
+
+ \code
+ <?xml version="1.0" encoding="UTF-8"?>
+ <QtHelpProject version="1.0">
+ <namespace>com.trolltech.examples.simpletextviewer</namespace>
+ <virtualFolder>doc</virtualFolder>
+ \endcode
+
+ The next step is to define the filter section. A filter section
+ contains the table of contents, indices and a complete list of
+ all documentation files, and can have any number of filter attributes
+ assigned to it. A filter attribute is an ordinary string which can
+ be freely chosen. Later in \QA, users can then define a custom
+ filter referencing those attributes. If the attributes of a filter
+ section match the attributes of the custom filter the documentation
+ will be shown, otherwise \QA will hide the documentation.
+
+ Again, since we'll only have one documentation set, we do not need
+ the filtering functionality of \QA and can therefore skip the
+ filter attributes.
+
+ Now, we build up the table of contents. An item in the table is
+ defined by the \c section tag which contains the attributes for the
+ item title as well as link to the actual page. Section tags can be
+ nested infinitely, but for practical reasons it is not recommended
+ to nest them deeper than three or four levels. For our example we
+ want to use the following outline for the table of contents:
+
+ \list
+ \o Simple Text Viewer
+ \list
+ \o Find File
+ \list
+ \o File Dialog
+ \o Wildcard Matching
+ \o Browse
+ \endlist
+ \o Open File
+ \endlist
+ \endlist
+
+ In the help project file, the outline is represented by:
+
+ \code
+ <filterSection>
+ <toc>
+ <section title="Simple Text Viewer" ref="index.html">
+ <section title="Find File" ref="./findfile.html">
+ <section title="File Dialog" ref="./filedialog.html"></section>
+ <section title="Wildcard Matching" ref="./wildcardmatching.html"></section>
+ <section title="Browse" ref="./browse.html"></section>
+ </section>
+ <section title="Open File" ref="./openfile.html"></section>
+ </section>
+ </toc>
+ \endcode
+
+ After the table of contents is defined, we will list all index keywords:
+
+ \code
+ <keywords>
+ <keyword name="Display" ref="./index.html"/>
+ <keyword name="Rich text" ref="./index.html"/>
+ <keyword name="Plain text" ref="./index.html"/>
+ <keyword name="Find" ref="./findfile.html"/>
+ <keyword name="File menu" ref="./findfile.html"/>
+ <keyword name="File name" ref="./filedialog.html"/>
+ <keyword name="File dialog" ref="./filedialog.html"/>
+ <keyword name="File globbing" ref="./wildcardmatching.html"/>
+ <keyword name="Wildcard matching" ref="./wildcardmatching.html"/>
+ <keyword name="Wildcard syntax" ref="./wildcardmatching.html"/>
+ <keyword name="Browse" ref="./browse.html"/>
+ <keyword name="Directory" ref="./browse.html"/>
+ <keyword name="Open" ref="./openfile.html"/>
+ <keyword name="Select" ref="./openfile.html"/>
+ </keywords>
+ \endcode
+
+ As the last step, we have to list all files making up the documentation.
+ An important point to note here is that all files have to listed, including
+ image files, and even stylesheets if they are used.
+
+ \code
+ <files>
+ <file>browse.html</file>
+ <file>filedialog.html</file>
+ <file>findfile.html</file>
+ <file>index.html</file>
+ <file>intro.html</file>
+ <file>openfile.html</file>
+ <file>wildcardmatching.html</file>
+ <file>images/browse.png</file>
+ <file>images/fadedfilemenu.png</file>
+ <file>images/filedialog.png</file>
+ <file>images/handbook.png</file>
+ <file>images/mainwindow.png</file>
+ <file>images/open.png</file>
+ <file>images/wildcard.png</file>
+ </files>
+ </filterSection>
+ </QtHelpProject>
+ \endcode
+
+ The help project file is now finished. If you want to see the resulting
+ documentation in \QA, you have to generate a Qt compressed help file
+ out of it and register it with the default help collection of \QA.
+
+ \code
+ qhelpgenerator simpletextviewer.qhp -o simpletextviewer.qch
+ assistant -register simpletextviewer.qch
+ \endcode
+
+ If you start \QA now, you'll see the Simple Text Viewer documentation
+ beside the Qt documentation. This is OK for testing purposes, but
+ for the final version we want to only have the Simple Text Viewer
+ documentation in \QA.
+
+ \section2 Customizing \QA
+
+ The easiest way to make \QA only display the Simple Text Viewer
+ documentation is to create our own help collection file. A collection
+ file is stored in a binary format, similar to the compressed help file,
+ and generated from a help collection project file (*.qhcp). With
+ the help of a collection file, we can customize the appearance and even
+ some functionality offered by \QA.
+
+ At first, we change the window title and icon. Instead of showing "\QA"
+ it will show "Simple Text Viewer", so it is much clearer for the user
+ that the help viewer actually belongs to our application.
+
+ \code
+ <?xml version="1.0" encoding="UTF-8"?>
+ <QHelpCollectionProject version="1.0">
+ <assistant>
+ <title>Simple Text Viewer</title>
+ <applicationIcon>images/handbook.png</applicationIcon>
+ <cacheDirectory>Trolltech/SimpleTextViewer</cacheDirectory>
+ \endcode
+
+ The \c cacheDirectory tag specifies a subdirectory of the users
+ data directory (see the
+ \l{Using Qt Assistant as a Custom Help Viewer#Qt Help Collection Files}{Qt Help Collection Files})
+ where the cache file for the full text search or the settings file will
+ be stored.
+
+ After this, we set the page displayed by \QA when launched for the very
+ first time in its new configuration. The URL consists of the namespace
+ and virtual folder defined in the Qt help project file, followed by the
+ actual page file name.
+
+ \code
+ <startPage>qthelp://com.trolltech.examples.simpletextviewer/doc/index.html</startPage>
+ \endcode
+
+ Next, we alter the name of the "About" menu item to "About Simple
+ Text Viewer". The contents of the \gui{About} dialog are also changed
+ by specifying a file where the about text or icon is taken from.
+
+ \code
+ <aboutMenuText>
+ <text>About Simple Text Viewer</text>
+ </aboutMenuText>
+ <aboutDialog>
+ <file>about.txt</file>
+ <icon>images/icon.png</icon>
+ </aboutDialog>
+ \endcode
+
+ \QA offers the possibility to add or remove documentation via its
+ preferences dialog. This functionality is helpful when using \QA
+ as the central help viewer for more applications, but in our case
+ we want to actually prevent the user from removing the documentation.
+ So, we disable the documentation manager.
+
+ Since the address bar is not really relevant in such a small
+ documentation set we switch it off as well. By having just one filter
+ section, without any filter attributes, we can also disable the filter
+ functionality of \QA, which means that the filter page and the filter
+ toolbar will not be available.
+
+ \code
+ <enableDocumentationManager>false</enableDocumentationManager>
+ <enableAddressBar>false</enableAddressBar>
+ <enableFilterFunctionality>false</enableFilterFunctionality>
+ </assistant>
+ \endcode
+
+ For testing purposes, we already generated the compressed help file
+ and registered it with \QA's default help collection. With the
+ following lines we achieve the same result. The only and important
+ difference is that we register the compressed help file, not in
+ the default collection, but in our own collection file.
+
+ \code
+ <docFiles>
+ <generate>
+ <file>
+ <input>simpletextviewer.qhp</input>
+ <output>simpletextviewer.qch</output>
+ </file>
+ </generate>
+ <register>
+ <file>simpletextviewer.qch</file>
+ </register>
+ </docFiles>
+ </QHelpCollectionProject>
+ \endcode
+
+ As the last step, we have to generate the binary collection file
+ out of the help collection project file. This is done by running the
+ \c qcollectiongenerator tool.
+
+ \code
+ qcollectiongenerator simpletextviewer.qhcp -o simpletextviewer.qhc
+ \endcode
+
+ To test all our customizations made to \QA, we add the collection
+ file name to the command line:
+
+ \code
+ assistant -collectionFile simpletextviewer.qhc
+ \endcode
+
+ \section1 Controlling \QA via the Assistant Class
+
+ We will first take a look at how to start and operate \QA from a
+ remote application. For that purpose, we create a class called
+ \c Assistant.
+
+ This class provides a public function that is used to show pages
+ of the documentation, and one private helper function to make sure
+ that \QA is up and running.
+
+ Launching \QA is done in the function \c startAssistant() by simply
+ creating and starting a QProcess. If the process is already running,
+ the function returns immediately. Otherwise, the process has
+ to be set up and started.
+
+ \snippet examples/help/simpletextviewer/assistant.cpp 2
+
+ To start the process we need the executable name of \QA as well as the
+ command line arguments for running \QA in a customized mode. The
+ executable name is a little bit tricky since it depends on the
+ platform, but fortunately it is only different on Mac OS X.
+
+ The displayed documentation can be altered using the \c -collectionFile
+ command line argument when launching \QA. When started without any options,
+ \QA displays a default set of documentation. When Qt is installed,
+ the default documentation set in \QA contains the Qt reference
+ documentation as well as the tools that come with Qt, such as Qt
+ Designer and \c qmake.
+
+ In our example, we replace the default documentation set with our
+ custom documentation by passing our application-specific collection
+ file to the process's command line options.
+
+ As the last argument, we add \c -enableRemoteControl, which makes \QA
+ listen to its \c stdin channel for commands, such as those to display
+ a certain page in the documentation.
+ Then we start the process and wait until it is actually running. If,
+ for some reason \QA cannot be started, \c startAssistant() will return
+ false.
+
+ The implementation for \c showDocumentation() is now straightforward.
+ Firstly, we ensure that \QA is running, then we send the request to
+ display the \a page via the \c stdin channel of the process. It is very
+ important here that the command is terminated by the '\\0' character
+ followed by an end of line token to flush the channel.
+
+ \snippet examples/help/simpletextviewer/assistant.cpp 1
+
+ Finally, we make sure that \QA is terminated properly in the case that
+ the application is shut down. The destructor of QProcess kills the
+ process, meaning that the application has no possibility to do things
+ like save user settings, which would result in corrupted settings files.
+ To avoid this, we ask \QA to terminate in the destructor of the
+ \c Assistant class.
+
+ \snippet examples/help/simpletextviewer/assistant.cpp 0
+
+ \section1 MainWindow Class
+
+ \image simpletextviewer-mainwindow.png
+
+ The \c MainWindow class provides the main application window with
+ two menus: the \gui File menu lets the user open and view an
+ existing file, while the \gui Help menu provides information about
+ the application and about Qt, and lets the user open \QA to
+ display the application's documentation.
+
+ To be able to access the help functionality, we initialize the
+ \c Assistant object in the \c MainWindow's constructor.
+
+ \snippet examples/help/simpletextviewer/mainwindow.cpp 0
+ \dots
+ \snippet examples/help/simpletextviewer/mainwindow.cpp 1
+
+ Then we create all the actions for the Simple Text Viewer application.
+ Of special interest is the \c assistantAct action accessible
+ via the \key{F1} shortcut or the \menu{Help|Help Contents} menu item.
+ This action is connected to the \c showDocumentation() slot of
+ the \c MainWindow class.
+
+ \snippet examples/help/simpletextviewer/mainwindow.cpp 4
+ \dots
+ \snippet examples/help/simpletextviewer/mainwindow.cpp 5
+
+ In the \c showDocumentation() slot, we call the \c showDocumentation()
+ function of the \c Assistant class with the URL of home page of the
+ documentation.
+
+ \snippet examples/help/simpletextviewer/mainwindow.cpp 3
+
+ Finally, we must reimplement the protected QWidget::closeEvent()
+ event handler to ensure that the application's \QA instance is
+ properly closed before we terminate the application.
+
+ \snippet examples/help/simpletextviewer/mainwindow.cpp 2
+
+ \section1 FindFileDialog Class
+
+ \image simpletextviewer-findfiledialog.png
+
+ The Simple Text Viewer application provides a find file dialog
+ allowing the user to search for files using wildcard matching. The
+ search is performed within the specified directory, and the user
+ is given an option to browse the existing file system to find the
+ relevant directory.
+
+ In the constructor we save the references to the \c Assistant
+ and \c QTextEdit objects passed as arguments. The \c Assistant
+ object will be used in the \c FindFileDialog's \c help() slot,
+ as we will see shortly, while the QTextEdit will be used in the
+ dialog's \c openFile() slot to display the chosen file.
+
+ \snippet examples/help/simpletextviewer/findfiledialog.cpp 0
+ \dots
+ \snippet examples/help/simpletextviewer/findfiledialog.cpp 1
+
+ The most relevant member to observe in the \c FindFileDialog
+ class is the private \c help() slot. The slot is connected to the
+ dialog's \gui Help button, and brings the current \QA instance
+ to the foreground with the documentation for the dialog by
+ calling \c Assistant's \c showDocumentation() function.
+
+ \snippet examples/help/simpletextviewer/findfiledialog.cpp 2
+
+ \section1 Summary
+
+ In order to make \QA act as a customized help tool for
+ your application, you must provide your application with a
+ process that controls \QA in addition to a custom help collection
+ file including Qt compressed help files.
+
+ The \l{Using Qt Assistant as a Custom Help Viewer} document contains
+ more information about the options and settings available to
+ applications that use \QA as a custom help viewer.
+*/
diff --git a/doc/src/examples/simpletreemodel.qdoc b/doc/src/examples/simpletreemodel.qdoc
new file mode 100644
index 0000000..5ddeb46
--- /dev/null
+++ b/doc/src/examples/simpletreemodel.qdoc
@@ -0,0 +1,346 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/simpletreemodel
+ \title Simple Tree Model Example
+
+ The Simple Tree Model example shows how to create a basic, read-only
+ hierarchical model to use with Qt's standard view classes. For a
+ description of simple non-hierarchical list and table models, see the
+ \l{model-view-programming.html}{Model/View Programming} overview.
+
+ \image simpletreemodel-example.png
+
+ Qt's model/view architecture provides a standard way for views to manipulate
+ information in a data source, using an abstract model of the data to
+ simplify and standardize the way it is accessed. Simple models represent
+ data as a table of items, and allow views to access this data via an
+ \l{model-view-model.html}{index-based} system. More generally, models can
+ be used to represent data in the form of a tree structure by allowing each
+ item to act as a parent to a table of child items.
+
+ Before attempting to implement a tree model, it is worth considering whether
+ the data is supplied by an external source, or whether it is going to be
+ maintained within the model itself. In this example, we will implement an
+ internal structure to hold data rather than discuss how to package data from
+ an external source.
+
+ \section1 Design and Concepts
+
+ The data structure that we use to represent the structure of the data takes
+ the form of a tree built from \c TreeItem objects. Each \c TreeItem
+ represents an item in a tree view, and contains several columns of data.
+
+ \target SimpleTreeModelStructure
+ \table
+ \row \i \inlineimage treemodel-structure.png
+ \i \bold{Simple Tree Model Structure}
+
+ The data is stored internally in the model using \c TreeItem objects that
+ are linked together in a pointer-based tree structure. Generally, each
+ \c TreeItem has a parent item, and can have a number of child items.
+ However, the root item in the tree structure has no parent item and it
+ is never referenced outside the model.
+
+ Each \c TreeItem contains information about its place in the tree
+ structure; it can return its parent item and its row number. Having
+ this information readily available makes implementing the model easier.
+
+ Since each item in a tree view usually contains several columns of data
+ (a title and a summary in this example), it is natural to store this
+ information in each item. For simplicity, we will use a list of QVariant
+ objects to store the data for each column in the item.
+ \endtable
+
+ The use of a pointer-based tree structure means that, when passing a
+ model index to a view, we can record the address of the corresponding
+ item in the index (see QAbstractItemModel::createIndex()) and retrieve
+ it later with QModelIndex::internalPointer(). This makes writing the
+ model easier and ensures that all model indexes that refer to the same
+ item have the same internal data pointer.
+
+ With the appropriate data structure in place, we can create a tree model
+ with a minimal amount of extra code to supply model indexes and data to
+ other components.
+
+ \section1 TreeItem Class Definition
+
+ The \c TreeItem class is defined as follows:
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.h 0
+
+ The class is a basic C++ class. It does not inherit from QObject or
+ provide signals and slots. It is used to hold a list of QVariants,
+ containing column data, and information about its position in the tree
+ structure. The functions provide the following features:
+
+ \list
+ \o The \c appendChildItem() is used to add data when the model is first
+ constructed and is not used during normal use.
+ \o The \c child() and \c childCount() functions allow the model to obtain
+ information about any child items.
+ \o Information about the number of columns associated with the item is
+ provided by \c columnCount(), and the data in each column can be
+ obtained with the data() function.
+ \o The \c row() and \c parent() functions are used to obtain the item's
+ row number and parent item.
+ \endlist
+
+ The parent item and column data are stored in the \c parentItem and
+ \c itemData private member variables. The \c childItems variable contains
+ a list of pointers to the item's own child items.
+
+ \section1 TreeItem Class Implementation
+
+ The constructor is only used to record the item's parent and the data
+ associated with each column.
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 0
+
+ A pointer to each of the child items belonging to this item will be
+ stored in the \c childItems private member variable. When the class's
+ destructor is called, it must delete each of these to ensure that
+ their memory is reused:
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 1
+
+ Since each of the child items are constructed when the model is initially
+ populated with data, the function to add child items is straightforward:
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 2
+
+ Each item is able to return any of its child items when given a suitable
+ row number. For example, in the \l{#SimpleTreeModelStructure}{above diagram},
+ the item marked with the letter "A" corresponds to the child of the root item
+ with \c{row = 0}, the "B" item is a child of the "A" item with \c{row = 1},
+ and the "C" item is a child of the root item with \c{row = 1}.
+
+ The \c child() function returns the child that corresponds to
+ the specified row number in the item's list of child items:
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 3
+
+ The number of child items held can be found with \c childCount():
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 4
+
+ The \c TreeModel uses this function to determine the number of rows that
+ exist for a given parent item.
+
+ The \c row() function reports the item's location within its parent's
+ list of items:
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 8
+
+ Note that, although the root item (with no parent item) is automatically
+ assigned a row number of 0, this information is never used by the model.
+
+ The number of columns of data in the item is trivially returned by the
+ \c columnCount() function.
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 5
+
+ Column data is returned by the \c data() function, taking advantage of
+ QList's ability to provide sensible default values if the column number
+ is out of range:
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 6
+
+ The item's parent is found with \c parent():
+
+ \snippet examples/itemviews/simpletreemodel/treeitem.cpp 7
+
+ Note that, since the root item in the model will not have a parent, this
+ function will return zero in that case. We need to ensure that the model
+ handles this case correctly when we implement the \c TreeModel::parent()
+ function.
+
+ \section1 TreeModel Class Definition
+
+ The \c TreeModel class is defined as follows:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.h 0
+
+ This class is similar to most other subclasses of QAbstractItemModel that
+ provide read-only models. Only the form of the constructor and the
+ \c setupModelData() function are specific to this model. In addition, we
+ provide a destructor to clean up when the model is destroyed.
+
+ \section1 TreeModel Class Implementation
+
+ For simplicity, the model does not allow its data to be edited. As a
+ result, the constructor takes an argument containing the data that the
+ model will share with views and delegates:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 0
+
+ It is up to the constructor to create a root item for the model. This
+ item only contains vertical header data for convenience. We also use it
+ to reference the internal data structure that contains the model data,
+ and it is used to represent an imaginary parent of top-level items in
+ the model.
+
+ The model's internal data structure is populated with items by the
+ \c setupModelData() function. We will examine this function separately
+ at the end of this document.
+
+ The destructor ensures that the root item and all of its descendants
+ are deleted when the model is destroyed:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 1
+
+ Since we cannot add data to the model after it is constructed and set
+ up, this simplifies the way that the internal tree of items is managed.
+
+ Models must implement an \c index() function to provide indexes for
+ views and delegates to use when accessing data. Indexes are created
+ for other components when they are referenced by their row and column
+ numbers, and their parent model index. If an invalid model
+ index is specified as the parent, it is up to the model to return an
+ index that corresponds to a top-level item in the model.
+
+ When supplied with a model index, we first check whether it is valid.
+ If it is not, we assume that a top-level item is being referred to;
+ otherwise, we obtain the data pointer from the model index with its
+ \l{QModelIndex::internalPointer()}{internalPointer()} function and use
+ it to reference a \c TreeItem object. Note that all the model indexes
+ that we construct will contain a pointer to an existing \c TreeItem,
+ so we can guarantee that any valid model indexes that we receive will
+ contain a valid data pointer.
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 6
+
+ Since the row and column arguments to this function refer to a
+ child item of the corresponding parent item, we obtain the item using
+ the \c TreeItem::child() function. The
+ \l{QAbstractItemModel::createIndex()}{createIndex()} function is used
+ to create a model index to be returned. We specify the row and column
+ numbers, and a pointer to the item itself. The model index can be used
+ later to obtain the item's data.
+
+ The way that the \c TreeItem objects are defined makes writing the
+ \c parent() function easy:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 7
+
+ We only need to ensure that we never return a model index corresponding
+ to the root item. To be consistent with the way that the \c index()
+ function is implemented, we return an invalid model index for the
+ parent of any top-level items in the model.
+
+ When creating a model index to return, we must specify the row and
+ column numbers of the parent item within its own parent. We can
+ easily discover the row number with the \c TreeItem::row() function,
+ but we follow a convention of specifying 0 as the column number of
+ the parent. The model index is created with
+ \l{QAbstractItemModel::createIndex()}{createIndex()} in the same way
+ as in the \c index() function.
+
+ The \c rowCount() function simply returns the number of child items
+ for the \c TreeItem that corresponds to a given model index, or the
+ number of top-level items if an invalid index is specified:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 8
+
+ Since each item manages its own column data, the \c columnCount()
+ function has to call the item's own \c columnCount() function to
+ determine how many columns are present for a given model index.
+ As with the \c rowCount() function, if an invalid model index is
+ specified, the number of columns returned is determined from the
+ root item:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 2
+
+ Data is obtained from the model via \c data(). Since the item manages
+ its own columns, we need to use the column number to retrieve the data
+ with the \c TreeItem::data() function:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 3
+
+ Note that we only support the \l{Qt::ItemDataRole}{DisplayRole}
+ in this implementation, and we also return invalid QVariant objects for
+ invalid model indexes.
+
+ We use the \c flags() function to ensure that views know that the
+ model is read-only:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 4
+
+ The \c headerData() function returns data that we conveniently stored
+ in the root item:
+
+ \snippet examples/itemviews/simpletreemodel/treemodel.cpp 5
+
+ This information could have been supplied in a different way: either
+ specified in the constructor, or hard coded into the \c headerData()
+ function.
+
+ \section1 Setting Up the Data in the Model
+
+ We use the \c setupModelData() function to set up the initial data in
+ the model. This function parses a text file, extracting strings of
+ text to use in the model, and creates item objects that record both
+ the data and the overall model structure.
+ Naturally, this function works in a way that is very specific to
+ this model. We provide the following description of its behavior,
+ and refer the reader to the example code itself for more information.
+
+ We begin with a text file in the following format:
+
+ \snippet doc/src/snippets/code/doc_src_examples_simpletreemodel.qdoc 0
+ \dots
+ \snippet doc/src/snippets/code/doc_src_examples_simpletreemodel.qdoc 1
+
+ We process the text file with the following two rules:
+
+ \list
+ \o For each pair of strings on each line, create an item (or node)
+ in a tree structure, and place each string in a column of data
+ in the item.
+ \o When the first string on a line is indented with respect to the
+ first string on the previous line, make the item a child of the
+ previous item created.
+ \endlist
+
+ To ensure that the model works correctly, it is only necessary to
+ create instances of \c TreeItem with the correct data and parent item.
+*/
diff --git a/doc/src/examples/simplewidgetmapper.qdoc b/doc/src/examples/simplewidgetmapper.qdoc
new file mode 100644
index 0000000..2fdbf25
--- /dev/null
+++ b/doc/src/examples/simplewidgetmapper.qdoc
@@ -0,0 +1,139 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/simplewidgetmapper
+ \title Simple Widget Mapper Example
+
+ The Simple Widget Mapper example shows how to use a widget mapper to display
+ data from a model in a collection of widgets.
+
+ \image simplewidgetmapper-example.png
+
+ The QDataWidgetMapper class allows information obtained from a
+ \l{Model Classes}{model} to be viewed and edited in a collection of
+ widgets instead of in an \l{View Classes}{item view}.
+ Any model derived from QAbstractItemModel can be used as the source of
+ data and almost any input widget can be used to display it.
+
+ The example itself is very simple: we create \c Window, a QWidget subclass
+ that we use to hold the widgets used to present the data, and show it. The
+ \c Window class will provide buttons that the user can click to show
+ different records from the model.
+
+ \section1 Window Class Definition
+
+ The class provides a constructor, a slot to keep the buttons up to date,
+ and a private function to set up the model:
+
+ \snippet examples/itemviews/simplewidgetmapper/window.h Window definition
+
+ In addition to the QDataWidgetMapper object and the controls used to make
+ up the user interface, we use a QStandardItemModel to hold our data.
+ We could use a custom model, but this standard implementation is sufficient
+ for our purposes.
+
+ \section1 Window Class Implementation
+
+ The constructor of the \c Window class can be explained in three parts.
+ In the first part, we set up the widgets used for the user interface:
+
+ \snippet examples/itemviews/simplewidgetmapper/window.cpp Set up widgets
+
+ We also set up the buddy relationships between various labels and the
+ corresponding input widgets.
+
+ Next, we set up the widget mapper, relating each input widget to a column
+ in the model specified by the call to \l{QDataWidgetMapper::}{setModel()}:
+
+ \snippet examples/itemviews/simplewidgetmapper/window.cpp Set up the mapper
+
+ We also connect the mapper to the \gui{Next} and \gui{Previous} buttons
+ via its \l{QDataWidgetMapper::}{toNext()} and
+ \l{QDataWidgetMapper::}{toPrevious()} slots. The mapper's
+ \l{QDataWidgetMapper::}{currentIndexChanged()} signal is connected to the
+ \c{updateButtons()} slot in the window which we'll show later.
+
+ In the final part of the constructor, we set up the layout, placing each
+ of the widgets in a grid (we could also use a QFormLayout for this):
+
+ \snippet examples/itemviews/simplewidgetmapper/window.cpp Set up the layout
+
+ Lastly, we set the window title and initialize the mapper by setting it to
+ refer to the first row in the model.
+
+ The model is initialized in the window's \c{setupModel()} function. Here,
+ we create a standard model with 5 rows and 3 columns, and we insert some
+ sample names, addresses and ages into each row:
+
+ \snippet examples/itemviews/simplewidgetmapper/window.cpp Set up the model
+
+ As a result, each row can be treated like a record in a database, and the
+ widget mapper will read the data from each row, using the column numbers
+ specified earlier to access the correct data for each widget. This is
+ shown in the following diagram:
+
+ \image widgetmapper-simple-mapping.png
+
+ Since the user can navigate using the buttons in the user interface, the
+ example is fully-functional at this point, but to make it a bit more
+ user-friendly, we implement the \c{updateButtons()} slot to show when the
+ user is viewing the first or last records:
+
+ \snippet examples/itemviews/simplewidgetmapper/window.cpp Slot for updating the buttons
+
+ If the mapper is referring to the first row in the model, the \gui{Previous}
+ button is disabled. Similarly, the \gui{Next} button is disabled if the
+ mapper reaches the last row in the model.
+
+ \section1 More Complex Mappings
+
+ The QDataWidgetMapper class makes it easy to relate information from a
+ model to widgets in a user interface. However, it is sometimes necessary
+ to use input widgets which offer choices to the user, such as QComboBox,
+ in conjunction with a widget mapper.
+
+ In these situations, although the mapping to input widgets remains simple,
+ more work needs to be done to expose additional data to the widget mapper.
+ This is covered by the \l{Combo Widget Mapper Example}{Combo Widget Mapper}
+ and \l{SQL Widget Mapper Example}{SQL Widget Mapper}
+ examples.
+*/
diff --git a/doc/src/examples/sipdialog.qdoc b/doc/src/examples/sipdialog.qdoc
new file mode 100644
index 0000000..817f5e2
--- /dev/null
+++ b/doc/src/examples/sipdialog.qdoc
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/sipdialog
+ \title SIP Dialog Example
+ \ingroup qtce
+
+ The SIP Dialog example shows how to create a dialog that is aware of
+ the Windows Mobile SIP (Software Input Panel) and reacts to it.
+
+ \table
+ \row \o \inlineimage sipdialog-closed.png
+ \o \inlineimage sipdialog-opened.png
+ \endtable
+
+ Sometimes it is necessary for a dialog to take the SIP into account,
+ as the SIP may hide important input widgets. The SIP Dialog Example
+ shows how a \c Dialog object, \c dialog, can be resized accordingly
+ if the SIP is opened, by embedding the contents of \c dialog in a
+ QScrollArea.
+
+ \section1 Dialog Class Definition
+
+ The \c Dialog class is a subclass of QDialog that implements a public
+ slot, \c desktopResized(), and a public function, \c reactToSIP(). Also,
+ it holds a private instance of QRect, \c desktopGeometry.
+
+ \snippet dialogs/sipdialog/dialog.h Dialog header
+
+ \section1 Dialog Class Implementation
+
+ In the constructor of \c Dialog, we start by obtaining the
+ available geometry of the screen with
+ \l{QDesktopWidget::availableGeometry()}{availableGeometry()}. The
+ parameter used is \c 0 to indicate that we require the primary screen.
+
+ \snippet dialogs/sipdialog/dialog.cpp Dialog constructor part1
+
+ We set the window's title to "SIP Dialog Example" and declare a QScrollArea
+ object, \c scrollArea. Next we instantiate a QGroupBox, \c groupBox, with
+ \c scrollArea as its parent. The title of \c groupBox is also set to
+ "SIP Dialog Example". A QGridLayout object, \c gridLayout, is then used
+ as \c{groupBox}'s layout.
+
+ We create a QLineEdit, a QLabel and a QPushButton and we set the
+ \l{QWidget::setMinimumWidth()}{minimumWidth} property to 220 pixels,
+ respectively.
+
+ \snippet dialogs/sipdialog/dialog.cpp Dialog constructor part2
+
+ Also, all three widgets' text are set accordingly. The
+ \l{QGridLayout::setVerticalSpacing()}{verticalSpacing} property of
+ \c gridLayout is set based on the height of \c desktopGeometry. This
+ is to adapt to the different form factors of Windows Mobile. Then, we
+ add our widgets to the layout.
+
+ \snippet dialogs/sipdialog/dialog.cpp Dialog constructor part3
+
+ The \c{scrollArea}'s widget is set to \c groupBox. We use a QHBoxLayout
+ object, \c layout, to contain \c scrollArea. The \c{Dialog}'s layout
+ is set to \c layout and the scroll area's horizontal scroll bar is turned
+ off.
+
+ \snippet dialogs/sipdialog/dialog.cpp Dialog constructor part4
+
+ The following signals are connected to their respective slots:
+ \list
+ \o \c{button}'s \l{QPushButton::pressed()}{pressed()} signal to
+ \l{QApplication}'s \l{QApplication::closeAllWindows()}
+ {closeAllWindows()} slot,
+ \o \l{QDesktopWidget}'s \l{QDesktopWidget::workAreaResized()}
+ {workAreaResized()} signal to \c{dialog}'s \c desktopResized() slot.
+ \endlist
+
+ \snippet dialogs/sipdialog/dialog.cpp Dialog constructor part5
+
+ The \c desktopResized() function accepts an integer, \a screen,
+ corresponding to the screen's index. We only invoke \c reactToSIP()
+ if \a screen is the primary screen (e.g. index = 0).
+
+ \snippet dialogs/sipdialog/dialog.cpp desktopResized() function
+
+ The \c reactToSIP() function resizes \c dialog accordingly if the
+ desktop's available geometry changed vertically, as this change signifies
+ that the SIP may have been opened or closed.
+
+ \snippet dialogs/sipdialog/dialog.cpp reactToSIP() function
+
+ If the height has decreased, we unset the maximized window state.
+ Otherwise, we set the maximized window state. Lastly, we update
+ \c desktopGeometry to the desktop's available geometry.
+
+ \section1 The \c main() function
+
+ The \c main() function for the SIP Dialog example instantiates \c Dialog
+ and invokes its \l{QDialog::exec()}{exec()} function.
+
+ \snippet dialogs/sipdialog/main.cpp main() function
+
+ \note Although this example uses a dialog, the techniques used here apply to
+ all top-level widgets respectively.
+*/
diff --git a/doc/src/examples/sliders.qdoc b/doc/src/examples/sliders.qdoc
new file mode 100644
index 0000000..650fdcb
--- /dev/null
+++ b/doc/src/examples/sliders.qdoc
@@ -0,0 +1,269 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/sliders
+ \title Sliders Example
+
+ Qt provides three types of slider-like widgets: QSlider,
+ QScrollBar and QDial. They all inherit most of their
+ functionality from QAbstractSlider, and can in theory replace
+ each other in an application since the differences only concern
+ their look and feel. This example shows what they look like, how
+ they work and how their behavior and appearance can be
+ manipulated through their properties.
+
+ The example also demonstrates how signals and slots can be used to
+ synchronize the behavior of two or more widgets.
+
+ \image sliders-example.png Screenshot of the Sliders example
+
+ The Sliders example consists of two classes:
+
+ \list
+
+ \o \c SlidersGroup is a custom widget. It combines a QSlider, a
+ QScrollBar and a QDial.
+
+ \o \c Window is the main widget combining a QGroupBox and a
+ QStackedWidget. In this example, the QStackedWidget provides a
+ stack of two \c SlidersGroup widgets. The QGroupBox contain
+ several widgets that control the behavior of the slider-like
+ widgets.
+
+ \endlist
+
+ First we will review the \c Window class, then we
+ will take a look at the \c SlidersGroup class.
+
+ \section1 Window Class Definition
+
+ \snippet examples/widgets/sliders/window.h 0
+
+ The \c Window class inherits from QWidget. It displays the slider
+ widgets and allows the user to set their minimum, maximum and
+ current values and to customize their appearance, key bindings
+ and orientation. We use a private \c createControls() function to
+ create the widgets that provide these controlling mechanisms and
+ to connect them to the slider widgets.
+
+ \section1 Window Class Implementation
+
+ \snippet examples/widgets/sliders/window.cpp 0
+
+ In the constructor we first create the two \c SlidersGroup
+ widgets that display the slider widgets horizontally and
+ vertically, and add them to the QStackedWidget. QStackedWidget
+ provides a stack of widgets where only the top widget is visible.
+ With \c createControls() we create a connection from a
+ controlling widget to the QStackedWidget, making the user able to
+ choose between horizontal and vertical orientation of the slider
+ widgets. The rest of the controlling mechanisms is implemented by
+ the same function call.
+
+ \snippet examples/widgets/sliders/window.cpp 1
+ \snippet examples/widgets/sliders/window.cpp 2
+
+ Then we connect the \c horizontalSliders, \c verticalSliders and
+ \c valueSpinBox to each other, so that the slider widgets and the
+ control widget will behave synchronized when the current value of
+ one of them changes. The \c valueChanged() signal is emitted with
+ the new value as argument. The \c setValue() slot sets the
+ current value of the widget to the new value, and emits \c
+ valueChanged() if the new value is different from the old one.
+
+ We put the group of control widgets and the stacked widget in a
+ horizontal layout before we initialize the minimum, maximum and
+ current values. The initialization of the current value will
+ propagate to the slider widgets through the connection we made
+ between \c valueSpinBox and the \c SlidersGroup widgets. The
+ minimum and maximum values propagate through the connections we
+ created with \c createControls().
+
+ \snippet examples/widgets/sliders/window.cpp 3
+ \snippet examples/widgets/sliders/window.cpp 4
+
+ In the private \c createControls() function, we let a QGroupBox
+ (\c controlsGroup) display the control widgets. A group box can
+ provide a frame, a title and a keyboard shortcut, and displays
+ various other widgets inside itself. The group of control widgets
+ is composed by two checkboxes, three spin boxes (with labels) and
+ one combobox.
+
+ After creating the labels, we create the two checkboxes.
+ Checkboxes are typically used to represent features in an
+ application that can be enabled or disabled. When \c
+ invertedAppearance is enabled, the slider values are inverted.
+ The table below shows the appearance for the different
+ slider-like widgets:
+
+ \table
+ \header \o \o{2,1} QSlider \o{2,1} QScrollBar \o{2,1} QDial
+ \header \o \o Normal \o Inverted \o Normal \o Inverted \o Normal \o Inverted
+ \row \o Qt::Horizontal \o Left to right \o Right to left \o Left to right \o Right to left \o Clockwise \o Counterclockwise
+ \row \o Qt::Vertical \o Bottom to top \o Top to bottom \o Top to bottom \o Bottom to top \o Clockwise \o Counterclockwise
+ \endtable
+
+ It is common to invert the appearance of a vertical QSlider. A
+ vertical slider that controls volume, for example, will typically
+ go from bottom to top (the non-inverted appearance), whereas a
+ vertical slider that controls the position of an object on screen
+ might go from top to bottom, because screen coordinates go from
+ top to bottom.
+
+ When the \c invertedKeyBindings option is enabled (corresponding
+ to the QAbstractSlider::invertedControls property), the slider's
+ wheel and key events are inverted. The normal key bindings mean
+ that scrolling the mouse wheel "up" or using keys like page up
+ will increase the slider's current value towards its maximum.
+ Inverted, the same wheel and key events will move the value
+ toward the slider's minimum. This can be useful if the \e
+ appearance of a slider is inverted: Some users might expect the
+ keys to still work the same way on the value, whereas others
+ might expect \key PageUp to mean "up" on the screen.
+
+ Note that for horizontal and vertical scroll bars, the key
+ bindings are inverted by default: \key PageDown increases the
+ current value, and \key PageUp decreases it.
+
+ \snippet examples/widgets/sliders/window.cpp 5
+ \snippet examples/widgets/sliders/window.cpp 6
+
+ Then we create the spin boxes. QSpinBox allows the user to choose
+ a value by clicking the up and down buttons or pressing the \key
+ Up and \key Down keys on the keyboard to modify the value
+ currently displayed. The user can also type in the value
+ manually. The spin boxes control the minimum, maximum and current
+ values for the QSlider, QScrollBar, and QDial widgets.
+
+ We create a QComboBox that allows the user to choose the
+ orientation of the slider widgets. The QComboBox widget is a
+ combined button and popup list. It provides a means of presenting
+ a list of options to the user in a way that takes up the minimum
+ amount of screen space.
+
+ \snippet examples/widgets/sliders/window.cpp 7
+ \snippet examples/widgets/sliders/window.cpp 8
+
+ We synchronize the behavior of the control widgets and the slider
+ widgets through their signals and slots. We connect each control
+ widget to both the horizontal and vertical group of slider
+ widgets. We also connect \c orientationCombo to the
+ QStackedWidget, so that the correct "page" is shown. Finally, we
+ lay out the control widgets in a QGridLayout within the \c
+ controlsGroup group box.
+
+ \section1 SlidersGroup Class Definition
+
+ \snippet examples/widgets/sliders/slidersgroup.h 0
+
+ The \c SlidersGroup class inherits from QGroupBox. It provides a
+ frame and a title, and contains a QSlider, a QScrollBar and a
+ QDial.
+
+ We provide a \c valueChanged() signal and a public \c setValue()
+ slot with equivalent functionality to the ones in QAbstractSlider
+ and QSpinBox. In addition, we implement several other public
+ slots to set the minimum and maximum value, and invert the slider
+ widgets' appearance as well as key bindings.
+
+ \section1 SlidersGroup Class Implementation
+
+ \snippet examples/widgets/sliders/slidersgroup.cpp 0
+
+ First we create the slider-like widgets with the appropiate
+ properties. In particular we set the focus policy for each
+ widget. Qt::FocusPolicy is an enum type that defines the various
+ policies a widget can have with respect to acquiring keyboard
+ focus. The Qt::StrongFocus policy means that the widget accepts
+ focus by both tabbing and clicking.
+
+ Then we connect the widgets with each other, so that they will
+ stay synchronized when the current value of one of them changes.
+
+ \snippet examples/widgets/sliders/slidersgroup.cpp 1
+ \snippet examples/widgets/sliders/slidersgroup.cpp 2
+
+ We connect \c {dial}'s \c valueChanged() signal to the
+ \c{SlidersGroup}'s \c valueChanged() signal, to notify the other
+ widgets in the application (i.e., the control widgets) of the
+ changed value.
+
+ \snippet examples/widgets/sliders/slidersgroup.cpp 3
+ \codeline
+ \snippet examples/widgets/sliders/slidersgroup.cpp 4
+
+ Finally, depending on the \l {Qt::Orientation}{orientation} given
+ at the time of construction, we choose and create the layout for
+ the slider widgets within the group box.
+
+ \snippet examples/widgets/sliders/slidersgroup.cpp 5
+ \snippet examples/widgets/sliders/slidersgroup.cpp 6
+
+ The \c setValue() slot sets the value of the QSlider. We don't
+ need to explicitly call
+ \l{QAbstractSlider::setValue()}{setValue()} on the QScrollBar and
+ QDial widgets, since QSlider will emit the
+ \l{QAbstractSlider::valueChanged()}{valueChanged()} signal when
+ its value changes, triggering a domino effect.
+
+ \snippet examples/widgets/sliders/slidersgroup.cpp 7
+ \snippet examples/widgets/sliders/slidersgroup.cpp 8
+ \codeline
+ \snippet examples/widgets/sliders/slidersgroup.cpp 9
+ \snippet examples/widgets/sliders/slidersgroup.cpp 10
+
+ The \c setMinimum() and \c setMaximum() slots are used by the \c
+ Window class to set the range of the QSlider, QScrollBar, and
+ QDial widgets.
+
+ \snippet examples/widgets/sliders/slidersgroup.cpp 11
+ \snippet examples/widgets/sliders/slidersgroup.cpp 12
+ \codeline
+ \snippet examples/widgets/sliders/slidersgroup.cpp 13
+ \snippet examples/widgets/sliders/slidersgroup.cpp 14
+
+ The \c invertAppearance() and \c invertKeyBindings() slots
+ control the child widgets'
+ \l{QAbstractSlider::invertedAppearance}{invertedAppearance} and
+ \l{QAbstractSlider::invertedControls}{invertedControls}
+ properties.
+*/
diff --git a/doc/src/examples/spinboxdelegate.qdoc b/doc/src/examples/spinboxdelegate.qdoc
new file mode 100644
index 0000000..542eebd
--- /dev/null
+++ b/doc/src/examples/spinboxdelegate.qdoc
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/spinboxdelegate
+ \title Spin Box Delegate Example
+
+ The Spin Box Delegate example shows how to create an editor for a custom delegate in
+ the model/view framework by reusing a standard Qt editor widget.
+
+ The model/view framework provides a standard delegate that is used by default
+ with the standard view classes. For most purposes, the selection of editor
+ widgets available through this delegate is sufficient for editing text, boolean
+ values, and other simple data types. However, for specific data types, it is
+ sometimes necessary to use a custom delegate to either display the data in a
+ specific way, or allow the user to edit it with a custom control.
+
+ \image spinboxdelegate-example.png
+
+ This concepts behind this example are covered in the
+ \l{model-view-delegate.html}{Delegate Classes} chapter of the
+ \l{model-view-programming.html}{Model/View Programming} overview.
+
+ \section1 SpinBoxDelegate Class Definition
+
+ The definition of the delegate is as follows:
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.h 0
+
+ The delegate class declares only those functions that are needed to
+ create an editor widget, display it at the correct location in a view,
+ and communicate with a model. Custom delegates can also provide their
+ own painting code by reimplementing the \c paintEvent() function.
+
+ \section1 SpinBoxDelegate Class Implementation
+
+ Since the delegate is stateless, the constructor only needs to
+ call the base class's constructor with the parent QObject as its
+ argument:
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 0
+
+ Since the delegate is a subclass of QItemDelegate, the data it retrieves
+ from the model is displayed in a default style, and we do not need to
+ provide a custom \c paintEvent().
+
+ The \c createEditor() function returns an editor widget, in this case a
+ spin box that restricts values from the model to integers from 0 to 100
+ inclusive.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 1
+
+ We install an event filter on the spin box to ensure that it behaves in
+ a way that is consistent with other delegates. The implementation for
+ the event filter is provided by the base class.
+
+ The \c setEditorData() function reads data from the model, converts it
+ to an integer value, and writes it to the editor widget.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 2
+
+ Since the view treats delegates as ordinary QWidget instances, we have
+ to use a static cast before we can set the value in the spin box.
+
+ The \c setModelData() function reads the contents of the spin box, and
+ writes it to the model.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 3
+
+ We call \l{QSpinBox::interpretText()}{interpretText()} to make sure that
+ we obtain the most up-to-date value in the spin box.
+
+ The \c updateEditorGeometry() function updates the editor widget's
+ geometry using the information supplied in the style option. This is the
+ minimum that the delegate must do in this case.
+
+ \snippet examples/itemviews/spinboxdelegate/delegate.cpp 4
+
+ More complex editor widgets may divide the rectangle available in
+ \c{option.rect} between different child widgets if required.
+
+ \section1 The Main Function
+
+ This example is written in a slightly different way to many of the
+ other examples supplied with Qt. To demonstrate the use of a custom
+ editor widget in a standard view, it is necessary to set up a model
+ containing some arbitrary data and a view to display it.
+
+ We set up the application in the normal way, construct a standard item
+ model to hold some data, set up a table view to use the data in the
+ model, and construct a custom delegate to use for editing:
+
+ \snippet examples/itemviews/spinboxdelegate/main.cpp 0
+
+ The table view is informed about the delegate, and will use it to
+ display each of the items. Since the delegate is a subclass of
+ QItemDelegate, each cell in the table will be rendered using standard
+ painting operations.
+
+ We insert some arbitrary data into the model for demonstration purposes:
+
+ \snippet examples/itemviews/spinboxdelegate/main.cpp 1
+ \snippet examples/itemviews/spinboxdelegate/main.cpp 2
+
+ Finally, the table view is displayed with a window title, and we start
+ the application's event loop:
+
+ \snippet examples/itemviews/spinboxdelegate/main.cpp 3
+
+ Each of the cells in the table can now be edited in the usual way, but
+ the spin box ensures that the data returned to the model is always
+ constrained by the values allowed by the spin box delegate.
+*/
diff --git a/doc/src/examples/spinboxes.qdoc b/doc/src/examples/spinboxes.qdoc
new file mode 100644
index 0000000..d8b0daa
--- /dev/null
+++ b/doc/src/examples/spinboxes.qdoc
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/spinboxes
+ \title Spin Boxes Example
+
+ The Spin Boxes example shows how to use the many different types of spin boxes
+ available in Qt, from a simple QSpinBox widget to more complex editors like
+ the QDateTimeEdit widget.
+
+ \image spinboxes-example.png
+
+ The example consists of a single \c Window class that is used to display the
+ different spin box-based widgets available with Qt.
+
+ \section1 Window Class Definition
+
+ The \c Window class inherits QWidget and contains two slots that are used
+ to provide interactive features:
+
+ \snippet examples/widgets/spinboxes/window.h 0
+
+ The private functions are used to set up each type of spin box in the window.
+ We use member variables to keep track of various widgets so that they can
+ be reconfigured when required.
+
+ \section1 Window Class Implementation
+
+ The constructor simply calls private functions to set up the different types
+ of spin box used in the example, and places each group in a layout:
+
+ \snippet examples/widgets/spinboxes/window.cpp 0
+
+ We use the layout to manage the arrangement of the window's child widgets,
+ and change the window title.
+
+ The \c createSpinBoxes() function constructs a QGroupBox and places three
+ QSpinBox widgets inside it with descriptive labels to indicate the types of
+ input they expect.
+
+ \snippet examples/widgets/spinboxes/window.cpp 1
+
+ The first spin box shows the simplest way to use QSpinBox. It accepts values
+ from -20 to 20, the current value can be increased or decreased by 1 with
+ either the arrow buttons or \key{Up} and \key{Down} keys, and the default
+ value is 0.
+
+ The second spin box uses a larger step size and displays a suffix to
+ provide more information about the type of data the number represents:
+
+ \snippet examples/widgets/spinboxes/window.cpp 2
+
+ This spin box also displays a
+ \l{QAbstractSpinBox::specialValueText}{special value} instead of the minimum
+ value defined for it. This means that it will never show \gui{0%}, but will
+ display \gui{Automatic} when the minimum value is selected.
+
+ The third spin box shows how a prefix can be used:
+
+ \snippet examples/widgets/spinboxes/window.cpp 4
+
+ For simplicity, we show a spin box with a prefix and no suffix. It is also
+ possible to use both at the same time.
+
+ \snippet examples/widgets/spinboxes/window.cpp 5
+
+ The rest of the function sets up a layout for the group box and places each
+ of the widgets inside it.
+
+ The \c createDateTimeEdits() function constructs another group box with a
+ selection of spin boxes used for editing dates and times.
+
+ \snippet examples/widgets/spinboxes/window.cpp 6
+
+ The first spin box is a QDateEdit widget that is able to accept dates
+ within a given range specified using QDate values. The arrow buttons and
+ \key{Up} and \key{Down} keys can be used to increase and decrease the
+ values for year, month, and day when the cursor is in the relevant section.
+
+ The second spin box is a QTimeEdit widget:
+
+ \snippet examples/widgets/spinboxes/window.cpp 7
+
+ Acceptable values for the time are defined using QTime values.
+
+ The third spin box is a QDateTimeEdit widget that can display both date and
+ time values, and we place a label above it to indicate the range of allowed
+ times for a meeting. These widgets will be updated when the user changes a
+ format string.
+
+ \snippet examples/widgets/spinboxes/window.cpp 8
+
+ The format string used for the date time editor, which is also shown in the
+ string displayed by the label, is chosen from a set of strings in a combobox:
+
+ \snippet examples/widgets/spinboxes/window.cpp 9
+ \codeline
+ \snippet examples/widgets/spinboxes/window.cpp 10
+
+ A signal from this combobox is connected to a slot in the \c Window class
+ (shown later).
+
+ \snippet examples/widgets/spinboxes/window.cpp 11
+
+ Each child widget of the group box in placed in a layout.
+
+ The \c setFormatString() slot is called whenever the user selects a new
+ format string in the combobox. The display format for the QDateTimeEdit
+ widget is set using the raw string passed by the signal:
+
+ \snippet examples/widgets/spinboxes/window.cpp 12
+
+ Depending on the visible sections in the widget, we set a new date or time
+ range, and update the associated label to provide relevant information for
+ the user:
+
+ \snippet examples/widgets/spinboxes/window.cpp 13
+
+ When the format string is changed, there will be an appropriate label and
+ entry widget for dates, times, or both types of input.
+
+ The \c createDoubleSpinBoxes() function constructs three spin boxes that are
+ used to input double-precision floating point numbers:
+
+ \snippet examples/widgets/spinboxes/window.cpp 14
+
+ Before the QDoubleSpinBox widgets are constructed, we create a spin box to
+ control how many decimal places they show. By default, only two decimal places
+ are shown in the following spin boxes, each of which is the equivalent of a
+ spin box in the group created by the \c createSpinBoxes() function.
+
+ The first double spin box shows a basic double-precision spin box with the
+ same range, step size, and default value as the first spin box in the
+ \c createSpinBoxes() function:
+
+ \snippet examples/widgets/spinboxes/window.cpp 15
+
+ However, this spin box also allows non-integer values to be entered.
+
+ The second spin box displays a suffix and shows a special value instead
+ of the minimum value:
+
+ \snippet examples/widgets/spinboxes/window.cpp 16
+
+ The third spin box displays a prefix instead of a suffix:
+
+ \snippet examples/widgets/spinboxes/window.cpp 17
+
+ We connect the QSpinBox widget that specifies the precision to a slot in
+ the \c Window class.
+
+ \snippet examples/widgets/spinboxes/window.cpp 18
+
+ The rest of the function places each of the widgets into a layout for the
+ group box.
+
+ The \c changePrecision() slot is called when the user changes the value in
+ the precision spin box:
+
+ \snippet examples/widgets/spinboxes/window.cpp 19
+
+ This function simply uses the integer supplied by the signal to specify the
+ number of decimal places in each of the QDoubleSpinBox widgets. Each one
+ of these will be updated automatically when their
+ \l{QDoubleSpinBox::decimals}{decimals} property is changed.
+*/
diff --git a/doc/src/examples/sqlwidgetmapper.qdoc b/doc/src/examples/sqlwidgetmapper.qdoc
new file mode 100644
index 0000000..173aea4
--- /dev/null
+++ b/doc/src/examples/sqlwidgetmapper.qdoc
@@ -0,0 +1,199 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/sqlwidgetmapper
+ \title SQL Widget Mapper Example
+
+ The SQL Widget Mapper example shows how to use a map information from a
+ database to widgets on a form.
+
+ \image sql-widget-mapper.png
+
+ In the \l{Combo Widget Mapper Example}, we showed how to use a named
+ mapping between a widget mapper and a QComboBox widget with a special
+ purpose model to relate values in the model to a list of choices.
+
+ Again, we create a \c Window class with an almost identical user interface,
+ providing a combo box to allow their addresses to be classified as "Home",
+ "Work" or "Other". However, instead of using a separate model to hold these
+ address types, we use one database table to hold the example data and
+ another to hold the address types. In this way, we store all the
+ information in the same place.
+
+ \section1 Window Class Definition
+
+ The class provides a constructor, a slot to keep the buttons up to date,
+ and a private function to set up the model:
+
+ \snippet examples/sql/sqlwidgetmapper/window.h Window definition
+
+ In addition to the QDataWidgetMapper object and the controls used to make
+ up the user interface, we use a QStandardItemModel to hold our data and
+ a QStringListModel to hold information about the types of address that
+ can be applied to each person's data.
+
+ \section1 Window Class Implementation
+
+ The first act performed by the \c Window class constructor is to set up
+ the model used to hold the example data. Since this is a key part of the
+ example, we will look at this first.
+
+ The model is initialized in the window's \c{setupModel()} function. Here,
+ we create a SQLite database containing a "person" table with primary key,
+ name, address and type fields.
+
+ \snippet examples/sql/sqlwidgetmapper/window.cpp Set up the main table
+
+ On each row of the table, we insert default values for these fields,
+ including values for the address types that correspond to the address
+ types are stored in a separate table.
+
+ \image widgetmapper-sql-mapping-table.png
+
+ We create an "addresstype" table containing the identifiers used in the
+ "person" table and the corresponding strings:
+
+ \snippet examples/sql/sqlwidgetmapper/window.cpp Set up the address type table
+
+ The "typeid" field in the "person" table is related to the contents of
+ the "addresstype" table via a relation in a QSqlRelationalTableModel.
+ This kind of model performs all the necessary work to store the data in
+ a database and also allows any relations to be used as models in their
+ own right.
+
+ In this case, we have defined a relation for the "typeid" field in the
+ "person" table that relates it to the "id" field in the "addresstype"
+ table and which causes the contents of the "description" field to be
+ used wherever the "typeid" is presented to the user. (See the
+ QSqlRelationalTableModel::setRelation() documentation for details.)
+
+ \image widgetmapper-sql-mapping.png
+
+ The constructor of the \c Window class can be explained in three parts.
+ In the first part, we set up the model used to hold the data, then we set
+ up the widgets used for the user interface:
+
+ \snippet examples/sql/sqlwidgetmapper/window.cpp Set up widgets
+
+ We obtain a model for the combo box from the main model, based on the
+ relation we set up for the "typeid" field. The call to the combo box's
+ \l{QComboBox::}{setModelColumn()} selects the field in the field in the
+ model to display.
+
+ Note that this approach is similar to the one used in the
+ \l{Combo Widget Mapper Example} in that we set up a model for the
+ combo box. However, in this case, we obtain a model based on a relation
+ in the QSqlRelationalTableModel rather than create a separate one.
+
+ Next, we set up the widget mapper, relating each input widget to a field
+ in the model:
+
+ \snippet examples/sql/sqlwidgetmapper/window.cpp Set up the mapper
+
+ For the combo box, we already know the index of the field in the model
+ from the \c{setupModel()} function. We use a QSqlRelationalDelegate as
+ a proxy between the mapper and the input widgets to match up the "typeid"
+ values in the model with those in the combo box's model and populate the
+ combo box with descriptions rather than integer values.
+
+ As a result, the user is able to select an item from the combo box,
+ and the associated value is written back to the model.
+
+ The rest of the constructor is very similar to that of the
+ \l{Simple Widget Mapper Example}:
+
+ \snippet examples/sql/sqlwidgetmapper/window.cpp Set up connections and layouts
+
+ We show the implementation of the \c{updateButtons()} slot for
+ completeness:
+
+ \snippet examples/sql/sqlwidgetmapper/window.cpp Slot for updating the buttons
+
+ \omit
+ \section1 Delegate Class Definition and Implementation
+
+ The delegate we use to mediate interaction between the widget mapper and
+ the input widgets is a small QItemDelegate subclass:
+
+ \snippet examples/sql/sqlwidgetmapper/delegate.h Delegate class definition
+
+ This provides implementations of the two standard functions used to pass
+ data between editor widgets and the model (see the \l{Delegate Classes}
+ documentation for a more general description of these functions).
+
+ Since we only provide an empty implementation of the constructor, we
+ concentrate on the other two functions.
+
+ The \l{QItemDelegate::}{setEditorData()} implementation takes the data
+ referred to by the model index supplied and processes it according to
+ the presence of a \c currentIndex property in the editor widget:
+
+ \snippet examples/sql/sqlwidgetmapper/delegate.cpp setEditorData implementation
+
+ If, like QComboBox, the editor widget has this property, it is set using
+ the value from the model. Since we are passing around QVariant values,
+ the strings stored in the model are automatically converted to the integer
+ values needed for the \c currentIndex property.
+
+ As a result, instead of showing "0", "1" or "2" in the combo box, one of
+ its predefined set of items is shown. We call QItemDelegate::setEditorData()
+ for widgets without the \c currentIndex property.
+
+ The \l{QItemDelegate::}{setModelData()} implementation performs the reverse
+ process, taking the value stored in the widget's \c currentIndex property
+ and storing it back in the model:
+
+ \snippet examples/sql/sqlwidgetmapper/delegate.cpp setModelData implementation
+ \endomit
+
+ \section1 Summary and Further Reading
+
+ The use of a separate model for the combo box and a special delegate for the
+ widget mapper allows us to present a menu of choices to the user. Although
+ the choices are stored in the same database as the user's data, they are held
+ in a separate table. Using this approach, we can reconstructed complete records
+ at a later time while using database features appropriately.
+
+ If SQL models are not being used, it is still possible to use more than
+ one model to present choices to the user. This is covered by the
+ \l{Combo Widget Mapper Example}.
+*/
diff --git a/doc/src/examples/standarddialogs.qdoc b/doc/src/examples/standarddialogs.qdoc
new file mode 100644
index 0000000..db533ed
--- /dev/null
+++ b/doc/src/examples/standarddialogs.qdoc
@@ -0,0 +1,49 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/standarddialogs
+ \title Standard Dialogs Example
+
+ The Standard Dialogs example shows the standard dialogs that are provided by Qt.
+
+ \image standarddialogs-example.png
+*/
diff --git a/doc/src/examples/stardelegate.qdoc b/doc/src/examples/stardelegate.qdoc
new file mode 100644
index 0000000..fde3316
--- /dev/null
+++ b/doc/src/examples/stardelegate.qdoc
@@ -0,0 +1,310 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example itemviews/stardelegate
+ \title Star Delegate Example
+
+ The Star Delegate example shows how to create a delegate that
+ can paint itself and that supports editing.
+
+ \image stardelegate.png The Star Delegate Example
+
+ When displaying data in a QListView, QTableView, or QTreeView,
+ the individual items are drawn by a
+ \l{Delegate Classes}{delegate}. Also, when the user starts
+ editing an item (e.g., by double-clicking the item), the delegate
+ provides an editor widget that is placed on top of the item while
+ editing takes place.
+
+ Delegates are subclasses of QAbstractItemDelegate. Qt provides
+ QItemDelegate, which inherits QAbstractItemDelegate and handles
+ the most common data types (notably \c int and QString). If we
+ need to support custom data types, or want to customize the
+ rendering or the editing for existing data types, we can subclass
+ QAbstractItemDelegate or QItemDelegate. See \l{Delegate Classes}
+ for more information about delegates, and \l{Model/View
+ Programming} if you need a high-level introduction to Qt's
+ model/view architecture (including delegates).
+
+ In this example, we will see how to implement a custom delegate
+ to render and edit a "star rating" data type, which can store
+ values such as "1 out of 5 stars".
+
+ The example consists of the following classes:
+
+ \list
+ \o \c StarRating is the custom data type. It stores a rating
+ expressed as stars, such as "2 out of 5 stars" or "5 out of
+ 6 stars".
+
+ \o \c StarDelegate inherits QItemDelegate and provides support
+ for \c StarRating (in addition to the data types already
+ handled by QItemDelegate).
+
+ \o \c StarEditor inherits QWidget and is used by \c StarDelegate
+ to let the user edit a star rating using the mouse.
+ \endlist
+
+ To show the \c StarDelegate in action, we will fill a
+ QTableWidget with some data and install the delegate on it.
+
+ \section1 StarDelegate Class Definition
+
+ Here's the definition of the \c StarDelegate class:
+
+ \snippet examples/itemviews/stardelegate/stardelegate.h 0
+
+ All public functions are reimplemented virtual functions from
+ QItemDelegate to provide custom rendering and editing.
+
+ \section1 StarDelegate Class Implementation
+
+ The \l{QAbstractItemDelegate::}{paint()} function is
+ reimplemented from QItemDelegate and is called whenever the view
+ needs to repaint an item:
+
+ \snippet examples/itemviews/stardelegate/stardelegate.cpp 0
+
+ The function is invoked once for each item, represented by a
+ QModelIndex object from the model. If the data stored in the item
+ is a \c StarRating, we paint it ourselves; otherwise, we let
+ QItemDelegate paint it for us. This ensures that the \c
+ StarDelegate can handle the most common data types.
+
+ In the case where the item is a \c StarRating, we draw the
+ background if the item is selected, and we draw the item using \c
+ StarRating::paint(), which we will review later.
+
+ \c{StartRating}s can be stored in a QVariant thanks to the
+ Q_DECLARE_METATYPE() macro appearing in \c starrating.h. More on
+ this later.
+
+ The \l{QAbstractItemDelegate::}{createEditor()} function is
+ called when the user starts editing an item:
+
+ \snippet examples/itemviews/stardelegate/stardelegate.cpp 2
+
+ If the item is a \c StarRating, we create a \c StarEditor and
+ connect its \c editingFinished() signal to our \c
+ commitAndCloseEditor() slot, so we can update the model when the
+ editor closes.
+
+ Here's the implementation of \c commitAndCloseEditor():
+
+ \snippet examples/itemviews/stardelegate/stardelegate.cpp 5
+
+ When the user is done editing, we emit
+ \l{QAbstractItemDelegate::}{commitData()} and
+ \l{QAbstractItemDelegate::}{closeEditor()} (both declared in
+ QAbstractItemDelegate), to tell the model that there is edited
+ data and to inform the view that the editor is no longer needed.
+
+ The \l{QAbstractItemDelegate::}{setEditorData()} function is
+ called when an editor is created to initialize it with data
+ from the model:
+
+ \snippet examples/itemviews/stardelegate/stardelegate.cpp 3
+
+ We simply call \c setStarRating() on the editor.
+
+ The \l{QAbstractItemDelegate::}{setModelData()} function is
+ called when editing is finished, to commit data from the editor
+ to the model:
+
+ \snippet examples/itemviews/stardelegate/stardelegate.cpp 4
+
+ The \c sizeHint() function returns an item's preferred size:
+
+ \snippet examples/itemviews/stardelegate/stardelegate.cpp 1
+
+ We simply forward the call to \c StarRating.
+
+ \section1 StarEditor Class Definition
+
+ The \c StarEditor class was used when implementing \c
+ StarDelegate. Here's the class definition:
+
+ \snippet examples/itemviews/stardelegate/stareditor.h 0
+
+ The class lets the user edit a \c StarRating by moving the mouse
+ over the editor. It emits the \c editingFinished() signal when
+ the user clicks on the editor.
+
+ The protected functions are reimplemented from QWidget to handle
+ mouse and paint events. The private function \c starAtPosition()
+ is a helper function that returns the number of the star under
+ the mouse pointer.
+
+ \section1 StarEditor Class Implementation
+
+ Let's start with the constructor:
+
+ \snippet examples/itemviews/stardelegate/stareditor.cpp 0
+
+ We enable \l{QWidget::setMouseTracking()}{mouse tracking} on the
+ widget so we can follow the cursor even when the user doesn't
+ hold down any mouse button. We also turn on QWidget's
+ \l{QWidget::autoFillBackground}{auto-fill background} feature to
+ obtain an opaque background. (Without the call, the view's
+ background would shine through the editor.)
+
+ The \l{QWidget::}{paintEvent()} function is reimplemented from
+ QWidget:
+
+ \snippet examples/itemviews/stardelegate/stareditor.cpp 1
+
+ We simply call \c StarRating::paint() to draw the stars, just
+ like we did when implementing \c StarDelegate.
+
+ \snippet examples/itemviews/stardelegate/stareditor.cpp 2
+
+ In the mouse event handler, we call \c setStarCount() on the
+ private data member \c myStarRating to reflect the current cursor
+ position, and we call QWidget::update() to force a repaint.
+
+ \snippet examples/itemviews/stardelegate/stareditor.cpp 3
+
+ When the user releases a mouse button, we simply emit the \c
+ editingFinished() signal.
+
+ \snippet examples/itemviews/stardelegate/stareditor.cpp 4
+
+ The \c starAtPosition() function uses basic linear algebra to
+ find out which star is under the cursor.
+
+ \section1 StarRating Class Definition
+
+ \snippet examples/itemviews/stardelegate/starrating.h 0
+ \codeline
+ \snippet examples/itemviews/stardelegate/starrating.h 1
+
+ The \c StarRating class represents a rating as a number of stars.
+ In addition to holding the data, it is also capable of painting
+ the stars on a QPaintDevice, which in this example is either a
+ view or an editor. The \c myStarCount member variable stores the
+ current rating, and \c myMaxStarCount stores the highest possible
+ rating (typically 5).
+
+ The Q_DECLARE_METATYPE() macro makes the type \c StarRating known
+ to QVariant, making it possible to store \c StarRating values in
+ QVariant.
+
+ \section1 StarRating Class Implementation
+
+ The constructor initializes \c myStarCount and \c myMaxStarCount,
+ and sets up the polygons used to draw stars and diamonds:
+
+ \snippet examples/itemviews/stardelegate/starrating.cpp 0
+
+ The \c paint() function paints the stars in this \c StarRating
+ object on a paint device:
+
+ \snippet examples/itemviews/stardelegate/starrating.cpp 2
+
+ We first set the pen and brush we will use for painting. The \c
+ mode parameter can be either \c Editable or \c ReadOnly. If \c
+ mode is editable, we use the \l{QPalette::}{Highlight} color
+ instead of the \l{QPalette::}{Foreground} color to draw the
+ stars.
+
+ Then we draw the stars. If we are in \c Edit mode, we paint
+ diamonds in place of stars if the rating is less than the highest
+ rating.
+
+ The \c sizeHint() function returns the preferred size for an area
+ to paint the stars on:
+
+ \snippet examples/itemviews/stardelegate/starrating.cpp 1
+
+ The preferred size is just enough to paint the maximum number of
+ stars. The function is called by both \c StarDelegate::sizeHint()
+ and \c StarEditor::sizeHint().
+
+ \section1 The \c main() Function
+
+ Here's the program's \c main() function:
+
+ \snippet examples/itemviews/stardelegate/main.cpp 5
+
+ The \c main() function creates a QTableWidget and sets a \c
+ StarDelegate on it. \l{QAbstractItemView::}{DoubleClicked} and
+ \l{QAbstractItemView::}{SelectedClicked} are set as
+ \l{QAbstractItemView::editTriggers()}{edit triggers}, so that the
+ editor is opened with a single click when the star rating item is
+ selected.
+
+ The \c populateTableWidget() function fills the QTableWidget with
+ data:
+
+ \snippet examples/itemviews/stardelegate/main.cpp 0
+ \snippet examples/itemviews/stardelegate/main.cpp 1
+ \dots
+ \snippet examples/itemviews/stardelegate/main.cpp 2
+ \snippet examples/itemviews/stardelegate/main.cpp 3
+ \codeline
+ \snippet examples/itemviews/stardelegate/main.cpp 4
+
+ Notice the call to qVariantFromValue to convert a \c
+ StarRating to a QVariant.
+
+ \section1 Possible Extensions and Suggestions
+
+ There are many ways to customize Qt's \l{Model/View
+ Programming}{model/view framework}. The approach used in this
+ example is appropriate for most custom delegates and editors.
+ Examples of possibilities not used by the star delegate and star
+ editor are:
+
+ \list
+ \o It is possible to open editors programmatically by calling
+ QAbstractItemView::edit(), instead of relying on edit
+ triggers. This could be use to support other edit triggers
+ than those offered by the QAbstractItemView::EditTrigger enum.
+ For example, in the Star Delegate example, hovering over an
+ item with the mouse might make sense as a way to pop up an
+ editor.
+
+ \o By reimplementing QAbstractItemDelegate::editorEvent(), it is
+ possible to implement the editor directly in the delegate,
+ instead of creating a separate QWidget subclass.
+ \endlist
+*/
diff --git a/doc/src/examples/styleplugin.qdoc b/doc/src/examples/styleplugin.qdoc
new file mode 100644
index 0000000..0dea7bf
--- /dev/null
+++ b/doc/src/examples/styleplugin.qdoc
@@ -0,0 +1,147 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/styleplugin
+ \title Style Plugin Example
+
+ This example shows how to create a plugin that extends Qt with a new
+ GUI look and feel.
+
+ \image stylepluginexample.png
+
+ On some platforms, the native style will prevent the button
+ from having a red background. In this case, try to run the example
+ in another style (e.g., plastique).
+
+ A plugin in Qt is a class stored in a shared library that can be
+ loaded by a QPluginLoader at run-time. When you create plugins in
+ Qt, they either extend a Qt application or Qt itself. Writing a
+ plugin that extends Qt itself is achieved by inheriting one of the
+ plugin \l{Plugin Classes}{base classes}, reimplementing functions
+ from that class, and adding a macro. In this example we extend Qt
+ by adding a new GUI look and feel (i.e., making a new QStyle
+ available). A high-level introduction to plugins is given in the
+ plugin \l{How to Create Qt Plugins}{overview document}.
+
+ Plugins that provide new styles inherit the QStylePlugin base
+ class. Style plugins are loaded by Qt and made available through
+ QStyleFactory; we will look at this later. We have implemented \c
+ SimpleStylePlugin, which provides \c SimpleStyle. The new style
+ inherits QWindowsStyle and contributes to widget styling by
+ drawing button backgrounds in red - not a major contribution, but
+ it still makes a new style. We test the plugin with \c
+ StyleWindow, in which we display a QPushButton.
+
+ The \c SimpleStyle and \c StyleWindow classes do not contain any
+ plugin specific functionality and their implementations are
+ trivial; we will therefore leap past them and head on to the \c
+ SimpleStylePlugin and the \c main() function. After we have looked
+ at that, we examine the plugin's profile.
+
+
+ \section1 SimpleStylePlugin Class Definition
+
+ \c SimpleStylePlugin inherits QStylePlugin and is the plugin
+ class.
+
+ \snippet examples/tools/styleplugin/plugin/simplestyleplugin.h 0
+
+ \c keys() returns a list of style names that this plugin can
+ create, while \c create() takes such a string and returns the
+ QStyle corresponding to the key. Both functions are pure virtual
+ functions reimplemented from QStylePlugin. When an application
+ requests an instance of the \c SimpleStyle style, which this
+ plugin creates, Qt will create it with this plugin.
+
+
+ \section1 SimpleStylePlugin Class Implementation
+
+ Here is the implementation of \c keys():
+
+ \snippet examples/tools/styleplugin/plugin/simplestyleplugin.cpp 0
+
+ Since this plugin only supports one style, we return a QStringList
+ with the class name of that style.
+
+ Here is the \c create() function:
+
+ \snippet examples/tools/styleplugin/plugin/simplestyleplugin.cpp 1
+
+ Note that the key for style plugins are case insensitive.
+ The case sensitivity varies from plugin to plugin, so you need to
+ check this when implementing new plugins.
+
+ \section1 The \c main() function
+
+ \snippet examples/tools/styleplugin/stylewindow/main.cpp 0
+
+ Qt loads the available style plugins when the QApplication object
+ is initialized. The QStyleFactory class knows about all styles and
+ produces them with \l{QStyleFactory::}{create()} (it is a
+ wrapper around all the style plugins).
+
+ \section1 The Simple Style Plugin Profile
+
+ The \c SimpleStylePlugin lives in its own directory and have
+ its own profile:
+
+ \snippet examples/tools/styleplugin/plugin/plugin.pro 0
+
+ In the plugin profile we need to set the lib template as we are
+ building a shared library instead of an executable. We must also
+ set the config to plugin. We set the library to be stored in the
+ styles folder under stylewindow because this is a path in which Qt
+ will search for style plugins.
+
+ \section1 Related articles and examples
+
+ In addition to the plugin \l{How to Create Qt Plugins}{overview
+ document}, we have other examples and articles that concern
+ plugins.
+
+ In the \l{Echo Plugin Example}{echo plugin example} we show how to
+ implement plugins that extends Qt applications rather than Qt
+ itself, which is the case with the style plugin of this example.
+ The \l{Plug & Paint Example}{plug & paint} example shows how to
+ implement a static plugin as well as being a more involved example
+ on plugins that extend applications.
+*/
diff --git a/doc/src/examples/styles.qdoc b/doc/src/examples/styles.qdoc
new file mode 100644
index 0000000..b68a310
--- /dev/null
+++ b/doc/src/examples/styles.qdoc
@@ -0,0 +1,486 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/styles
+ \title Styles Example
+
+ The Styles example illustrates how to create custom widget
+ drawing styles using Qt, and demonstrates Qt's predefined styles.
+
+ \image styles-enabledwood.png Screenshot of the Styles example
+
+ A style in Qt is a subclass of QStyle or of one of its
+ subclasses. Styles perform drawing on behalf of widgets. Qt
+ provides a whole range of predefined styles, either built into
+ the \l QtGui library or found in plugins. Custom styles are
+ usually created by subclassing one of Qt's existing style and
+ reimplementing a few virtual functions.
+
+ In this example, the custom style is called \c NorwegianWoodStyle
+ and derives from QMotifStyle. Its main features are the wooden
+ textures used for filling most of the widgets and its round
+ buttons and comboboxes.
+
+ To implement the style, we use some advanced features provided by
+ QPainter, such as \l{QPainter::Antialiasing}{antialiasing} (to
+ obtain smoother button edges), \l{QColor::alpha()}{alpha blending}
+ (to make the buttons appeared raised or sunken), and
+ \l{QPainterPath}{painter paths} (to fill the buttons and draw the
+ outline). We also use many features of QBrush and QPalette.
+
+ The example consists of the following classes:
+
+ \list
+ \o \c NorwegianWoodStyle inherits from QMotifStyle and implements
+ the Norwegian Wood style.
+ \o \c WidgetGallery is a \c QDialog subclass that shows the most
+ common widgets and allows the user to switch style
+ dynamically.
+ \endlist
+
+ \section1 NorwegianWoodStyle Class Definition
+
+ Here's the definition of the \c NorwegianWoodStyle class:
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.h 0
+
+ The public functions are all declared in QStyle (QMotifStyle's
+ grandparent class) and reimplemented here to override the Motif
+ look and feel. The private functions are helper functions.
+
+ \section1 NorwegianWoodStyle Class Implementation
+
+ We will now review the implementation of the \c
+ NorwegianWoodStyle class.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 0
+
+ The \c polish() function is reimplemented from QStyle. It takes a
+ QPalette as a reference and adapts the palette to fit the style.
+ Most styles don't need to reimplement that function. The
+ Norwegian Wood style reimplements it to set a "wooden" palette.
+
+ We start by defining a few \l{QColor}s that we'll need. Then we
+ load two PNG images. The \c : prefix in the file path indicates
+ that the PNG files are \l{The Qt Resource System}{embedded
+ resources}.
+
+ \table
+ \row \o \inlineimage widgets/styles/images/woodbackground.png
+
+ \o \bold{woodbackground.png}
+
+ This texture is used as the background of most widgets.
+ The wood pattern is horizontal.
+
+ \row \o \inlineimage widgets/styles/images/woodbutton.png
+
+ \o \bold{woodbutton.png}
+
+ This texture is used for filling push buttons and
+ comboboxes. The wood pattern is vertical and more reddish
+ than the texture used for the background.
+ \endtable
+
+ The \c midImage variable is initialized to be the same as \c
+ buttonImage, but then we use a QPainter and fill it with a 25%
+ opaque black color (a black with an \l{QColor::alpha()}{alpha
+ channel} of 63). The result is a somewhat darker image than \c
+ buttonImage. This image will be used for filling buttons that the
+ user is holding down.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 1
+
+ We initialize the palette. Palettes have various
+ \l{QPalette::ColorRole}{color roles}, such as QPalette::Base
+ (used for filling text editors, item views, etc.), QPalette::Text
+ (used for foreground text), and QPalette::Background (used for
+ the background of most widgets). Each role has its own QBrush,
+ which usually is a plain color but can also be a brush pattern or
+ even a texture (a QPixmap).
+
+ In addition to the roles, palettes have several
+ \l{QPalette::ColorGroup}{color groups}: active, disabled, and
+ inactive. The active color group is used for painting widgets in
+ the active window. The disabled group is used for disabled
+ widgets. The inactive group is used for all other widgets. Most
+ palettes have identical active and inactive groups, while the
+ disabled group uses darker shades.
+
+ We initialize the QPalette object with a brown color. Qt
+ automatically derivates all color roles for all color groups from
+ that single color. We then override some of the default values. For
+ example, we use Qt::darkGreen instead of the default
+ (Qt::darkBlue) for the QPalette::Highlight role. The
+ QPalette::setBrush() overload that we use here sets the same
+ color or brush for all three color groups.
+
+ The \c setTexture() function is a private function that sets the
+ texture for a certain color role, while preserving the existing
+ color in the QBrush. A QBrush can hold both a solid color and a
+ texture at the same time. The solid color is used for drawing
+ text and other graphical elements where textures don't look good.
+
+ At the end, we set the brush for the disabled color group of the
+ palette. We use \c woodbackground.png as the texture for all
+ disabled widgets, including buttons, and use a darker color to
+ accompany the texture.
+
+ \image styles-disabledwood.png The Norwegian Wood style with disabled widgets
+
+ Let's move on to the other functions reimplemented from
+ QMotifStyle:
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 3
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 4
+
+ This QStyle::polish() overload is called once on every widget
+ drawn using the style. We reimplement it to set the Qt::WA_Hover
+ attribute on \l{QPushButton}s and \l{QComboBox}es. When this
+ attribute is set, Qt generates paint events when the mouse
+ pointer enters or leaves the widget. This makes it possible to
+ render push buttons and comboboxes differently when the mouse
+ pointer is over them.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 5
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 6
+
+ This QStyle::unpolish() overload is called to undo any
+ modification done to the widget in \c polish(). For simplicity,
+ we assume that the flag wasn't set before \c polish() was called.
+ In an ideal world, we would remember the original state for each
+ widgets (e.g., using a QMap<QWidget *, bool>) and restore it in
+ \c unpolish().
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 7
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 8
+
+ The \l{QStyle::pixelMetric()}{pixelMetric()} function returns the
+ size in pixels for a certain user interface element. By
+ reimplementing this function, we can affect the way certain
+ widgets are drawn and their size hint. Here, we return 8 as the
+ width around a shown in a QComboBox, ensuring that there is
+ enough place around the text and the arrow for the Norwegian Wood
+ round corners. The default value for this setting in the Motif
+ style is 2.
+
+ We also change the extent of \l{QScrollBar}s, i.e., the height
+ for a horizontal scroll bar and the width for a vertical scroll
+ bar, to be 4 pixels more than in the Motif style. This makes the
+ style a bit more distinctive.
+
+ For all other QStyle::PixelMetric elements, we use the Motif
+ settings.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 9
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 10
+
+ The \l{QStyle::styleHint()}{styleHint()} function returns some
+ hints to widgets or to the base style (in our case QMotifStyle)
+ about how to draw the widgets. The Motif style returns \c true
+ for the QStyle::SH_DitherDisabledText hint, resulting in a most
+ unpleasing visual effect. We override this behavior and return \c
+ false instead. We also return \c true for the
+ QStyle::SH_EtchDisabledText hint, meaning that disabled text is
+ rendered with an embossed look (as QWindowsStyle does).
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 11
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 12
+
+ The \l{QStyle::drawPrimitive()}{drawPrimitive()} function is
+ called by Qt widgets to draw various fundamental graphical
+ elements. Here we reimplement it to draw QPushButton and
+ QComboBox with round corners. The button part of these widgets is
+ drawn using the QStyle::PE_PanelButtonCommand primitive element.
+
+ The \c option parameter, of type QStyleOption, contains
+ everything we need to know about the widget we want to draw on.
+ In particular, \c option->rect gives the rectangle within which
+ to draw the primitive element. The \c painter parameter is a
+ QPainter object that we can use to draw on the widget.
+
+ The \c widget parameter is the widget itself. Normally, all the
+ information we need is available in \c option and \c painter, so
+ we don't need \c widget. We can use it to perform special
+ effects; for example, QMacStyle uses it to animate default
+ buttons. If you use it, be aware that the caller is allowed to
+ pass a null pointer.
+
+ We start by defining three \l{QColor}s that we'll need later on.
+ We also put the x, y, width, and height components of the
+ widget's rectangle in local variables. The value used for the \c
+ semiTransparentWhite and for the \c semiTransparentBlack color's
+ alpha channel depends on whether the mouse cursor is over the
+ widget or not. Since we set the Qt::WA_Hover attribute on
+ \l{QPushButton}s and \l{QComboBox}es, we can rely on the
+ QStyle::State_MouseOver flag to be set when the mouse is over the
+ widget.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 13
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 14
+
+ The \c roundRect variable is a QPainterPath. A QPainterPath is is
+ a vectorial specification of a shape. Any shape (rectangle,
+ ellipse, spline, etc.) or combination of shapes can be expressed
+ as a path. We will use \c roundRect both for filling the button
+ background with a wooden texture and for drawing the outline. The
+ \c roundRectPath() function is a private function; we will come
+ back to it later.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 15
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 16
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 17
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 18
+
+ We define two variables, \c brush and \c darker, and initialize
+ them based on the state of the button:
+
+ \list
+ \o If the button is a \l{QPushButton::flat}{flat button}, we use
+ the \l{QPalette::Background}{Background} brush. We set \c
+ darker to \c true if the button is
+ \l{QAbstractButton::down}{down} or
+ \l{QAbstractButton::checked}{checked}.
+ \o If the button is currently held down by the user or in the
+ \l{QAbstractButton::checked}{checked} state, we use the
+ \l{QPalette::Mid}{Mid} component of the palette. We set
+ \c darker to \c true if the button is
+ \l{QAbstractButton::checked}{checked}.
+ \o Otherwise, we use the \l{QPalette::Button}{Button} component
+ of the palette.
+ \endlist
+
+ The screenshot below illustrates how \l{QPushButton}s are
+ rendered based on their state:
+
+ \image styles-woodbuttons.png Norwegian Wood buttons in different states
+
+ To discover whether the button is flat or not, we need to cast
+ the \c option parameter to QStyleOptionButton and check if the
+ \l{QStyleOptionButton::features}{features} member specifies the
+ QStyleOptionButton::Flat flag. The qstyleoption_cast() function
+ performs a dynamic cast; if \c option is not a
+ QStyleOptionButton, qstyleoption_cast() returns a null pointer.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 19
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 20
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 21
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 22
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 23
+
+ We turn on antialiasing on QPainter. Antialiasing is a technique
+ that reduces the visual distortion that occurs when the edges of
+ a shape are converted into pixels. For the Norwegian Wood style,
+ we use it to obtain smoother edges for the round buttons.
+
+ \image styles-aliasing.png Norwegian wood buttons with and without antialiasing
+
+ The first call to QPainter::fillPath() draws the background of
+ the button with a wooden texture. The second call to
+ \l{QPainter::fillPath()}{fillPath()} paints the same area with a
+ semi-transparent black color (a black color with an alpha channel
+ of 63) to make the area darker if \c darker is true.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 24
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 25
+
+ Next, we draw the outline. The top-left half of the outline and
+ the bottom-right half of the outline are drawn using different
+ \l{QPen}s to produce a 3D effect. Normally, the top-left half of
+ the outline is drawn lighter whereas the bottom-right half is
+ drawn darker, but if the button is
+ \l{QAbstractButton::down}{down} or
+ \l{QAbstractButton::checked}{checked}, we invert the two
+ \l{QPen}s to give a sunken look to the button.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 26
+
+ We draw the top-left part of the outline by calling
+ QPainter::drawPath() with an appropriate
+ \l{QPainter::setClipRegion()}{clip region}. If the
+ \l{QStyleOption::direction}{layout direction} is right-to-left
+ instead of left-to-right, we swap the \c x1, \c x2, \c x3, and \c
+ x4 variables to obtain correct results. On right-to-left desktop,
+ the "light" comes from the top-right corner of the screen instead
+ of the top-left corner; raised and sunken widgets must be drawn
+ accordingly.
+
+ The diagram below illustrates how 3D effects are drawn according
+ to the layout direction. The area in red on the diagram
+ corresponds to the \c topHalf polygon:
+
+ \image styles-3d.png
+
+ An easy way to test how a style looks in right-to-left mode is to
+ pass the \c -reverse command-line option to the application. This
+ option is recognized by the QApplication constructor.
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 32
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 33
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 34
+
+ The bottom-right part of the outline is drawn in a similar
+ fashion. Then we draw a one-pixel wide outline around the entire
+ button, using the \l{QPalette::Foreground}{Foreground} component
+ of the QPalette.
+
+ This completes the QStyle::PE_PanelButtonCommand case of the \c
+ switch statement. Other primitive elements are handled by the
+ base style. Let's now turn to the other \c NorwegianWoodStyle
+ member functions:
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 35
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 36
+
+ We reimplement QStyle::drawControl() to draw the text on a
+ QPushButton in a bright color when the button is
+ \l{QAbstractButton::down}{down} or
+ \l{QAbstractButton::checked}{checked}.
+
+ If the \c option parameter points to a QStyleOptionButton object
+ (it normally should), we take a copy of the object and modify its
+ \l{QStyleOption::palette}{palette} member to make the
+ QPalette::ButtonText be the same as the QPalette::BrightText
+ component (unless the widget is disabled).
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 37
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 38
+
+ The \c setTexture() function is a private function that sets the
+ \l{QBrush::texture()}{texture} component of the \l{QBrush}es for
+ a certain \l{QPalette::ColorRole}{color role}, for all three
+ \l{QPalette::ColorGroup}{color groups} (active, disabled,
+ inactive). We used it to initialize the Norwegian Wood palette in
+ \c polish(QPalette &).
+
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 39
+ \snippet examples/widgets/styles/norwegianwoodstyle.cpp 40
+
+ The \c roundRectPath() function is a private function that
+ constructs a QPainterPath object for round buttons. The path
+ consists of eight segments: four arc segments for the corners and
+ four lines for the sides.
+
+ With around 250 lines of code, we have a fully functional custom
+ style based on one of the predefined styles. Custom styles can be
+ used to provide a distinct look to an application or family of
+ applications.
+
+ \section1 WidgetGallery Class
+
+ For completeness, we will quickly review the \c WidgetGallery
+ class, which contains the most common Qt widgets and allows the
+ user to change style dynamically. Here's the class definition:
+
+ \snippet examples/widgets/styles/widgetgallery.h 0
+ \dots
+ \snippet examples/widgets/styles/widgetgallery.h 1
+
+ Here's the \c WidgetGallery constructor:
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 0
+
+ We start by creating child widgets. The \gui Style combobox is
+ initialized with all the styles known to QStyleFactory, in
+ addition to \c NorwegianWood. The \c create...() functions are
+ private functions that set up the various parts of the \c
+ WidgetGallery.
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 1
+ \snippet examples/widgets/styles/widgetgallery.cpp 2
+
+ We connect the \gui Style combobox to the \c changeStyle()
+ private slot, the \gui{Use style's standard palette} check box to
+ the \c changePalette() slot, and the \gui{Disable widgets} check
+ box to the child widgets'
+ \l{QWidget::setDisabled()}{setDisabled()} slot.
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 3
+ \snippet examples/widgets/styles/widgetgallery.cpp 4
+
+ Finally, we put the child widgets in layouts.
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 5
+ \snippet examples/widgets/styles/widgetgallery.cpp 6
+
+ When the user changes the style in the combobox, we call
+ QApplication::setStyle() to dynamically change the style of the
+ application.
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 7
+ \snippet examples/widgets/styles/widgetgallery.cpp 8
+
+ If the user turns the \gui{Use style's standard palette} on, the
+ current style's \l{QStyle::standardPalette()}{standard palette}
+ is used; otherwise, the system's default palette is honored.
+
+ For the Norwegian Wood style, this makes no difference because we
+ always override the palette with our own palette in \c
+ NorwegianWoodStyle::polish().
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 9
+ \snippet examples/widgets/styles/widgetgallery.cpp 10
+
+ The \c advanceProgressBar() slot is called at regular intervals
+ to advance the progress bar. Since we don't know how long the
+ user will keep the Styles application running, we use a
+ logarithmic formula: The closer the progress bar gets to 100%,
+ the slower it advances.
+
+ We will review \c createProgressBar() in a moment.
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 11
+ \snippet examples/widgets/styles/widgetgallery.cpp 12
+
+ The \c createTopLeftGroupBox() function creates the QGroupBox
+ that occupies the top-left corner of the \c WidgetGallery. We
+ skip the \c createTopRightGroupBox(), \c
+ createBottomLeftTabWidget(), and \c createBottomRightGroupBox()
+ functions, which are very similar.
+
+ \snippet examples/widgets/styles/widgetgallery.cpp 13
+
+ In \c createProgressBar(), we create a QProgressBar at the bottom
+ of the \c WidgetGallery and connect its
+ \l{QTimer::timeout()}{timeout()} signal to the \c
+ advanceProgressBar() slot.
+*/
diff --git a/doc/src/examples/stylesheet.qdoc b/doc/src/examples/stylesheet.qdoc
new file mode 100644
index 0000000..811d65c
--- /dev/null
+++ b/doc/src/examples/stylesheet.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/stylesheet
+ \title Style Sheet Example
+
+ The Style Sheet Example shows how to use style sheets.
+
+ \image stylesheet-pagefold.png Screen Shot of the Pagefold style sheet
+*/
+
diff --git a/doc/src/examples/svgalib.qdoc b/doc/src/examples/svgalib.qdoc
new file mode 100644
index 0000000..c94d408
--- /dev/null
+++ b/doc/src/examples/svgalib.qdoc
@@ -0,0 +1,360 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example qws/svgalib
+ \title Accelerated Graphics Driver Example
+
+ The Accelerated Graphics Driver example shows how you can write
+ your own accelerated graphics driver and \l {add your graphics
+ driver to Qt for Embedded Linux}. In \l{Qt for Embedded Linux},
+ painting is a pure software implementation and is normally performed
+ in two steps:
+ The clients render each window onto a corresponding surface
+ (stored in memory) using a paint engine, and then the server uses
+ the graphics driver to compose the surface images and copy them to
+ the screen. (See the \l{Qt for Embedded Linux Architecture} documentation
+ for details.)
+
+ The rendering can be accelerated in two ways: Either by
+ accelerating the copying of pixels to the screen, or by
+ accelerating the explicit painting operations. The first is done
+ in the graphics driver implementation, the latter is performed by
+ the paint engine implementation. Typically, both the pixel copying
+ and the painting operations are accelerated using the following
+ approach:
+
+ \list 1
+ \o \l {Step 1: Creating a Custom Graphics Driver}
+ {Creating a Custom Graphics Driver}
+
+ \o \l {Step 2: Implementing a Custom Raster Paint Engine}
+ {Implementing a Custom Paint Engine}
+
+ \o \l {Step 3: Making the Widgets Aware of the Custom Paint
+ Engine}{Making the Widgets Aware of the Custom Paint Engine}
+
+ \endlist
+
+ After compiling the example code, install the graphics driver
+ plugin with the command \c {make install}. To start an application
+ using the graphics driver, you can either set the environment
+ variable \l QWS_DISPLAY and then run the application, or you can
+ just run the application using the \c -display switch:
+
+ \snippet doc/src/snippets/code/doc_src_examples_svgalib.qdoc 0
+
+ \table
+ \header \o SVGAlib
+ \row \o
+
+ Instead of interfacing the graphics hardware directly, this
+ example relies on \l {http://www.svgalib.org}{SVGAlib} being
+ installed on your system. \l {http://www.svgalib.org}{SVGAlib} is
+ a small graphics library which provides acceleration for many
+ common graphics cards used on desktop computers. It should work on
+ most workstations and has a small and simple API.
+
+ \endtable
+
+ \section1 Step 1: Creating a Custom Graphics Driver
+
+ The custom graphics driver is created by deriving from the QScreen
+ class. QScreen is the base class for implementing screen/graphics
+ drivers in Qt for Embedded Linux.
+
+ \snippet examples/qws/svgalib/svgalibscreen.h 0
+ \codeline
+ \snippet examples/qws/svgalib/svgalibscreen.h 1
+
+ The \l {QScreen::}{connect()}, \l {QScreen::}{disconnect()}, \l
+ {QScreen::}{initDevice()} and \l {QScreen::}{shutdownDevice()}
+ functions are declared as pure virtual functions in QScreen and
+ must be implemented. They are used to configure the hardware, or
+ query its configuration: \l {QScreen::}{connect()} and \l
+ {QScreen::}{disconnect()} are called by both the server and client
+ processes, while the \l {QScreen::}{initDevice()} and \l
+ {QScreen::}{shutdownDevice()} functions are only called by the
+ server process.
+
+ QScreen's \l {QScreen::}{setMode()} and \l {QScreen::}{blank()}
+ functions are also pure virtual, but our driver's implementations
+ are trivial. The last two functions (\l {QScreen::}{blit()} and \l
+ {QScreen::}{solidFill()}) are the ones involved in putting pixels
+ on the screen, i.e., we reimplement these functions to perform the
+ pixel copying acceleration.
+
+ Finally, the \c context variable is a pointer to a \l
+ {http://www.svgalib.org}{SVGAlib} specific type. Note that the
+ details of using the \l {http://www.svgalib.org}{SVGAlib} library
+ is beyond the scope of this example.
+
+ \section2 SvgalibScreen Class Implementation
+
+ The \l {QScreen::}{connect()} function is the first function that
+ is called after the constructor returns. It queries \l
+ {http://www.svgalib.org}{SVGAlib} about the graphics mode and
+ initializes the variables.
+
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 0
+
+ It is important that the \l {QScreen::}{connect()} function
+ initializes the \c data, \c lstep, \c w, \c h, \c dw, \c dh, \c d,
+ \c physWidth and \c physHeight variables (inherited from QScreen)
+ to ensure that the driver is in a state consistent with the driver
+ configuration.
+
+ In this particular example we do not have any information of the
+ real physical size of the screen, so we set these values with the
+ assumption of a screen with 72 DPI.
+
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 1
+
+ When the \l {QScreen::}{connect()} function returns, the server
+ process calls the \l {QScreen::}{initDevice()} function which is
+ expected to do the necessary hardware initialization, leaving the
+ hardware in a state consistent with the driver configuration.
+
+ Note that we have chosen to use the software cursor. If you want
+ to use a hardware cursor, you should create a subclass of
+ QScreenCursor, create an instance of it, and make the global
+ variable \c qt_screencursor point to this instance.
+
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 2
+ \codeline
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 3
+
+ Before exiting, the server process will call the \l
+ {QScreen::}{shutdownDevice()} function to do the necessary
+ hardware cleanup. Again, it is important that the function leaves
+ the hardware in a state consistent with the driver
+ configuration. When \l {QScreen::}{shutdownDevice()} returns, the
+ \l {QScreen::}{disconnect()} function is called. Our
+ implementation of the latter function is trivial.
+
+ Note that, provided that the \c QScreen::data variable points to a
+ valid linear framebuffer, the graphics driver is fully functional
+ as a simple screen driver at this point. The rest of this example
+ will show where to take advantage of the accelerated capabilities
+ available on the hardware.
+
+ Whenever an area on the screen needs to be updated, the server will
+ call the \l {QScreen::}{exposeRegion()} function that paints the
+ given region on screen. The default implementation will do the
+ necessary composing of the top-level windows and call \l
+ {QScreen::}{solidFill()} and \l {QScreen::}{blit()} whenever it is
+ required. We do not want to change this behavior in the driver so
+ we do not reimplement \l {QScreen::}{exposeRegion()}.
+
+ To control how the pixels are put onto the screen we need to
+ reimplement the \l {QScreen::}{solidFill()} and \l
+ {QScreen::}{blit()} functions.
+
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 4
+ \codeline
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 5
+
+ \section1 Step 2: Implementing a Custom Raster Paint Engine
+
+ \l{Qt for Embedded Linux} uses QRasterPaintEngine (a raster-based
+ implementation of QPaintEngine) to implement the painting
+ operations.
+
+ Acceleration of the painting operations is done by deriving from
+ QRasterPaintEngine class. This is a powerful mechanism for
+ accelerating graphic primitives while getting software fallbacks
+ for all the primitives you do not accelerate.
+
+ \snippet examples/qws/svgalib/svgalibpaintengine.h 0
+
+ In this example, we will only accelerate one of the \l
+ {QRasterPaintEngine::}{drawRects()} functions, i.e., only
+ non-rotated, aliased and opaque rectangles will be rendered using
+ accelerated painting. All other primitives are rendered using the
+ base class's unaccelerated implementation.
+
+ The paint engine's state is stored in the private member
+ variables, and we reimplement the \l
+ {QPaintEngine::}{updateState()} function to ensure that our
+ custom paint engine's state is updated properly whenever it is
+ required. The private \c setClip() and \c updateClip() functions
+ are only helper function used to simplify the \l
+ {QPaintEngine::}{updateState()} implementation.
+
+ We also reimplement QRasterPaintEngine's \l
+ {QRasterPaintEngine::}{begin()} and \l
+ {QRasterPaintEngine::}{end()} functions to initialize the paint
+ engine and to do the cleanup when we are done rendering,
+ respectively.
+
+ \table
+ \header \o Private Header Files
+ \row
+ \o
+
+ Note the \c include statement used by this class. The files
+ prefixed with \c private/ are private headers file within
+ \l{Qt for Embedded Linux}. Private header files are not part of
+ the standard installation and are only present while
+ compiling Qt. To be able to compile using
+ private header files you need to use a \c qmake binary within a
+ compiled \l{Qt for Embedded Linux} package.
+
+ \warning Private header files may change without notice between
+ releases.
+
+ \endtable
+
+ The \l {QRasterPaintEngine::}{begin()} function initializes the
+ internal state of the paint engine. Note that it also calls the
+ base class implementation to initialize the parts inherited from
+ QRasterPaintEngine:
+
+ \snippet examples/qws/svgalib/svgalibpaintengine.cpp 0
+ \codeline
+ \snippet examples/qws/svgalib/svgalibpaintengine.cpp 1
+
+ The implementation of the \l {QRasterPaintEngine::}{end()}
+ function removes the clipping constraints that might have been set
+ in \l {http://www.svgalib.org}{SVGAlib}, before calling the
+ corresponding base class implementation.
+
+ \snippet examples/qws/svgalib/svgalibpaintengine.cpp 2
+
+ The \l {QPaintEngine::}{updateState()} function updates our
+ custom paint engine's state. The QPaintEngineState class provides
+ information about the active paint engine's current state.
+
+ Note that we only accept and save the current matrix if it doesn't
+ do any shearing. The pen is accepted if it is opaque and only one
+ pixel wide. The rest of the engine's properties are updated
+ following the same pattern. Again it is important that the
+ QPaintEngine::updateState() function is called to update the
+ parts inherited from the base class.
+
+ \snippet examples/qws/svgalib/svgalibpaintengine.cpp 3
+ \codeline
+ \snippet examples/qws/svgalib/svgalibpaintengine.cpp 4
+
+ The \c setClip() helper function is called from our custom
+ implementation of \l {QPaintEngine::}{updateState()}, and
+ enables clipping to the given region. An empty region means that
+ clipping is disabled.
+
+ Our custom update function also makes use of the \c updateClip()
+ helper function that checks if the clip is "simple", i.e., that it
+ can be represented by only one rectangle, and updates the clip
+ region in \l {http://www.svgalib.org}{SVGAlib}.
+
+ \snippet examples/qws/svgalib/svgalibpaintengine.cpp 5
+
+ Finally, we accelerated that drawing of non-rotated, aliased and
+ opaque rectangles in our reimplementation of the \l
+ {QRasterPaintEngine::}{drawRects()} function. The
+ QRasterPaintEngine fallback is used whenever the rectangle is not
+ simple enough.
+
+ \section1 Step 3: Making the Widgets Aware of the Custom Paint Engine
+
+ To activate the custom paint engine, we also need to implement a
+ corresponding paint device and window surface and make some minor
+ adjustments of the graphics driver.
+
+ \list
+ \o \l {Implementing a Custom Paint Device}
+ \o \l {Implementing a Custom Window Surface}
+ \o \l {Adjusting the Graphics Driver}
+ \endlist
+
+ \section2 Implementing a Custom Paint Device
+
+ The custom paint device can be derived from the
+ QCustomRasterPaintDevice class. Reimplement its \l
+ {QCustomRasterPaintDevice::}{paintEngine()} and \l
+ {QCustomRasterPaintDevice::}{memory()} functions to activate the
+ accelerated paint engine:
+
+ \snippet examples/qws/svgalib/svgalibpaintdevice.h 0
+
+ The \l {QCustomRasterPaintDevice::}{paintEngine()} function should
+ return an instance of the \c SvgalibPaintEngine class. The \l
+ {QCustomRasterPaintDevice::}{memory()} function should return a
+ pointer to the buffer which should be used when drawing the
+ widget.
+
+ Our example driver is rendering directly to the screen without any
+ buffering, i.e., our custom pain device's \l
+ {QCustomRasterPaintDevice::}{memory()} function returns a pointer
+ to the framebuffer. For this reason, we must also reimplement the
+ \l {QPaintDevice::}{metric()} function to reflect the metrics of
+ framebuffer.
+
+ \section2 Implementing a Custom Window Surface
+
+ The custom window surface can be derived from the QWSWindowSurface
+ class. QWSWindowSurface manages the memory used when drawing a
+ window.
+
+ \snippet examples/qws/svgalib/svgalibsurface.h 0
+
+ We can implement most of the pure virtual functions inherited from
+ QWSWindowSurface as trivial inline functions, except the
+ \l {QWindowSurface::}{scroll()} function that actually makes use
+ of some hardware acceleration:
+
+ \snippet examples/qws/svgalib/svgalibsurface.cpp 0
+
+ \section2 Adjusting the Graphics Driver
+
+ Finally, we enable the graphics driver to recognize an instance of
+ our custom window surface:
+
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 7
+ \codeline
+ \snippet examples/qws/svgalib/svgalibscreen.cpp 8
+
+ The \l {QScreen::}{createSurface()} functions are factory
+ functions that determines what kind of surface a top-level window
+ is using. In our example we only use the custom surface if the
+ given window has the Qt::WA_PaintOnScreen attribute or the
+ QT_ONSCREEN_PAINT environment variable is set.
+*/
+
diff --git a/doc/src/examples/svgviewer.qdoc b/doc/src/examples/svgviewer.qdoc
new file mode 100644
index 0000000..affc85f
--- /dev/null
+++ b/doc/src/examples/svgviewer.qdoc
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/svgviewer
+ \title SVG Viewer Example
+
+ The SVG Viewer example shows how to add SVG viewing support to applications.
+
+ \image svgviewer-example.png
+
+ Scalable Vector Graphics (SVG) is an XML-based language for describing two-dimensional
+ vector graphics. Qt provides classes for rendering and displaying SVG drawings in
+ widgets and on other paint devices. This example allows the user to load SVG files
+ and view them in a QGraphicsView using a QGraphicsSvgItem. Based on the selected
+ renderer the QGraphicsView uses either a QWidget or QGLWidget as its viewport. A
+ third render mode is also provided, where the QGraphicsView draws indirectly though
+ a QImage. This allows testing of drawing accuracy and performance for both the
+ native, raster, and OpenGL paint engines.
+
+ See the QtSvg module documentation for more information about SVG and Qt's SVG classes.
+*/
diff --git a/doc/src/examples/syntaxhighlighter.qdoc b/doc/src/examples/syntaxhighlighter.qdoc
new file mode 100644
index 0000000..7cc9e61
--- /dev/null
+++ b/doc/src/examples/syntaxhighlighter.qdoc
@@ -0,0 +1,256 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example richtext/syntaxhighlighter
+ \title Syntax Highlighter Example
+
+ The Syntax Highlighter example shows how to perform simple syntax
+ highlighting by subclassing the QSyntaxHighlighter class.
+
+ \image syntaxhighlighter-example.png
+
+ The Syntax Highlighter application displays C++ files with custom
+ syntax highlighting.
+
+ The example consists of two classes:
+
+ \list
+ \o The \c Highlighter class defines and applies the
+ highlighting rules.
+ \o The \c MainWindow widget is the application's main window.
+ \endlist
+
+ We will first review the \c Highlighter class to see how you can
+ customize the QSyntaxHighlighter class to fit your preferences,
+ then we will take a look at the relevant parts of the \c
+ MainWindow class to see how you can use your custom highlighter
+ class in an application.
+
+ \section1 Highlighter Class Definition
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.h 0
+
+ To provide your own syntax highlighting, you must subclass
+ QSyntaxHighlighter, reimplement the \l
+ {QSyntaxHighlighter::highlightBlock()}{highlightBlock()} function,
+ and define your own highlighting rules.
+
+ We have chosen to store our highlighting rules using a private
+ struct: A rule consists of a QRegExp pattern and a QTextCharFormat
+ instance. The various rules are then stored using a QVector.
+
+ The QTextCharFormat class provides formatting information for
+ characters in a QTextDocument specifying the visual properties of
+ the text, as well as information about its role in a hypertext
+ document. In this example, we will only define the font weight and
+ color using the QTextCharFormat::setFontWeight() and
+ QTextCharFormat::setForeground() functions.
+
+ \section1 Highlighter Class Implementation
+
+ When subclassing the QSyntaxHighlighter class you must pass the
+ parent parameter to the base class constructor. The parent is the
+ text document upon which the syntax highligning will be
+ applied. In this example, we have also chosen to define our
+ highlighting rules in the constructor:
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 0
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 1
+
+ First we define a keyword rule which recognizes the most common
+ C++ keywords. We give the \c keywordFormat a bold, dark blue
+ font. For each keyword, we assign the keyword and the specified
+ format to a HighlightingRule object and append the object to our
+ list of rules.
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 2
+ \codeline
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 4
+ \codeline
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 5
+
+ Then we create a format that we will apply to Qt class names. The
+ class names will be rendered with a dark magenta color and a bold
+ style. We specify a string pattern that is actually a regular
+ expression capturing all Qt class names. Then we assign the
+ regular expression and the specified format to a HighlightingRule
+ object and append the object to our list of rules.
+
+ We also define highlighting rules for quotations and functions
+ using the same approach: The patterns have the form of regular
+ expressions and are stored in HighlightingRule objects with the
+ associated format.
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 3
+ \codeline
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 6
+
+ The C++ language has two variations of comments: The single line
+ comment (\c //) and the multiline comment (\c{/*...}\starslash). The single
+ line comment can easily be defined through a highlighting rule
+ similar to the previous ones. But the multiline comment needs
+ special care due to the design of the QSyntaxHighlighter class.
+
+ After a QSyntaxHighlighter object is created, its \l
+ {QSyntaxHighlighter::highlightBlock()}{highlightBlock()} function
+ will be called automatically whenever it is necessary by the rich
+ text engine, highlighting the given text block. The problem
+ appears when a comment spans several text blocks. We will take a
+ closer look at how this problem can be solved when reviewing the
+ implementation of the \c Highlighter::highlightBlock()
+ function. At this point we only specify the multiline comment's
+ color.
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 7
+
+ The highlightBlock() function is called automatically whenever it
+ is necessary by the rich text engine, i.e. when there are text
+ blocks that have changed.
+
+ First we apply the syntax highlighting rules that we stored in the
+ \c highlightingRules vector. For each rule (i.e. for each
+ HighlightingRule object) we search for the pattern in the given
+ textblock using the QString::indexOf() function. When the first
+ occurrence of the pattern is found, we use the
+ QRegExp::matchedLength() function to determine the string that
+ will be formatted. QRegExp::matchedLength() returns the length of
+ the last matched string, or -1 if there was no match.
+
+ To perform the actual formatting the QSyntaxHighlighter class
+ provides the \l {QSyntaxHighlighter::setFormat()}{setFormat()}
+ function. This function operates on the text block that is passed
+ as argument to the \c highlightBlock() function. The specified
+ format is applied to the text from the given start position for
+ the given length. The formatting properties set in the given
+ format are merged at display time with the formatting information
+ stored directly in the document. Note that the document itself
+ remains unmodified by the format set through this function.
+
+ This process is repeated until the last occurrence of the pattern
+ in the current text block is found.
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 8
+
+ To deal with constructs that can span several text blocks (like
+ the C++ multiline comment), it is necessary to know the end state
+ of the previous text block (e.g. "in comment"). Inside your \c
+ highlightBlock() implementation you can query the end state of the
+ previous text block using the
+ QSyntaxHighlighter::previousBlockState() function. After parsing
+ the block you can save the last state using
+ QSyntaxHighlighter::setCurrentBlockState().
+
+ The \l
+ {QSyntaxHighlighter::previousBlockState()}{previousBlockState()}
+ function return an int value. If no state is set, the returned
+ value is -1. You can designate any other value to identify any
+ given state using the \l
+ {QSyntaxHighlighter::setCurrentBlockState()}{setCurrentBlockState()}
+ function. Once the state is set, the QTextBlock keeps that value
+ until it is set again or until the corresponding paragraph of text
+ is deleted.
+
+ In this example we have chosen to use 0 to represent the "not in
+ comment" state, and 1 for the "in comment" state. When the stored
+ syntax highlighting rules are applied we initialize the current
+ block state to 0.
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 9
+
+ If the previous block state was "in comment" (\c
+ {previousBlockState() == 1}), we start the search for an end
+ expression at the beginning of the text block. If the
+ previousBlockState() returns 0, we start the search at the
+ location of the first occurrence of a start expression.
+
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 10
+ \snippet examples/richtext/syntaxhighlighter/highlighter.cpp 11
+
+ When an end expression is found, we calculate the length of the
+ comment and apply the multiline comment format. Then we search for
+ the next occurrence of the start expression and repeat the
+ process. If no end expression can be found in the current text
+ block we set the current block state to 1, i.e. "in comment".
+
+ This completes the \c Highlighter class implementation; it is now
+ ready for use.
+
+ \section1 MainWindow Class Definition
+
+ Using a QSyntaxHighlighter subclass is simple; just provide your
+ application with an instance of the class and pass it the document
+ upon which you want the highlighting to be applied.
+
+ \snippet examples/richtext/syntaxhighlighter/mainwindow.h 0
+
+ In this example we declare a pointer to a \c Highlighter instance
+ which we later will initialize in the private \c setupEditor()
+ function.
+
+ \section1 MainWindow Class Implementation
+
+ The constructor of the main window is straight forward. We first
+ set up the menus, then we initialize the editor and make it the
+ central widget of the application. Finally we set the main
+ window's title.
+
+ \snippet examples/richtext/syntaxhighlighter/mainwindow.cpp 0
+
+ We initialize and install the \c Highlighter object in the private
+ setupEditor() convenience function:
+
+ \snippet examples/richtext/syntaxhighlighter/mainwindow.cpp 1
+
+ First we create the font we want to use in the editor, then we
+ create the editor itself which is an instance of the QTextEdit
+ class. Before we initialize the editor with the \c MainWindow
+ class definition file, we create a \c Highlighter instance passing
+ the editor's document as argument. This is the document that the
+ highlighting will be applied to. Then we are done.
+
+ A QSyntaxHighlighter object can only be installed on one document
+ at the time, but you can easily reinstall the highlighter on
+ another document using the QSyntaxHighlighter::setDocument()
+ function. The QSyntaxHighlighter class also provides the \l
+ {QSyntaxHighlighter::document()}{document()} function which
+ returns the currently set document.
+*/
diff --git a/doc/src/examples/systray.qdoc b/doc/src/examples/systray.qdoc
new file mode 100644
index 0000000..62bc05c
--- /dev/null
+++ b/doc/src/examples/systray.qdoc
@@ -0,0 +1,197 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example desktop/systray
+ \title System Tray Icon Example
+
+
+ The System Tray Icon example shows how to add an icon with a menu
+ and popup messages to a desktop environment's system tray.
+
+ \image systemtray-example.png Screenshot of the System Tray Icon.
+
+ Modern operating systems usually provide a special area on the
+ desktop, called the system tray or notification area, where
+ long-running applications can display icons and short messages.
+
+ This example consists of one single class, \c Window, providing
+ the main application window (i.e., an editor for the system tray
+ icon) and the associated icon.
+
+ \image systemtray-editor.png
+
+ The editor allows the user to choose the preferred icon as well as
+ set the balloon message's type and duration. The user can also
+ edit the message's title and body. Finally, the editor provide a
+ checkbox controlling whether the icon is actually shown in the
+ system tray, or not.
+
+ \section1 Window Class Definition
+
+ The \c Window class inherits QWidget:
+
+ \snippet examples/desktop/systray/window.h 0
+
+ We implement several private slots to respond to user
+ interaction. The other private functions are only convenience
+ functions provided to simplify the constructor.
+
+ The tray icon is an instance of the QSystemTrayIcon class. To
+ check whether a system tray is present on the user's desktop, call
+ the static QSystemTrayIcon::isSystemTrayAvailable()
+ function. Associated with the icon, we provide a menu containing
+ the typical \gui minimize, \gui maximize, \gui restore and \gui
+ quit actions. We reimplement the QWidget::setVisible() function to
+ update the tray icon's menu whenever the editor's appearance
+ changes, e.g., when maximizing or minimizing the main application
+ window.
+
+ Finally, we reimplement QWidget's \l {QWidget::}{closeEvent()}
+ function to be able to inform the user (when closing the editor
+ window) that the program will keep running in the system tray
+ until the user chooses the \gui Quit entry in the icon's context
+ menu.
+
+ \section1 Window Class Implementation
+
+ When constructing the editor widget, we first create the various
+ editor elements before we create the actual system tray icon:
+
+ \snippet examples/desktop/systray/window.cpp 0
+
+ We ensure that the application responds to user input by
+ connecting most of the editor's input widgets (including the
+ system tray icon) to the application's private slots. But note the
+ visibility checkbox; its \l {QCheckBox::}{toggled()} signal is
+ connected to the \e {icon}'s \l {QSystemTrayIcon::}{setVisible()}
+ function instead.
+
+ \snippet examples/desktop/systray/window.cpp 3
+
+ The \c setIcon() slot is triggered whenever the current index in
+ the icon combobox changes, i.e., whenever the user chooses another
+ icon in the editor. Note that it is also called when the user
+ activates the tray icon with the left mouse button, triggering the
+ icon's \l {QSystemTrayIcon::}{activated()} signal. We will come
+ back to this signal shortly.
+
+ The QSystemTrayIcon::setIcon() function sets the \l
+ {QSystemTrayIcon::}{icon} property that holds the actual system
+ tray icon. On Windows, the system tray icon size is 16x16; on X11,
+ the preferred size is 22x22. The icon will be scaled to the
+ appropriate size as necessary.
+
+ Note that on X11, due to a limitation in the system tray
+ specification, mouse clicks on transparent areas in the icon are
+ propagated to the system tray. If this behavior is unacceptable,
+ we suggest using an icon with no transparency.
+
+ \snippet examples/desktop/systray/window.cpp 4
+
+ Whenever the user activates the system tray icon, it emits its \l
+ {QSystemTrayIcon::}{activated()} signal passing the triggering
+ reason as parameter. QSystemTrayIcon provides the \l
+ {QSystemTrayIcon::}{ActivationReason} enum to describe how the
+ icon was activated.
+
+ In the constructor, we connected our icon's \l
+ {QSystemTrayIcon::}{activated()} signal to our custom \c
+ iconActivated() slot: If the user has clicked the icon using the
+ left mouse button, this function changes the icon image by
+ incrementing the icon combobox's current index, triggering the \c
+ setIcon() slot as mentioned above. If the user activates the icon
+ using the middle mouse button, it calls the custom \c
+ showMessage() slot:
+
+ \snippet examples/desktop/systray/window.cpp 5
+
+ When the \e showMessage() slot is triggered, we first retrieve the
+ message icon depending on the currently chosen message type. The
+ QSystemTrayIcon::MessageIcon enum describes the icon that is shown
+ when a balloon message is displayed. Then we call
+ QSystemTrayIcon's \l {QSystemTrayIcon::}{showMessage()} function
+ to show the message with the title, body, and icon for the time
+ specified in milliseconds.
+
+ Mac OS X users note: The Growl notification system must be
+ installed for QSystemTrayIcon::showMessage() to display messages.
+
+ QSystemTrayIcon also has the corresponding, \l {QSystemTrayIcon::}
+ {messageClicked()} signal, which is emitted when the user clicks a
+ message displayed by \l {QSystemTrayIcon::}{showMessage()}.
+
+ \snippet examples/desktop/systray/window.cpp 6
+
+ In the constructor, we connected the \l
+ {QSystemTrayIcon::}{messageClicked()} signal to our custom \c
+ messageClicked() slot that simply displays a message using the
+ QMessageBox class.
+
+ QMessageBox provides a modal dialog with a short message, an icon,
+ and buttons laid out depending on the current style. It supports
+ four severity levels: "Question", "Information", "Warning" and
+ "Critical". The easiest way to pop up a message box in Qt is to
+ call one of the associated static functions, e.g.,
+ QMessageBox::information().
+
+ As we mentioned earlier, we reimplement a couple of QWidget's
+ virtual functions:
+
+ \snippet examples/desktop/systray/window.cpp 1
+
+ Our reimplementation of the QWidget::setVisible() function updates
+ the tray icon's menu whenever the editor's appearance changes,
+ e.g., when maximizing or minimizing the main application window,
+ before calling the base class implementation.
+
+ \snippet examples/desktop/systray/window.cpp 2
+
+ We have reimplemented the QWidget::closeEvent() event handler to
+ receive widget close events, showing the above message to the
+ users when they are closing the editor window.
+
+ In addition to the functions and slots discussed above, we have
+ also implemented several convenience functions to simplify the
+ constructor: \c createIconGroupBox(), \c createMessageGroupBox(),
+ \c createActions() and \c createTrayIcon(). See the \l
+ {desktop/systray/window.cpp}{window.cpp} file for details.
+*/
diff --git a/doc/src/examples/tabdialog.qdoc b/doc/src/examples/tabdialog.qdoc
new file mode 100644
index 0000000..c9500af
--- /dev/null
+++ b/doc/src/examples/tabdialog.qdoc
@@ -0,0 +1,148 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/tabdialog
+ \title Tab Dialog Example
+
+ The Tab Dialog example shows how to construct a tab dialog using the
+ QTabWidget class.
+
+ Dialogs provide an efficient way for the application to communicate
+ with the user, but complex dialogs suffer from the problem that they
+ often take up too much screen area. By using a number of tabs in a
+ dialog, information can be split into different categories, while
+ remaining accessible.
+
+ \image tabdialog-example.png
+
+ The Tab Dialog example consists of a single \c TabDialog class that
+ provides three tabs, each containing information about a particular
+ file, and two standard push buttons that are used to accept or reject
+ the contents of the dialog.
+
+ \section1 TabDialog Class Definition
+
+ The \c TabDialog class is a subclass of QDialog that displays a
+ QTabWidget and two standard dialog buttons. The class definition
+ only contain the class constructor and a private data member for
+ the QTabWidget:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.h 3
+
+ In the example, the widget will be used as a top-level window, but
+ we define the constructor so that it can take a parent widget. This
+ allows the dialog to be centered on top of an application's main
+ window.
+
+ \section1 TabDialog Class Implementation
+
+ The constructor calls the QDialog constructor and creates a QFileInfo
+ object for the specified filename.
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 0
+
+ The tab widget is populated with three custom widgets that each
+ contain information about the file. We construct each of these
+ without a parent widget because the tab widget will reparent
+ them as they are added to it.
+
+ We create two standard push buttons, and connect each of them to
+ the appropriate slots in the dialog:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 1
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 3
+
+ We arrange the the tab widget above the buttons in the dialog:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 4
+
+ Finally, we set the dialog's title:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 5
+
+ Each of the tabs are subclassed from QWidget, and only provide
+ constructors.
+
+ \section1 GeneralTab Class Definition
+
+ The GeneralTab widget definition is simple because we are only interested
+ in displaying the contents of a widget within a tab:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.h 0
+
+ \section1 GeneralTab Class Implementation
+
+ The GeneralTab widget simply displays some information about the file
+ passed by the TabDialog. Various widgets for this purpose, and these
+ are arranged within a vertical layout:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 6
+
+ \section1 PermissionsTab Class Definition
+
+ Like the GeneralTab, the PermissionsTab is just used as a placeholder
+ widget for its children:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.h 1
+
+ \section1 PermissionsTab Class Implementation
+
+ The PermissionsTab shows information about the file's access information,
+ displaying details of the file permissions and owner in widgets that are
+ arranged in nested layouts:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 7
+
+ \section1 ApplicationsTab Class Definition
+
+ The ApplicationsTab is another placeholder widget that is mostly
+ cosmetic:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.h 2
+
+ \section1 ApplicationsTab Class Implementation
+
+ The ApplicationsTab does not show any useful information, but could be
+ used as a template for a more complicated example:
+
+ \snippet examples/dialogs/tabdialog/tabdialog.cpp 8
+*/
diff --git a/doc/src/examples/tablemodel.qdoc b/doc/src/examples/tablemodel.qdoc
new file mode 100644
index 0000000..e3d4a22
--- /dev/null
+++ b/doc/src/examples/tablemodel.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example sql/tablemodel
+ \title Table Model Example
+
+ The Table Model example shows how to use a specialized SQL table model with table
+ views to edit information in a database.
+
+ \image tablemodel-example.png
+*/
diff --git a/doc/src/examples/tablet.qdoc b/doc/src/examples/tablet.qdoc
new file mode 100644
index 0000000..476bba1
--- /dev/null
+++ b/doc/src/examples/tablet.qdoc
@@ -0,0 +1,380 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/tablet
+ \title Tablet Example
+
+ This example shows how to use a Wacom tablet in Qt applications.
+
+ \image tabletexample.png
+
+ When you use a tablet with Qt applications, \l{QTabletEvent}s are
+ genarated. You need to reimplement the
+ \l{QWidget::}{tabletEvent()} event handler if you want to handle
+ tablet events. Events are generated when the device used for
+ drawing enters and leaves the proximity of the tablet (i.e., when
+ it is close but not pressed down on it), when a device is pushed
+ down and released from it, and when a device is moved on the
+ tablet.
+
+ The information available in QTabletEvent depends on the device
+ used. The tablet in this example has two different devices for
+ drawing: a stylus and an airbrush. For both devices the event
+ contains the position of the device, pressure on the tablet,
+ vertical tilt, and horizontal tilt (i.e, the angle between the
+ device and the perpendicular of the tablet). The airbrush has a
+ finger wheel; the position of this is also available in the tablet
+ event.
+
+ In this example we implement a drawing program. You can use the
+ stylus to draw on the tablet as you use a pencil on paper. When
+ you draw with the airbrush you get a spray of paint; the finger
+ wheel is used to change the density of the spray. The pressure and
+ tilt can change the alpha and saturation values of the QColor and the
+ width of the QPen used for drawing.
+
+ The example consists of the following:
+
+ \list
+ \o The \c MainWindow class inherits QMainWindow and creates
+ the examples menus and connect their slots and signals.
+ \o The \c TabletCanvas class inherits QWidget and
+ receives tablet events. It uses the events to paint on a
+ QImage, which it draws onto itself.
+ \o The \c TabletApplication class inherits QApplication. This
+ class handles tablet events that are not sent to \c tabletEvent().
+ We will look at this later.
+ \o The \c main() function creates a \c MainWindow and shows it
+ as a top level window.
+ \endlist
+
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow creates a \c TabletCanvas and sets it as its
+ center widget.
+
+ \snippet examples/widgets/tablet/mainwindow.h 0
+
+ The QActions let the user select if the tablets pressure and
+ tilt should change the pen width, color alpha component and color
+ saturation. \c createActions() creates all actions, and \c
+ createMenus() sets up the menus with the actions. We have one
+ QActionGroup for the actions that alter the alpha channel, color
+ saturation and line width respectively. The action groups are
+ connected to the \c alphaActionTriggered(), \c
+ colorSaturationActiontriggered(), and \c
+ lineWidthActionTriggered() slots, which calls functions in \c
+ myCanvas.
+
+
+ \section1 MainWindow Class Implementation
+
+ We start width a look at the constructor \c MainWindow():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 0
+
+ In the constructor we create the canvas, actions, and menus.
+ We set the canvas as the center widget. We also initialize the
+ canvas to match the state of our menus and start drawing with a
+ red color.
+
+ Here is the implementation of \c brushColorAct():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 1
+
+ We let the user pick a color with a QColorDialog. If it is valid,
+ we set a new drawing color with \c setColor().
+
+ Here is the implementation of \c alphaActionTriggered():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 2
+
+ The \c TabletCanvas class supports two ways by which the alpha
+ channel of the drawing color can be changed: tablet pressure and
+ tilt. We have one action for each and an action if the alpha
+ channel should not be changed.
+
+ Here is the implementation of \c lineWidthActionTriggered():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 3
+
+ We check which action is selected in \c lineWidthGroup, and set
+ how the canvas should change the drawing line width.
+
+ Here is the implementation of \c saturationActionTriggered():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 4
+
+ We check which action is selected in \c colorSaturationGroup, and
+ set how the canvas should change the color saturation of the
+ drawing color.
+
+ Here is the implementation of \c saveAct():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 5
+
+ We use the QFileDialog to let the user select a file to save the
+ drawing in. It is the \c TabletCanvas that save the drawing, so we
+ call its \c saveImage() function.
+
+ Here is the implementation of \c loadAct():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 6
+
+ We let the user select the image file to be opened with
+ a QFileDialog; we then ask the canvas to load the image with \c
+ loadImage().
+
+ Here is the implementation of \c aboutAct():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 7
+
+ We show a message box with a short description of the example.
+
+ \c createActions() creates all actions and action groups of
+ the example. We look at the creation of one action group and its
+ actions. See the \l{Application Example}{application example} if
+ you want a high-level introduction to QActions.
+
+ Here is the implementation of \c createActions:
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 8
+ \dots
+ \snippet examples/widgets/tablet/mainwindow.cpp 9
+
+ We want the user to be able to choose if the drawing color's
+ alpha component should be changed by the tablet pressure or tilt.
+ We have one action for each choice and an action if the alpha
+ channel is not to be changed, i.e, the color is opaque. We make
+ the actions checkable; the \c alphaChannelGroup will then ensure
+ that only one of the actions are checked at any time. The \c
+ triggered() signal is emitted when an action is checked.
+
+ \dots
+ \snippet examples/widgets/tablet/mainwindow.cpp 10
+
+ Here is the implementation of \c createMenus():
+
+ \snippet examples/widgets/tablet/mainwindow.cpp 11
+
+ We create the menus of the example and add the actions to them.
+
+
+ \section1 TabletCanvas Class Definition
+
+ The \c TabletCanvas class provides a surface on which the
+ user can draw with a tablet.
+
+ \snippet examples/widgets/tablet/tabletcanvas.h 0
+
+ The canvas can change the alpha channel, color saturation,
+ and line width of the drawing. We have one enum for each of
+ these; their values decide if it is the tablet pressure or tilt
+ that will alter them. We keep a private variable for each, the \c
+ alphaChannelType, \c colorSturationType, and \c penWidthType,
+ which we provide access functions for.
+
+ We draw on a QImage with \c myPen and \c myBrush using \c
+ myColor. The \c saveImage() and \c loadImage() saves and loads
+ the QImage to disk. The image is drawn on the widget in \c
+ paintEvent(). The \c pointerType and \c deviceType keeps the type
+ of pointer, which is either a pen or an eraser, and device
+ currently used on the tablet, which is either a stylus or an
+ airbrush.
+
+ The interpretation of events from the tablet is done in \c
+ tabletEvent(); \c paintImage(), \c updateBrush(), and \c
+ brushPattern() are helper functions used by \c tabletEvent().
+
+
+ \section1 TabletCanvas Class Implementation
+
+ We start with a look at the constructor:
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 0
+
+ In the constructor we initialize our class variables. We need
+ to draw the background of our image, as the default is gray.
+
+ Here is the implementation of \c saveImage():
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 1
+
+ QImage implements functionality to save itself to disk, so we
+ simply call \l{QImage::}{save()}.
+
+ Here is the implementation of \c loadImage():
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 2
+
+ We simply call \l{QImage::}{load()}, which loads the image in \a
+ file.
+
+ Here is the implementation of \c tabletEvent():
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 3
+
+ We get three kind of events to this function: TabletPress,
+ TabletRelease, and TabletMove, which is generated when a device
+ is pressed down on, leaves, or moves on the tablet. We set the \c
+ deviceDown to true when a device is pressed down on the tablet;
+ we then know when we should draw when we receive move events. We
+ have implemented the \c updateBrush() and \c paintImage() helper
+ functions to update \c myBrush and \c myPen after the state of \c
+ alphaChannelType, \c colorSaturationType, and \c lineWidthType.
+
+ Here is the implementation of \c paintEvent():
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 4
+
+ We simply draw the image to the top left of the widget.
+
+ Here is the implementation of \c paintImage():
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 5
+
+ In this function we draw on the image based on the movement of the
+ device. If the device used on the tablet is a stylus we want to draw a
+ line between the positions of the stylus recorded in \c polyLine.
+ If it is an airbrush we want to draw a circle of points with a
+ point density based on the tangential pressure, which is the position
+ of the finger wheel on the airbrush. We use the Qt::BrushStyle to
+ draw the points as it has styles that draw points with different
+ density; we select the style based on the tangential pressure in
+ \c brushPattern().
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 6
+
+ We return a brush style with a point density that increases with
+ the tangential pressure.
+
+ In \c updateBrush() we set the pen and brush used for drawing
+ to match \c alphaChannelType, \c lineWidthType, \c
+ colorSaturationType, and \c myColor. We will examine the code to
+ set up \c myBrush and \c myPen for each of these variables:
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 7
+
+ We fetch the current drawingcolor's hue, saturation, value,
+ and alpha values. \c hValue and \c vValue are set to the
+ horizontal and vertical tilt as a number from 0 to 255. The
+ original values are in degrees from -60 to 60, i.e., 0 equals
+ -60, 127 equals 0, and 255 equals 60 degrees. The angle measured
+ is between the device and the perpendicular of the tablet (see
+ QTabletEvent for an illustration).
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 8
+
+ The alpha channel of QColor is given as a number between 0
+ and 255 where 0 is transparent and 255 is opaque.
+ \l{QTabletEvent::}{pressure()} returns the pressure as a qreal
+ between 0.0 and 1.0. By subtracting 127 from the tilt values and
+ taking the absolute value we get the smallest alpha values (i.e.,
+ the color is most transparent) when the pen is perpendicular to
+ the tablet. We select the largest of the vertical and horizontal
+ tilt value.
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 9
+
+ The colorsaturation is given as a number between 0 and 255. It is
+ set with \l{QColor::}{setHsv()}. We can set the tilt values
+ directly, but must multiply the pressure to a number between 0 and
+ 255.
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 10
+
+ The width of the pen increases with the pressure. When the pen
+ width is controlled with the tilt we let the width increse with
+ the angle between the device and the perpendicular of the tablet.
+
+ \snippet examples/widgets/tablet/tabletcanvas.cpp 11
+
+ We finally check wether the pointer is the stylus or the eraser.
+ If it is the eraser, we set the color to the background color of
+ the image an let the pressure decide the pen width, else we set
+ the colors we have set up previously in the function.
+
+
+ \section1 TabletApplication Class Definition
+
+ We inherit QApplication in this class because we want to
+ reimplement the \l{QApplication::}{event()} function.
+
+ \snippet examples/widgets/tablet/tabletapplication.h 0
+
+ We keep a \c TabletCanvas we send the device type of the events we
+ handle in the \c event() function to. The TabletEnterProximity
+ and TabletLeaveProximity events are not sendt to the QApplication
+ object, while other tablet events are sendt to the QWidget's
+ \c event(), which sends them on to \l{QWidget::}{tabletEvent()}.
+ Since we want to handle these events we have implemented \c
+ TabletApplication.
+
+
+ \section1 TabletApplication Class Implementation
+
+ Here is the implementation of \c event():
+
+ \snippet examples/widgets/tablet/tabletapplication.cpp 0
+
+ We use this function to handle the TabletEnterProximity and
+ TabletLeaveProximity events, which is generated when a device
+ enters and leaves the proximity of the tablet. The intended use of these
+ events is to do work that is dependent on what kind of device is
+ used on the tablet. This way, you don't have to do this work
+ when other events are generated, which is more frequently than the
+ leave and enter proximity events. We call \c setTabletDevice() in
+ \c TabletCanvas.
+
+ \section1 The \c main() function
+
+ Here is the examples \c main() function:
+
+ \snippet examples/widgets/tablet/main.cpp 0
+
+ In the \c main() function we create a \c MainWinow and display it
+ as a top level window. We use the \c TabletApplication class. We
+ need to set the canvas after the application is created. We cannot
+ use classes that implement event handling before an QApplication
+ object is instantiated.
+*/
diff --git a/doc/src/examples/taskmenuextension.qdoc b/doc/src/examples/taskmenuextension.qdoc
new file mode 100644
index 0000000..b02da6c
--- /dev/null
+++ b/doc/src/examples/taskmenuextension.qdoc
@@ -0,0 +1,457 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/taskmenuextension
+ \title Task Menu Extension Example
+
+ The Task Menu Extension example shows how to create a custom
+ widget plugin for \l {Qt Designer Manual}{\QD}, and how to to use
+ the QDesignerTaskMenuExtension class to provide custom task menu
+ entries associated with the plugin.
+
+ \image taskmenuextension-example-faded.png
+
+ To provide a custom widget that can be used with \QD, we need to
+ supply a self-contained implementation. In this example we use a
+ custom widget designed to show the task menu extension feature:
+ The TicTacToe widget.
+
+ An extension is an object which modifies the behavior of \QD. The
+ QDesignerTaskMenuExtension can provide custom task menu entries
+ when a widget with this extension is selected.
+
+ There are four available types of extensions in \QD:
+
+ \list
+ \o QDesignerContainerExtension provides an extension that allows
+ you to add (and delete) pages to a multi-page container plugin
+ in \QD.
+ \o QDesignerMemberSheetExtension provides an extension that allows
+ you to manipulate a widget's member functions which is displayed
+ when configuring connections using Qt Designer's mode for editing
+ signals and slots.
+ \o QDesignerPropertySheetExtension provides an extension that
+ allows you to manipulate a widget's properties which is displayed
+ in Qt Designer's property editor.
+ \o QDesignerTaskMenuExtension provides an extension that allows
+ you to add custom menu entries to \QD's task menu.
+ \endlist
+
+ You can use all the extensions following the same pattern as in
+ this example, only replacing the respective extension base
+ class. For more information, see the \l {QtDesigner Module}.
+
+ The Task Menu Extension example consists of five classes:
+
+ \list
+ \o \c TicTacToe is a custom widget that lets the user play
+ the Tic-Tac-Toe game.
+ \o \c TicTacToePlugin exposes the \c TicTacToe class to \QD.
+ \o \c TicTacToeTaskMenuFactory creates a \c TicTacToeTaskMenu object.
+ \o \c TicTacToeTaskMenu provides the task menu extension, i.e the
+ plugin's associated task menu entries.
+ \o \c TicTacToeDialog lets the user modify the state of a
+ Tic-Tac-Toe plugin loaded into \QD.
+ \endlist
+
+ The project file for custom widget plugins needs some additional
+ information to ensure that they will work within \QD. For example,
+ custom widget plugins rely on components supplied with \QD, and
+ this must be specified in the project file that we use. We will
+ first take a look at the plugin's project file.
+
+ Then we will continue by reviewing the \c TicTacToePlugin class,
+ and take a look at the \c TicTacToeTaskMenuFactory and \c
+ TicTacToeTaskMenu classes. Finally, we will review the \c
+ TicTacToeDialog class before we take a quick look at the \c
+ TicTacToe widget's class definition.
+
+ \section1 The Project File: taskmenuextension.pro
+
+ The project file must contain some additional information to
+ ensure that the plugin will work as expected:
+
+ \snippet examples/designer/taskmenuextension/taskmenuextension.pro 0
+ \snippet examples/designer/taskmenuextension/taskmenuextension.pro 1
+
+ The \c TEMPLATE variable's value makes \c qmake create the custom
+ widget as a library. Later, we will ensure that the widget will be
+ recognized as a plugin by Qt by using the Q_EXPORT_PLUGIN2() macro to
+ export the relevant widget information.
+
+ The \c CONFIG variable contains two values, \c designer and \c
+ plugin:
+
+ \list
+ \o \c designer: Since custom widgets plugins rely on components
+ supplied with \QD, this value ensures that our plugin links against
+ \QD's library (\c libQtDesigner.so).
+
+ \o \c plugin: We also need to ensure that \c qmake considers the
+ custom widget a \e plugin library.
+ \endlist
+
+ When Qt is configured to build in both debug and release modes,
+ \QD will be built in release mode. When this occurs, it is
+ necessary to ensure that plugins are also built in release
+ mode. For that reason we add the \c debug_and_release value to
+ the \c CONFIG variable. Otherwise, if a plugin is built in a mode
+ that is incompatible with \QD, it won't be loaded and
+ installed.
+
+ The header and source files for the widget are declared in the
+ usual way:
+
+ \snippet examples/designer/taskmenuextension/taskmenuextension.pro 2
+
+ We provide an implementation of the plugin interface so that \QD
+ can use the custom widget. In this particular example we also
+ provide implementations of the task menu extension and the
+ extension factory as well as a dialog implementation.
+
+ It is important to ensure that the plugin is installed in a
+ location that is searched by \QD. We do this by specifying a
+ target path for the project and adding it to the list of items to
+ install:
+
+ \snippet doc/src/snippets/code/doc_src_examples_taskmenuextension.qdoc 0
+
+ The task menu extension is created as a library, and will be
+ installed alongside the other \QD plugins when the project is
+ installed (using \c{make install} or an equivalent installation
+ procedure).
+
+ Note that if you want the plugins to appear in a Visual Studio
+ integration, the plugins must be built in release mode and their
+ libraries must be copied into the plugin directory in the install
+ path of the integration (for an example, see \c {C:/program
+ files/trolltech as/visual studio integration/plugins}).
+
+ For more information about plugins, see the \l {How to Create Qt
+ Plugins} documentation.
+
+ \section1 TicTacToePlugin Class Definition
+
+ The \c TicTacToePlugin class exposes \c the TicTacToe class to
+ \QD. Its definition is equivalent to the \l
+ {designer/customwidgetplugin}{Custom Widget Plugin} example's
+ plugin class which is explained in detail. The only part of the
+ class definition that is specific to this particular custom widget
+ is the class name:
+
+ \snippet examples/designer/taskmenuextension/tictactoeplugin.h 0
+
+ The plugin class provides \QD with basic information about our
+ plugin, such as its class name and its include file. Furthermore
+ it knows how to create instances of the \c TicTacToe widget.
+ TicTacToePlugin also defines the \l
+ {QDesignerCustomWidgetInterface::initialize()}{initialize()}
+ function which is called after the plugin is loaded into \QD. The
+ function's QDesignerFormEditorInterface parameter provides the
+ plugin with a gateway to all of \QD's API's.
+
+ The \c TicTacToePlugin class inherits from both QObject and
+ QDesignerCustomWidgetInterface. It is important to remember, when
+ using multiple inheritance, to ensure that all the interfaces
+ (i.e. the classes that doesn't inherit Q_OBJECT) are made known to
+ the meta object system using the Q_INTERFACES() macro. This
+ enables \QD to use \l qobject_cast() to query for supported
+ interfaces using nothing but a QObject pointer.
+
+ \section1 TicTacToePlugin Class Implementation
+
+ The TicTacToePlugin class implementation is in most parts
+ equivalent to the \l {designer/customwidgetplugin}{Custom Widget
+ Plugin} example's plugin class:
+
+ \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 0
+
+ The only function that differs significantly is the initialize()
+ function:
+
+ \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 1
+
+ The \c initialize() function takes a QDesignerFormEditorInterface
+ object as argument. The QDesignerFormEditorInterface class
+ provides access to Qt Designer's components.
+
+ In \QD you can create two kinds of plugins: custom widget plugins
+ and tool plugins. QDesignerFormEditorInterface provides access to
+ all the \QD components that you normally need to create a tool
+ plugin: the extension manager, the object inspector, the property
+ editor and the widget box. Custom widget plugins have access to
+ the same components.
+
+ \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 2
+
+ When creating extensions associated with custom widget plugins, we
+ need to access \QD's current extension manager which we retrieve
+ from the QDesignerFormEditorInterface parameter.
+
+ \QD's QDesignerFormEditorInterface holds information about all Qt
+ Designer's components: The action editor, the object inspector,
+ the property editor, the widget box, and the extension and form
+ window managers.
+
+ The QExtensionManager class provides extension management
+ facilities for \QD. Using \QD's current extension manager you can
+ retrieve the extension for a given object. You can also register
+ and unregister an extension for a given object. Remember that an
+ extension is an object which modifies the behavior of \QD.
+
+ When registrering an extension, it is actually the associated
+ extension factory that is registered. In \QD, extension factories
+ are used to look up and create named extensions as they are
+ required. So, in this example, the task menu extension itself is
+ not created until a task menu is requested by the user.
+
+ \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 3
+
+ We create a \c TicTacToeTaskMenuFactory object that we register
+ using \QD's current \l {QExtensionManager}{extension manager}
+ retrieved from the QDesignerFormEditorInterface parameter. The
+ first argument is the newly created factory and the second
+ argument is an extension identifier which is a string. The \c
+ Q_TYPEID() macro simply converts the string into a QLatin1String.
+
+ The \c TicTacToeTaskMenuFactory class is a subclass of
+ QExtensionFactory. When the user request a task menu by clicking
+ the right mouse button over a widget with the specified task menu
+ extension, \QD's extension manager will run through all its
+ registered factories invoking the first one that is able to create
+ a task menu extension for the selected widget. This factory will
+ in turn create a \c TicTacToeTaskMenu object (the extension).
+
+ We omit to reimplement the
+ QDesignerCustomWidgetInterface::domXml() function (which include
+ default settings for the widget in the standard XML format used by
+ Qt Designer), since no default values are necessary.
+
+ \snippet examples/designer/taskmenuextension/tictactoeplugin.cpp 4
+
+ Finally, we use the Q_EXPORT_PLUGIN2() macro to export the
+ TicTacToePlugin class for use with Qt's plugin handling classes:
+ This macro ensures that \QD can access and construct the custom
+ widget. Without this macro, there is no way for \QD to use the
+ widget.
+
+ \section1 TicTacToeTaskMenuFactory Class Definition
+
+ The \c TicTacToeTaskMenuFactory class inherits QExtensionFactory
+ which provides a standard extension factory for \QD.
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.h 1
+
+ The subclass's purpose is to reimplement the
+ QExtensionFactory::createExtension() function, making it able to
+ create a \c TicTacToe task menu extension.
+
+ \section1 TicTacToeTaskMenuFactory Class Implementation
+
+ The class constructor simply calls the QExtensionFactory base
+ class constructor:
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 4
+
+ As described above, the factory is invoked when the user request a
+ task menu by clicking the right mouse button over a widget with
+ the specified task menu extension in \QD.
+
+ \QD's behavior is the same whether the requested extension is
+ associated with a container, a member sheet, a property sheet or a
+ task menu: Its extension manager runs through all its registered
+ extension factories calling \c createExtension() for each until
+ one responds by creating the requested extension.
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 5
+
+ So the first thing we do in \c
+ TicTacToeTaskMenuFactory::createExtension() is to check if the
+ requested extension is a task menu extension. If it is, and the
+ widget requesting it is a \c TicTacToe widget, we create and
+ return a \c TicTacToeTaskMenu object. Otherwise, we simply return
+ a null pointer, allowing \QD's extension manager to continue its
+ search through the registered factories.
+
+
+ \section1 TicTacToeTaskMenu Class Definition
+
+ \image taskmenuextension-menu.png
+
+ The \c TicTacToeTaskMenu class inherits QDesignerTaskMenuExtension
+ which allows you to add custom entries (in the form of QActions)
+ to the task menu in \QD.
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.h 0
+
+ We reimplement the \c preferredEditAction() and \c taskActions()
+ functions. Note that we implement a constructor that takes \e two
+ arguments: the parent widget, and the \c TicTacToe widget for
+ which the task menu is requested.
+
+ In addition we declare the private \c editState() slot, our custom
+ \c editStateAction and a private pointer to the \c TicTacToe
+ widget which state we want to modify.
+
+ \section1 TicTacToeTaskMenu Class Implementation
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 0
+
+ In the constructor we first save the reference to the \c TicTacToe
+ widget sent as parameter, i.e the widget which state we want to
+ modify. We will need this later when our custom action is
+ invoked. We also create our custom \c editStateAction and connect
+ it to the \c editState() slot.
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 1
+
+ The \c editState() slot is called whenever the user chooses the
+ \gui {Edit State...} option in a \c TicTacToe widget's task menu. The
+ slot creates a \c TicTacToeDialog presenting the current state of
+ the widget, and allowing the user to edit its state by playing the
+ game.
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 2
+
+ We reimplement the \c preferredEditAction() function to return our
+ custom \c editStateAction as the action that should be invoked
+ when selecting a \c TicTacToe widget and pressing \key F2 .
+
+ \snippet examples/designer/taskmenuextension/tictactoetaskmenu.cpp 3
+
+ We reimplement the \c taskActions() function to return a list of
+ our custom actions making these appear on top of the default menu
+ entries in a \c TicTacToe widget's task menu.
+
+ \section1 TicTacToeDialog Class Definition
+
+ \image taskmenuextension-dialog.png
+
+ The \c TicTacToeDialog class inherits QDialog. The dialog lets the
+ user modify the state of the currently selected Tic-Tac-Toe
+ plugin.
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.h 0
+
+ We reimplement the \c sizeHint() function. We also declare two
+ private slots: \c resetState() and \c saveState(). In addition to
+ the dialog's buttons and layouts we declare two \c TicTacToe
+ pointers, one to the widget the user can interact with and the
+ other to the original custom widget plugin which state the user
+ wants to edit.
+
+ \section1 TicTacToeDialog Class Implementation
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 0
+
+ In the constructor we first save the reference to the TicTacToe
+ widget sent as parameter, i.e the widget which state the user want
+ to modify. Then we create a new \c TicTacToe widget, and set its
+ state to be equivalent to the parameter widget's state.
+
+ Finally, we create the dialog's buttons and layout.
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 1
+
+ We reimplement the \c sizeHint() function to ensure that the
+ dialog is given a reasonable size.
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 2
+
+ The \c resetState() slot is called whenever the user press the
+ \gui Reset button. The only thing we do is to call the \c
+ clearBoard() function for the editor widget, i.e. the \c TicTacToe
+ widget we created in the dialog's constructor.
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 3
+
+ The \c saveState() slot is called whenever the user press the \gui
+ OK button, and transfers the state of the editor widget to the
+ widget which state we want to modify. In order to make the change
+ of state visible to \QD we need to set the latter widget's state
+ property using the QDesignerFormWindowInterface class.
+
+ QDesignerFormWindowInterface provides you with information about
+ the associated form window as well as allowing you to alter its
+ properties. The interface is not intended to be instantiated
+ directly, but to provide access to Qt Designer's current form
+ windows controlled by Qt Designer's form window manager.
+
+ If you are looking for the form window containing a specific
+ widget, you can use the static
+ QDesignerFormWindowInterface::findFormWindow() function:
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 4
+
+ After retrieving the form window of the widget (which state we
+ want to modify), we use the QDesignerFormWindowInterface::cursor()
+ function to retrieve the form window's cursor.
+
+ The QDesignerFormWindowCursorInterface class provides an interface
+ to the form window's text cursor. Once we have cursor, we can
+ finally set the state property using the
+ QDesignerFormWindowCursorInterface::setProperty() function.
+
+ \snippet examples/designer/taskmenuextension/tictactoedialog.cpp 5
+
+ In the end we call the QEvent::accept() function which sets the
+ accept flag of the event object. Setting the \c accept parameter
+ indicates that the event receiver wants the event. Unwanted events
+ might be propagated to the parent widget.
+
+ \section1 TicTacToe Class Definition
+
+ The \c TicTacToe class is a custom widget that lets the user play
+ the Tic-Tac-Toe game.
+
+ \snippet examples/designer/taskmenuextension/tictactoe.h 0
+
+ The main details to observe in the \c TicTacToe class defintion is
+ the declaration of the \c state property and its \c state() and \c
+ setState() functions.
+
+ We need to declare the \c TicTacToe widget's state as a property
+ to make it visible to \QD; allowing \QD to manage it in the same
+ way it manages the properties the \c TicTacToe widget inherits
+ from QWidget and QObject, for example featuring the property
+ editor.
+*/
diff --git a/doc/src/examples/tetrix.qdoc b/doc/src/examples/tetrix.qdoc
new file mode 100644
index 0000000..b9adb98
--- /dev/null
+++ b/doc/src/examples/tetrix.qdoc
@@ -0,0 +1,445 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/tetrix
+ \title Tetrix Example
+
+ The Tetrix example is a Qt version of the classic Tetrix game.
+
+ \image tetrix-example.png
+
+ The object of the game is to stack pieces dropped from the top of the
+ playing area so that they fill entire rows at the bottom of the playing area.
+
+ When a row is filled, all the blocks on that row are removed, the player earns
+ a number of points, and the pieces above are moved down to occupy that row.
+ If more than one row is filled, the blocks on each row are removed, and the
+ player earns extra points.
+
+ The \gui{Left} cursor key moves the current piece one space to the left, the
+ \gui{Right} cursor key moves it one space to the right, the \gui{Up} cursor
+ key rotates the piece counter-clockwise by 90 degrees, and the \gui{Down}
+ cursor key rotates the piece clockwise by 90 degrees.
+
+ To avoid waiting for a piece to fall to the bottom of the board, press \gui{D}
+ to immediately move the piece down by one row, or press the \gui{Space} key to
+ drop it as close to the bottom of the board as possible.
+
+ This example shows how a simple game can be created using only three classes:
+
+ \list
+ \o The \c TetrixWindow class is used to display the player's score, number of
+ lives, and information about the next piece to appear.
+ \o The \c TetrixBoard class contains the game logic, handles keyboard input, and
+ displays the pieces on the playing area.
+ \o The \c TetrixPiece class contains information about each piece.
+ \endlist
+
+ In this approach, the \c TetrixBoard class is the most complex class, since it
+ handles the game logic and rendering. One benefit of this is that the
+ \c TetrixWindow and \c TetrixPiece classes are very simple and contain only a
+ minimum of code.
+
+ \section1 TetrixWindow Class Definition
+
+ The \c TetrixWindow class is used to display the game information and contains
+ the playing area:
+
+ \snippet examples/widgets/tetrix/tetrixwindow.h 0
+
+ We use private member variables for the board, various display widgets, and
+ buttons to allow the user to start a new game, pause the current game, and quit.
+
+ Although the window inherits QWidget, the constructor does not provide an
+ argument to allow a parent widget to be specified. This is because the window
+ will always be used as a top-level widget.
+
+ \section1 TetrixWindow Class Implementation
+
+ The constructor sets up the user interface elements for the game:
+
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 0
+
+ We begin by constructing a \c TetrixBoard instance for the playing area and a
+ label that shows the next piece to be dropped into the playing area; the label
+ is initially empty.
+
+ Three QLCDNumber objects are used to display the score, number of lives, and
+ lines removed. These initially show default values, and will be filled in
+ when a game begins:
+
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 1
+
+ Three buttons with shortcuts are constructed so that the user can start a
+ new game, pause the current game, and quit the application:
+
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 2
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 3
+
+ These buttons are configured so that they never receive the keyboard focus;
+ we want the keyboard focus to remain with the \c TetrixBoard instance so that
+ it receives all the keyboard events. Nonetheless, the buttons will still respond
+ to \key{Alt} key shortcuts.
+
+ We connect \l{QAbstractButton::}{clicked()} signals from the \gui{Start}
+ and \gui{Pause} buttons to the board, and from the \gui{Quit} button to the
+ application's \l{QApplication::}{quit()} slot.
+
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 4
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 5
+
+ Signals from the board are also connected to the LCD widgets for the purpose of
+ updating the score, number of lives, and lines removed from the playing area.
+
+ We place the label, LCD widgets, and the board into a QGridLayout
+ along with some labels that we create with the \c createLabel() convenience
+ function:
+
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 6
+
+ Finally, we set the grid layout on the widget, give the window a title, and
+ resize it to an appropriate size.
+
+ The \c createLabel() convenience function simply creates a new label on the
+ heap, gives it an appropriate alignment, and returns it to the caller:
+
+ \snippet examples/widgets/tetrix/tetrixwindow.cpp 7
+
+ Since each label will be used in the widget's layout, it will become a child
+ of the \c TetrixWindow widget and, as a result, it will be deleted when the
+ window is deleted.
+
+ \section1 TetrixPiece Class Definition
+
+ The \c TetrixPiece class holds information about a piece in the game's
+ playing area, including its shape, position, and the range of positions it can
+ occupy on the board:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.h 0
+
+ Each shape contains four blocks, and these are defined by the \c coords private
+ member variable. Additionally, each piece has a high-level description that is
+ stored internally in the \c pieceShape variable.
+
+ The constructor is written inline in the definition, and simply ensures that
+ each piece is initially created with no shape. The \c shape() function simply
+ returns the contents of the \c pieceShape variable, and the \c x() and \c y()
+ functions return the x and y-coordinates of any given block in the shape.
+
+ \section1 TetrixPiece Class Implementation
+
+ The \c setRandomShape() function is used to select a random shape for a piece:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 0
+
+ For convenience, it simply chooses a random shape from the \c TetrixShape enum
+ and calls the \c setShape() function to perform the task of positioning the
+ blocks.
+
+ The \c setShape() function uses a look-up table of pieces to associate each
+ shape with an array of block positions:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 1
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 2
+
+ These positions are read from the table into the piece's own array of positions,
+ and the piece's internal shape information is updated to use the new shape.
+
+ The \c x() and \c y() functions are implemented inline in the class definition,
+ returning positions defined on a grid that extends horizontally and vertically
+ with coordinates from -2 to 2. Although the predefined coordinates for each
+ piece only vary horizontally from -1 to 1 and vertically from -1 to 2, each
+ piece can be rotated by 90, 180, and 270 degrees.
+
+ The \c minX() and \c maxX() functions return the minimum and maximum horizontal
+ coordinates occupied by the blocks that make up the piece:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 3
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 4
+
+ Similarly, the \c minY() and \c maxY() functions return the minimum and maximum
+ vertical coordinates occupied by the blocks:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 5
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 6
+
+ The \c rotatedLeft() function returns a new piece with the same shape as an
+ existing piece, but rotated counter-clockwise by 90 degrees:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 7
+
+ Similarly, the \c rotatedRight() function returns a new piece with the same
+ shape as an existing piece, but rotated clockwise by 90 degrees:
+
+ \snippet examples/widgets/tetrix/tetrixpiece.cpp 9
+
+ These last two functions enable each piece to create rotated copies of itself.
+
+ \section1 TetrixBoard Class Definition
+
+ The \c TetrixBoard class inherits from QFrame and contains the game logic and display features:
+
+ \snippet examples/widgets/tetrix/tetrixboard.h 0
+
+ Apart from the \c setNextPieceLabel() function and the \c start() and \c pause()
+ public slots, we only provide public functions to reimplement QWidget::sizeHint()
+ and QWidget::minimumSizeHint(). The signals are used to communicate changes to
+ the player's information to the \c TetrixWindow instance.
+
+ The rest of the functionality is provided by reimplementations of protected event
+ handlers and private functions:
+
+ \snippet examples/widgets/tetrix/tetrixboard.h 1
+
+ The board is composed of a fixed-size array whose elements correspond to
+ spaces for individual blocks. Each element in the array contains a \c TetrixShape
+ value corresponding to the type of shape that occupies that element.
+
+ Each shape on the board will occupy four elements in the array, and these will
+ all contain the enum value that corresponds to the type of the shape.
+
+ We use a QBasicTimer to control the rate at which pieces fall toward the bottom
+ of the playing area. This allows us to provide an implementation of
+ \l{QObject::}{timerEvent()} that we can use to update the widget.
+
+ \section1 TetrixBoard Class Implementation
+
+ In the constructor, we customize the frame style of the widget, ensure that
+ keyboard input will be received by the widget by using Qt::StrongFocus for the
+ focus policy, and initialize the game state:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 0
+
+ The first (next) piece is also set up with a random shape.
+
+ The \c setNextPieceLabel() function is used to pass in an externally-constructed
+ label to the board, so that it can be shown alongside the playing area:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 1
+
+ We provide a reasonable size hint and minimum size hint for the board, based on
+ the size of the space for each block in the playing area:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 2
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 3
+
+ By using a minimum size hint, we indicate to the layout in the parent widget
+ that the board should not shrink below a minimum size.
+
+ A new game is started when the \c start() slot is called. This resets the
+ game's state, the player's score and level, and the contents of the board:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 4
+
+ We also emit signals to inform other components of these changes before creating
+ a new piece that is ready to be dropped into the playing area. We start the
+ timer that determines how often the piece drops down one row on the board.
+
+ The \c pause() slot is used to temporarily stop the current game by stopping the
+ internal timer:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 5
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 6
+
+ We perform checks to ensure that the game can only be paused if it is already
+ running and not already paused.
+
+ The \c paintEvent() function is straightforward to implement. We begin by
+ calling the base class's implementation of \l{QWidget::}{paintEvent()} before
+ constructing a QPainter for use on the board:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 7
+
+ Since the board is a subclass of QFrame, we obtain a QRect that covers the area
+ \e inside the frame decoration before drawing our own content.
+
+ If the game is paused, we want to hide the existing state of the board and
+ show some text. We achieve this by painting text onto the widget and returning
+ early from the function. The rest of the painting is performed after this point.
+
+ The position of the top of the board is found by subtracting the total height
+ of each space on the board from the bottom of the frame's internal rectangle.
+ For each space on the board that is occupied by a piece, we call the
+ \c drawSquare() function to draw a block at that position.
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 8
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 9
+
+ Spaces that are not occupied by blocks are left blank.
+
+ Unlike the existing pieces on the board, the current piece is drawn
+ block-by-block at its current position:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 10
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 11
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 12
+
+ The \c keyPressEvent() handler is called whenever the player presses a key while
+ the \c TetrixBoard widget has the keyboard focus.
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 13
+
+ If there is no current game, the game is running but paused, or if there is no
+ current shape to control, we simply pass on the event to the base class.
+
+ We check whether the event is about any of the keys that the player uses to
+ control the current piece and, if so, we call the relevant function to handle
+ the input:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 14
+
+ In the case where the player presses a key that we are not interested in, we
+ again pass on the event to the base class's implementation of
+ \l{QWidget::}{keyPressEvent()}.
+
+ The \c timerEvent() handler is called every time the class's QBasicTimer
+ instance times out. We need to check that the event we receive corresponds to
+ our timer. If it does, we can update the board:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 15
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 16
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 17
+
+ If a row (or line) has just been filled, we create a new piece and reset the
+ timer; otherwise we move the current piece down by one row. We let the base
+ class handle other timer events that we receive.
+
+ The \c clearBoard() function simply fills the board with the
+ \c TetrixShape::NoShape value:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 18
+
+ The \c dropDown() function moves the current piece down as far as possible on
+ the board, either until it is touching the bottom of the playing area or it is
+ stacked on top of another piece:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 19
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 20
+
+ The number of rows the piece has dropped is recorded and passed to the
+ \c pieceDropped() function so that the player's score can be updated.
+
+ The \c oneLineDown() function is used to move the current piece down by one row
+ (line), either when the user presses the \gui{D} key or when the piece is
+ scheduled to move:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 21
+
+ If the piece cannot drop down by one line, we call the \c pieceDropped() function
+ with zero as the argument to indicate that it cannot fall any further, and that
+ the player should receive no extra points for the fall.
+
+ The \c pieceDropped() function itself is responsible for awarding points to the
+ player for positioning the current piece, checking for full rows on the board
+ and, if no lines have been removed, creating a new piece to replace the current
+ one:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 22
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 23
+
+ We call \c removeFullLines() each time a piece has been dropped. This scans
+ the board from bottom to top, looking for blank spaces on each row.
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 24
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 25
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 26
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 27
+
+ If a row contains no blank spaces, the rows above it are copied down by one row
+ to compress the stack of pieces, the top row on the board is cleared, and the
+ number of full lines found is incremented.
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 28
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 29
+
+ If some lines have been removed, the player's score and the total number of lines
+ removed are updated. The \c linesRemoved() and \c scoreChanged() signals are
+ emitted to send these new values to other widgets in the window.
+
+ Additionally, we set the timer to elapse after half a second, set the
+ \c isWaitingAfterLine flag to indicate that lines have been removed, unset
+ the piece's shape to ensure that it is not drawn, and update the widget.
+ The next time that the \c timerEvent() handler is called, a new piece will be
+ created and the game will continue.
+
+ The \c newPiece() function places the next available piece at the top of the
+ board, and creates a new piece with a random shape:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 30
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 31
+
+ We place a new piece in the middle of the board at the top. The game is over if
+ the piece can't move, so we unset its shape to prevent it from being drawn, stop
+ the timer, and unset the \c isStarted flag.
+
+ The \c showNextPiece() function updates the label that shows the next piece to
+ be dropped:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 32
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 33
+
+ We draw the piece's component blocks onto a pixmap that is then set on the label.
+
+ The \c tryMove() function is used to determine whether a piece can be positioned
+ at the specified coordinates:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 34
+
+ We examine the spaces on the board that the piece needs to occupy and, if they
+ are already occupied by other pieces, we return \c false to indicate that the
+ move has failed.
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 35
+
+ If the piece could be placed on the board at the desired location, we update the
+ current piece and its position, update the widget, and return \c true to indicate
+ success.
+
+ The \c drawSquare() function draws the blocks (normally squares) that make up
+ each piece using different colors for pieces with different shapes:
+
+ \snippet examples/widgets/tetrix/tetrixboard.cpp 36
+
+ We obtain the color to use from a look-up table that relates each shape to an
+ RGB value, and use the painter provided to draw the block at the specified
+ coordinates.
+*/
diff --git a/doc/src/examples/textfinder.qdoc b/doc/src/examples/textfinder.qdoc
new file mode 100644
index 0000000..2eea15d
--- /dev/null
+++ b/doc/src/examples/textfinder.qdoc
@@ -0,0 +1,173 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example uitools/textfinder
+ \title Text Finder Example
+
+ The Text Finder example demonstrates how to dynamically process forms
+ using the QtUiTools module. Dynamic form processing enables a form to
+ be processed at run-time only by changing the .ui file for the project.
+ The program allows the user to look up a particular word within the
+ contents of a text file. This text file is included in the project's
+ resource and is loaded into the display at startup.
+
+ \table
+ \row \o \inlineimage textfinder-example-find.png
+ \o \inlineimage textfinder-example-find2.png
+ \endtable
+
+ \section1 Setting Up The Resource File
+
+ The resources required for Text Finder are:
+ \list
+ \o \e{textfinder.ui} - the user interface file created in QtDesigner
+ \o \e{input.txt} - a text file containing some text to be displayed
+ in the QTextEdit
+ \endlist
+
+ \e{textfinder.ui} contains all the necessary QWidget objects for the
+ Text Finder. A QLineEdit is used for the user input, a QTextEdit is
+ used to display the contents of \e{input.txt}, a QLabel is used to
+ display the text "Keyword", and a QPushButton is used for the "Find"
+ button. The screenshot below shows the preview obtained in QtDesigner.
+
+ \image textfinder-example-userinterface.png
+
+ A \e{textfinder.qrc} file is used to store both the \e{textfinder.ui}
+ and \e{input.txt} in the application's executable. The file contains
+ the following code:
+
+ \quotefile examples/uitools/textfinder/textfinder.qrc
+
+ For more information on resource files, see \l{The Qt Resource System}.
+
+ To generate a form at run-time, the example is linked against the
+ QtUiTools module library. This is done in the \c{textfinder.pro} file
+ that contains the following lines:
+
+ \snippet doc/src/snippets/code/doc_src_examples_textfinder.qdoc 0
+
+ \section1 TextFinder Class Definition
+
+ The \c TextFinder class is a subclass of QWidget and it hosts the
+ \l{QWidget}s we need to access in the user interface. The QLabel in the
+ user interface is not declared here as we do not need to access it.
+
+ \snippet examples/uitools/textfinder/textfinder.h 0
+
+ The slot \c{on_find_Button_clicked()} is a slot named according to the
+ \l{Using a Designer .ui File in Your Application#Automatic Connections}
+ {Automatic Connection} naming convention required
+ by \c uic.
+
+ \section1 TextFinder Class Implementation
+
+ The \c TextFinder class's constructor calls the \c loadUiFile() function
+ and then uses \c qFindChild() to access the user interface's
+ \l{QWidget}s.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 0
+
+ We then use QMetaObject's system to enable signal and slot connections.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 2
+
+ The loadTextFile() function is called to load \c{input.txt} into
+ QTextEdit to displays its contents.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 3a
+
+ The \c{TextFinder}'s layout is set with \l{QWidget::}{setLayout()}.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 3b
+
+ Finally, the window title is set to \e {Text Finder} and \c isFirstTime is
+ set to true.
+
+ \c isFirstTime is used as a flag to indicate whether the search operation
+ has been performed more than once. This is further explained with the
+ \c{on_findButton_clicked()} function.
+
+ The \c{loadUiFile()} function is used to load the user interface file
+ previously created in QtDesigner. The QUiLoader class is instantiated
+ and its \c load() function is used to load the form into \c{formWidget}
+ that acts as a place holder for the user interface. The function then
+ returns \c{formWidget} to its caller.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 4
+
+ As mentioned earlier, the loadTextFile() function loads \e{input.txt}
+ into QTextEdit to display its contents. Data is read using QTextStream
+ into a QString object, \c line with the QTextStream::readAll() function.
+ The contents of \c line are then appended to \c{ui_textEdit}.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 5
+
+ The \c{on_findButton_clicked()} function is a slot that is connected to
+ \c{ui_findButton}'s \c clicked() signal. The \c searchString is extracted
+ from the \c ui_lineEdit and the \c document is extracted from \c textEdit.
+ In event there is an empty \c searchString, a QMessageBox is used,
+ requesting the user to enter a word. Otherwise, we traverse through the
+ words in \c ui_textEdit, and highlight all ocurrences of the
+ \c searchString . Two QTextCursor objects are used: One to traverse through
+ the words in \c line and another to keep track of the edit blocks.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 7
+
+ The \c isFirstTime flag is set to false the moment \c findButton is
+ clicked. This is necessary to undo the previous text highlight before
+ highlighting the user's next search string. Also, the \c found flag
+ is used to indicate if the \c searchString was found within the contents
+ of \c ui_textEdit. If it was not found, a QMessageBox is used
+ to inform the user.
+
+ \snippet examples/uitools/textfinder/textfinder.cpp 9
+
+ \section1 \c main() Function
+
+ \snippet examples/uitools/textfinder/main.cpp 0
+
+ The \c main() function initialises the \e{textfinder.qrc} resource file
+ and instantiates as well as displays \c TextFinder.
+
+ \sa{Calculator Builder Example}, {World Time Clock Builder Example}
+ */
diff --git a/doc/src/examples/textobject.qdoc b/doc/src/examples/textobject.qdoc
new file mode 100644
index 0000000..cc5a6b6
--- /dev/null
+++ b/doc/src/examples/textobject.qdoc
@@ -0,0 +1,170 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example richtext/textobject
+ \title Text Object Example
+
+ The Text Object example shows how to insert an SVG file into a
+ QTextDocument.
+
+ \image textobject-example.png
+
+ A QTextDocument consists of a hierarchy of elements, such as text blocks and
+ frames. A text object describes the structure or format of one or more of these
+ elements. For instance, images imported from HTML are implemented using text
+ objects. Text objects are used by the document's
+ \l{QAbstractTextDocumentLayout}{layout} to lay out and render (paint) the
+ document. Each object knows how to paint the elements they govern, and
+ calculates their size.
+
+ To be able to insert an SVG image into a text document, we create
+ a text object, and implement painting for that object. This object
+ can then be \l{QTextCharFormat::setObjectType()}{set} on a
+ QTextCharFormat. We also register the text object with the layout
+ of the document, enabling it to draw \l{QTextCharFormat}s governed
+ by our text object. We can summarize the procedure with the
+ following steps:
+
+ \list
+ \o Implement the text object.
+ \o Register the text object with the layout of the text
+ document.
+ \o Set the text object on a QTextCharFormat.
+ \o Insert a QChar::ObjectReplacementCharacter with that
+ text char format into the document.
+ \endlist
+
+ The example consists of the following classes:
+
+ \list
+ \o \c{SvgTextObject} implements the text object.
+ \o \c{Window} shows a QTextEdit into which SVG images can be
+ inserted.
+ \endlist
+
+ \section1 SvgTextObject Class Definition
+
+ Let's take a look at the header file of \c {SvgTextObject}:
+
+ \snippet examples/richtext/textobject/svgtextobject.h 0
+
+ A text object is a QObject that implements QTextObjectInterface.
+ Note that the first class inherited must be QObject, and that
+ you must use Q_INTERFACES to let Qt know that your class
+ implements QTextObjectInterface.
+
+ The document layout keeps a collection of text objects stored as
+ \l{QObject}s, each of which has an associated object type. The
+ layout casts the QObject for the associated object type into the
+ QTextObjectInterface.
+
+ The \l{QTextObjectInterface::}{intrinsicSize()} and
+ \l{QTextObjectInterface::}{drawObject()} functions are then used
+ to calculate the size of the text object and draw it.
+
+ \section1 SvgTextObject Class Implementation
+
+ We start of by taking a look at the
+ \l{QTextObjectInterface::}{intrinsicSize()} function:
+
+ \snippet examples/richtext/textobject/svgtextobject.cpp 0
+
+ \c intrinsicSize() is called by the layout to calculate the size
+ of the text object. Notice that we have drawn the SVG image on a
+ QImage. This is because SVG rendering is quite expensive. The
+ example would lag seriously for large images if we drew them
+ with a QSvgRenderer each time.
+
+ \snippet examples/richtext/textobject/svgtextobject.cpp 1
+
+ In \c drawObject(), we paint the SVG image using the QPainter
+ provided by the layout.
+
+ \section1 Window Class Definition
+
+ The \c Window class is a self-contained window that has a
+ QTextEdit in which SVG images can be inserted.
+
+ \snippet examples/richtext/textobject/window.h 0
+
+ The \c insertTextObject() slot inserts an SVG image at the current
+ cursor position, while \c setupTextObject() creates and registers
+ the SvgTextObject with the layout of the text edit's document.
+
+ The constructor simply calls \c setupTextObject() and \c
+ setupGui(), which creates and lays out the widgets of the \c
+ Window.
+
+ \section1 Window Class Implementation
+
+ We will now take a closer look at the functions that are relevant
+ to our text object, starting with the \c setupTextObject()
+ function.
+
+ \snippet examples/richtext/textobject/window.cpp 3
+
+ \c {SvgTextFormat}'s value is the number of our object type. It is
+ used to identify object types by the document layout.
+
+ Note that we only create one SvgTextObject instance; it will be
+ used for all QTextCharFormat's with the \c SvgTextFormat object
+ type.
+
+ Let's move on to the \c insertTextObject() function:
+
+ \snippet examples/richtext/textobject/window.cpp 1
+
+ First, the \c .svg file is opened and its contents are read
+ into the \c svgData array.
+
+ \snippet examples/richtext/textobject/window.cpp 2
+
+ To speed things up, we buffer the SVG image in a QImage. We use
+ \l{QTextFormat::}{setProperty()} to store the QImage in the in the
+ QTextCharFormat. We can retrieve it later with
+ \l{QTextCharFormat::}{property()}.
+
+ We insert the char format in the standard way - using a
+ QTextCursor. Notice that we use the special QChar
+ \l{QChar::}{ObjectReplacementCharacter}.
+*/
+
diff --git a/doc/src/examples/textures.qdoc b/doc/src/examples/textures.qdoc
new file mode 100644
index 0000000..2f0389c3
--- /dev/null
+++ b/doc/src/examples/textures.qdoc
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example opengl/textures
+ \title Textures Example
+
+ The Textures example demonstrates the use of Qt's image classes as textures in
+ applications that use both OpenGL and Qt to display graphics.
+
+ \image textures-example.png
+*/
diff --git a/doc/src/examples/threadedfortuneserver.qdoc b/doc/src/examples/threadedfortuneserver.qdoc
new file mode 100644
index 0000000..d5f2571
--- /dev/null
+++ b/doc/src/examples/threadedfortuneserver.qdoc
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/threadedfortuneserver
+ \title Threaded Fortune Server Example
+
+ The Threaded Fortune Server example shows how to create a server for a
+ simple network service that uses threads to handle requests from different
+ clients. It is intended to be run alongside the Fortune Client example.
+
+ \image threadedfortuneserver-example.png
+
+ The implementation of this example is similar to that of the
+ \l{network/fortuneserver}{Fortune Server} example, but here we will
+ implement a subclass of QTcpServer that starts each connection in a
+ different thread.
+
+ For this we need two classes: FortuneServer, a QTcpServer subclass, and
+ FortuneThread, which inherits QThread.
+
+ \snippet examples/network/threadedfortuneserver/fortuneserver.h 0
+
+ FortuneServer inherits QTcpServer and reimplements
+ QTcpServer::incomingConnection(). We also use it for storing the list of
+ random fortunes.
+
+ \snippet examples/network/threadedfortuneserver/fortuneserver.cpp 0
+
+ We use FortuneServer's constructor to simply generate the list of
+ fortunes.
+
+ \snippet examples/network/threadedfortuneserver/fortuneserver.cpp 1
+
+ Our implementation of QTcpServer::incomingConnection() creates a
+ FortuneThread object, passing the incoming socket descriptor and a random
+ fortune to FortuneThread's constructor. By connecting FortuneThread's
+ finished() signal to QObject::deleteLater(), we ensure that the thread
+ gets deleted once it has finished. We can then call QThread::start(),
+ which starts the thread.
+
+ \snippet examples/network/threadedfortuneserver/fortunethread.h 0
+
+ Moving on to the FortuneThread class, this is a QThread subclass whose job
+ is to write the fortune to the connected socket. The class reimplements
+ QThread::run(), and it has a signal for reporting errors.
+
+ \snippet examples/network/threadedfortuneserver/fortunethread.cpp 0
+
+ FortuneThread's constructor simply stores the socket descriptor and
+ fortune text, so that they are available for run() later on.
+
+ \snippet examples/network/threadedfortuneserver/fortunethread.cpp 1
+
+ The first thing our run() function does is to create a QTcpSocket object
+ on the stack. What's worth noticing is that we are creating this object
+ inside the thread, which automatically associates the socket to the
+ thread's event loop. This ensures that Qt will not try to deliver events
+ to our socket from the main thread while we are accessing it from
+ FortuneThread::run().
+
+ \snippet examples/network/threadedfortuneserver/fortunethread.cpp 2
+
+ The socket is initialized by calling QTcpSocket::setSocketDescriptor(),
+ passing our socket descriptor as an argument. We expect this to succeed,
+ but just to be sure, (although unlikely, the system may run out of
+ resources,) we catch the return value and report any error.
+
+ \snippet examples/network/threadedfortuneserver/fortunethread.cpp 3
+
+ As with the \l{network/fortuneserver}{Fortune Server} example, we encode
+ the fortune into a QByteArray using QDataStream.
+
+ \snippet examples/network/threadedfortuneserver/fortunethread.cpp 4
+
+ But unlike the previous example, we finish off by calling
+ QTcpSocket::waitForDisconnected(), which blocks the calling thread until
+ the socket has disconnected. Because we are running in a separate thread,
+ the GUI will remain responsive.
+
+ \sa {Fortune Server Example}, {Fortune Client Example}, {Blocking Fortune
+ Client Example}
+*/
diff --git a/doc/src/examples/tooltips.qdoc b/doc/src/examples/tooltips.qdoc
new file mode 100644
index 0000000..5daa2b2
--- /dev/null
+++ b/doc/src/examples/tooltips.qdoc
@@ -0,0 +1,408 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/tooltips
+ \title Tool Tips Example
+
+ The Tool Tips example shows how to provide static and dynamic tool
+ tips for an application's widgets.
+
+ The simplest and most common way to set a widget's tool tip is by
+ calling its QWidget::setToolTip() function (static tool
+ tips). Then the tool tip is shown whenever the cursor points at
+ the widget. We show how to do this with our application's tool
+ buttons. But it is also possible to show different tool tips
+ depending on the cursor's position (dynamic tooltips). This
+ approach uses mouse tracking and event handling to determine what
+ widgets are located under the cursor at any point in time, and
+ displays their tool tips. The tool tips for the shape items in our
+ application are implemented using the latter approach.
+
+ \image tooltips-example.png
+
+ With the \c Tooltips application the user can create new shape
+ items with the provided tool buttons, and move the items around
+ using the mouse. Tooltips are provided whenever the cursor is
+ pointing to a shape item or one of the buttons.
+
+ The Tooltips example consists of two classes:
+
+ \list
+ \o \c ShapeItem is a custom widget representing one single shape item.
+ \o \c SortingBox inherits from QWidget and is the application's main
+ widget.
+ \endlist
+
+ First we will review the \c SortingBox class, then we will take a
+ look at the \c ShapeItem class.
+
+ \section1 SortingBox Class Definition
+
+ \snippet examples/widgets/tooltips/sortingbox.h 0
+
+ The \c SortingBox class inherits QWidget, and it is the Tooltips
+ application's main widget. We reimplement several of the event
+ handlers.
+
+ The \c event() function provides tooltips, the \c resize()
+ function makes sure the application appears consistently when the
+ user resizes the main widget, and the \c paintEvent() function
+ displays the shape items within the \c SortingBox widget. The
+ mouse event handlers are reimplemented to make the user able to
+ move the items around.
+
+ In addition we need three private slots to make the user able to
+ create new shape items.
+
+ \snippet examples/widgets/tooltips/sortingbox.h 1
+
+ We also create several private functions: We use the \c
+ initialItemPosition(), \c initialItemColor() and \c
+ createToolButton() functions when we are constructing the widget,
+ and we use the \c updateButtonGeometry() function whenever the
+ user is resizing the application's main widget.
+
+ The \c itemAt() function determines if there is a shape item at a
+ particular position, and the \c moveItemTo() function moves an
+ item to a new position. We use the \c createShapeItem(), \c
+ randomItemPosition() and \c randomItemColor() functions to create
+ new shape items.
+
+ \snippet examples/widgets/tooltips/sortingbox.h 2
+
+ We keep all the shape items in a QList, and we keep three
+ QPainterPath objects holding the shapes of a circle, a square and
+ a triangle. We also need to have a pointer to an item when it is
+ moving, and we need to know its previous position.
+
+ \section1 SortingBox Class Implementation
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 0
+
+ In the constructor, we first set the Qt::WA_StaticContents
+ attribute on the widget. This attribute indicates that the widget
+ contents are north-west aligned and static. On resize, such a
+ widget will receive paint events only for the newly visible part
+ of itself.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 1
+
+ To be able to show the appropiate tooltips while the user is
+ moving the cursor around, we need to enable mouse tracking for the
+ widget.
+
+ If mouse tracking is disabled (the default), the widget only
+ receives mouse move events when at least one mouse button is
+ pressed while the mouse is being moved. If mouse tracking is
+ enabled, the widget receives mouse move events even if no buttons
+ are pressed.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 2
+
+ A widget's background role defines the brush from the widget's
+ palette that is used to render the background, and QPalette::Base
+ is typically white.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 3
+
+ After creating the application's tool buttons using the private \c
+ createToolButton() function, we construct the shapes of a circle,
+ a square and a triangle using QPainterPath.
+
+ The QPainterPath class provides a container for painting
+ operations, enabling graphical shapes to be constructed and
+ reused. The main advantage of painter paths over normal drawing
+ operations is that complex shapes only need to be created once,
+ but they can be drawn many times using only calls to
+ QPainter::drawPath().
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 4
+
+ Then we set the window title, resize the widget to a suitable
+ size, and finally create three initial shape items using the
+ private \c createShapeItem(), \c initialItemPosition() and \c
+ initialItemColor() functions.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 5
+
+ QWidget::event() is the main event handler and receives all the
+ widget's events. Normally, we recommend reimplementing one of the
+ specialized event handlers instead of this function. But here we
+ want to catch the QEvent::ToolTip events, and since these are
+ rather rare, there exists no specific event handler. For that
+ reason we reimplement the main event handler, and the first thing
+ we need to do is to determine the event's type:
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 6
+
+ If the type is QEvent::ToolTip, we cast the event to a QHelpEvent,
+ otherwise we propagate the event using the QWidget::event()
+ function.
+
+ The QHelpEvent class provides an event that is used to request
+ helpful information about a particular point in a widget.
+
+ For example, the QHelpEvent::pos() function returns the event's
+ position relative to the widget to which the event is dispatched.
+ Here we use this information to determine if the position of the
+ event is contained within the area of any of the shape items. If
+ it is, we display the shape item's tooltip at the position of the
+ event. If not, we hide the tooltip and explicitly ignore the event.
+ This makes sure that the calling code does not start any tooltip
+ specific modes as a result of the event. Note that the
+ QToolTip::showText() function needs the event's position in global
+ coordinates provided by QHelpEvent::globalPos().
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 7
+
+ The \c resizeEvent() function is reimplemented to receive the
+ resize events dispatched to the widget. It makes sure that the
+ tool buttons keep their position relative to the main widget when
+ the widget is resized. We want the buttons to always be vertically
+ aligned in the application's bottom right corner, so each time the
+ main widget is resized we update the buttons geometry.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 8
+
+ The \c paintEvent() function is reimplemented to receive paint
+ events for the widget. We create a QPainter for the \c SortingBox
+ widget, and run through the list of created shape items, drawing
+ each item at its defined position.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 9
+
+ The painter will by default draw all the shape items at position
+ (0,0) in the \c SortingBox widget. The QPainter::translate()
+ function translates the coordinate system by the given offset,
+ making each shape item appear at its defined position. But
+ remember to translate the coordinate system back when the item is
+ drawn, otherwise the next shape item will appear at a position
+ relative to the item we drawed last.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 10
+
+ The QPainter::setBrush() function sets the current brush used by
+ the painter. When the provided argument is a QColor, the function
+ calls the appropiate QBrush constructor which creates a brush with
+ the specified color and Qt::SolidPattern style. The
+ QPainter::drawPath() function draws the given path using the
+ current pen for outline and the current brush for filling.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 11
+
+ The \c mousePressEvent() function is reimplemented to receive the
+ mouse press events dispatched to the widget. It determines if an
+ event's position is contained within the area of any of the shape
+ items, using the private \c itemAt() function.
+
+ If an item covers the position, we store a pointer to that item
+ and the event's position. If several of the shape items cover the
+ position, we store the pointer to the uppermost item. Finally, we
+ move the shape item to the end of the list, and make a call to the
+ QWidget::update() function to make the item appear on top.
+
+ The QWidget::update() function does not cause an immediate
+ repaint; instead it schedules a paint event for processing when Qt
+ returns to the main event loop.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 12
+
+ The \c mouseMoveEvent() function is reimplemented to receive mouse
+ move events for the widget. If the left mouse button is pressed
+ and there exists a shape item in motion, we use the private \c
+ moveItemTo() function to move the item with an offset
+ corresponding to the offset between the positions of the current
+ mouse event and the previous one.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 13
+
+ The \c mouseReleaseEvent() function is reimplemented to receive
+ the mouse release events dispatched to the widget. If the left
+ mouse button is pressed and there exists a shape item in motion,
+ we use the private \c moveItemTo() function to move the item like
+ we did in \c mouseMoveEvent(). But then we remove the pointer to
+ the item in motion, making the shape item's position final for
+ now. To move the item further, the user will need to press the
+ left mouse button again.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 14
+ \codeline
+ \snippet examples/widgets/tooltips/sortingbox.cpp 15
+ \codeline
+ \snippet examples/widgets/tooltips/sortingbox.cpp 16
+
+ The \c createNewCircle(), \c createNewSquare() and \c
+ createNewTriangle() slots simply create new shape items, using the
+ private \c createShapeItem(), \c randomItemPosition() and \c
+ randomItemColor() functions.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 17
+
+ In the \c itemAt() function, we run through the list of created
+ shape items to check if the given position is contained within the
+ area of any of the shape items.
+
+ For each shape item we use the QPainterPath::contains() function
+ to find out if the item's painter path contains the position. If
+ it does we return the index of the item, otherwise we return
+ -1. We run through the list backwards to get the index of the
+ uppermost shape item in case several items cover the position.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 18
+
+ The \c moveItemTo() function moves the shape item in motion, and
+ the parameter \c pos is the position of a mouse event. First we
+ calculate the offset between the parameter \c pos and the previous
+ mouse event position. Then we add the offset to the current
+ position of the item in motion.
+
+ It is tempting to simply set the position of the item to be the
+ parameter \c pos. But an item's position defines the top left
+ corner of the item's bounding rectangle, and the parameter \c pos
+ can be any point; The suggested shortcut would cause the item to
+ jump to a position where the cursor is pointing to the bounding
+ rectangle's top left corner, regardless of the item's previous
+ position.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 19
+
+ Finally, we update the previous mouse event position, and make a
+ call to the QWidget::update() function to make the item appear at
+ its new position.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 20
+
+ In the \c updateButtonGeometry() function we set the geometry for
+ the given button. The parameter coordinates define the bottom
+ right corner of the button. We use these coordinates and the
+ button's size hint to determine the position of the upper left
+ corner. This position, and the button's width and height, are the
+ arguments required by the QWidget::setGeometry() function.
+
+ In the end, we calculate and return the y-coordinate of the bottom
+ right corner of the next button. We use the QWidget::style()
+ function to retrieve the widget's GUI style, and then
+ QStyle::pixelMetric() to determine the widget's preferred default
+ spacing between its child widgets.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 21
+
+ The \c createShapeItem() function creates a single shape item. It
+ sets the path, tooltip, position and color, using the item's own
+ functions. In the end, the function appends the new item to the
+ list of shape items, and calls the QWidget::update() function to
+ make it appear with the other items within the \c SortingBox
+ widget.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 22
+
+ The \c createToolButton() function is called from the \c
+ SortingBox constructor. We create a tool button with the given
+ tooltip and icon. The button's parent is the \c SortingBox widget,
+ and its size is 32 x 32 pixels. Before we return the button, we
+ connect it to the given slot.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 23
+
+ The \c initialItemPosition() function is also called from the
+ constructor. We want the three first items to initially be
+ centered in the middle of the \c SortingBox widget, and we use
+ this function to calculate their positions.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 24
+
+ Whenever the user creates a new shape item, we want the new item
+ to appear at a random position, and we use the \c
+ randomItemPosition() function to calculate such a position. We
+ make sure that the item appears within the the visible area of the
+ \c SortingBox widget, using the widget's current width and heigth
+ when calculating the random coordinates.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 25
+
+ As with \c initialItemPosition(), the \c initialItemColor()
+ function is called from the constructor. The purposes of both
+ functions are purely cosmetic: We want to control the inital
+ position and color of the three first items.
+
+ \snippet examples/widgets/tooltips/sortingbox.cpp 26
+
+ Finally the \c randomItemColor() function is implemented to give
+ the shape items the user creates, a random color.
+
+ \section1 ShapeItem Class Definition
+
+ \snippet examples/widgets/tooltips/shapeitem.h 0
+
+ The \c ShapeItem class is a custom widget representing one single
+ shape item. The widget has a path, a position, a color and a
+ tooltip. We need functions to set or modify these objects, as well
+ as functions that return them. We make the latter functions \c
+ const to prohibit any modifications of the objects,
+ i.e. prohibiting unauthorized manipulation of the shape items
+ appearance.
+
+ \section1 ShapeItem Class Implementation
+
+ \snippet examples/widgets/tooltips/shapeitem.cpp 0
+ \codeline
+ \snippet examples/widgets/tooltips/shapeitem.cpp 1
+ \codeline
+ \snippet examples/widgets/tooltips/shapeitem.cpp 2
+ \codeline
+ \snippet examples/widgets/tooltips/shapeitem.cpp 3
+
+ This first group of functions simply return the objects that are
+ requested. The objects are returned as constants, i.e. they cannot
+ be modified.
+
+ \snippet examples/widgets/tooltips/shapeitem.cpp 4
+ \codeline
+ \snippet examples/widgets/tooltips/shapeitem.cpp 5
+ \codeline
+ \snippet examples/widgets/tooltips/shapeitem.cpp 6
+ \codeline
+ \snippet examples/widgets/tooltips/shapeitem.cpp 7
+
+ The last group of functions set or modify the shape item's path,
+ position, color and tooltip, respectively.
+*/
diff --git a/doc/src/examples/torrent.qdoc b/doc/src/examples/torrent.qdoc
new file mode 100644
index 0000000..8805dad
--- /dev/null
+++ b/doc/src/examples/torrent.qdoc
@@ -0,0 +1,83 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example network/torrent
+ \title Torrent Example
+
+ The Torrent example is a functional BitTorrent client that
+ illustrates how to write a complex TCP/IP application using Qt.
+
+ \image torrent-example.png
+
+ \section1 License Information
+
+ The implementation of the US Secure Hash Algorithm 1 (SHA1) in this example is
+ derived from the original description in \l{RFC 3174}.
+
+ \legalese
+ Copyright (C) The Internet Society (2001). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ \endlegalese
+*/
diff --git a/doc/src/examples/trafficinfo.qdoc b/doc/src/examples/trafficinfo.qdoc
new file mode 100644
index 0000000..c9b6890
--- /dev/null
+++ b/doc/src/examples/trafficinfo.qdoc
@@ -0,0 +1,163 @@
+/****************************************************************************
+**
+** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xmlpatterns/trafficinfo
+ \title TrafficInfo Example
+
+ Shows how XQuery can be used extract information from WML documents provided by a WAP service.
+
+ \section1 Overview
+
+ The WAP service used in this example is \l{Trafikanten}{wap.trafikanten.no}
+ that is run by the Norwegian governmental agency for public transport in
+ Oslo. The service provides real time information about the departure of
+ busses, trams and undergrounds for every station in the city area.
+
+ This example application displays the departure information for a specific
+ station and provides the feature to filter for a special bus or tram line.
+
+ \image trafficinfo-example.png
+
+ \section1 Retrieving the Data
+
+ Without the knowledge of XQuery, one would use QNetworkAccessManager to
+ query the WML document from the WAP service and then using the QDom
+ classes or QXmlStreamReader classes to iterate over the document and
+ extract the needed information.
+ However this approach results in a lot of glue code and consumes valuable
+ developer time, so we are looking for something that can access XML
+ documents locally or over the network and extract data according to given
+ filter rules. That's the point where XQuery enters the stage!
+
+ If we want to know when the underground number 6 in direction
+ \Aring\c{}sjordet is passing the underground station in Nydalen on November
+ 14th 2008 after 1pm, we use the following URL:
+
+ \c{http://wap.trafikanten.no/F.asp?f=03012130&t=13&m=00&d=14.11.2008&start=1}
+
+ The parameters have the following meanings:
+ \list
+ \o \e{f} The unique station ID of Nydalen.
+ \o \e{t} The hour in 0-23 format.
+ \o \e{m} The minute in 0-59 format.
+ \o \e{d} The date in dd.mm.yyyy format.
+ \o \e{start} Not interesting for our use but should be passed.
+ \endlist
+
+ As a result we get the following document:
+
+ \quotefile examples/xmlpatterns/trafficinfo/time_example.wml
+
+ So for every departure we have a \c <a> tag that contains the time as a
+ text element, and the following text element contains the line number
+ and direction.
+
+ To encapsulate the XQuery code in the example application, we create a
+ custom \c TimeQuery class. This provides the \c queryInternal() function
+ that takes a station ID and date/time as input and returns the list of
+ times and directions:
+
+ \snippet examples/xmlpatterns/trafficinfo/timequery.cpp 1
+
+ The first lines of this function synthesize the XQuery strings that fetch
+ the document and extract the data.
+ For better readability, two separated queries are used here: the first one
+ fetches the times and the second fetches the line numbers and directions.
+
+ The \c doc() XQuery method opens a local or remote XML document and returns
+ it, so the \c{/wml/card/p/small/} statement behind it selects all XML nodes
+ that can be reached by the path, \c wml \rarrow \c card \rarrow \c p \rarrow
+ \c small.
+ Now we are on the node that contains all the XML nodes we are interested in.
+
+ In the first query we select all \c a nodes that have a \c href attribute
+ starting with the string "Rute" and return the text of these nodes.
+
+ In the second query we select all text nodes that are children of the
+ \c small node which start with a number.
+ These two queries are passed to the QXmlQuery instance and are evaluated
+ to string lists. After some sanity checking, we have collected all the
+ information we need.
+
+ In the section above we have seen that an unique station ID must be passed
+ as an argument to the URL for retrieving the time, so how to find out which
+ is the right station ID to use? The WAP service provides a page for that
+ as well, so the URL
+
+ \c{http://wap.trafikanten.no/FromLink1.asp?fra=Nydalen}
+
+ will return the following document:
+
+ \snippet examples/xmlpatterns/trafficinfo/station_example.wml 0
+
+ The names of the available stations are listed as separate text elements
+ and the station ID is part of the \c href attribute of the parent \c a
+ (anchor) element. In our example, the \c StationQuery class encapsulates
+ the action of querying the stations that match the given name pattern with
+ the following code:
+
+ \snippet examples/xmlpatterns/trafficinfo/stationquery.cpp 0
+
+ Just as in the \c TimeQuery implementation, the first step is to
+ synthesize the XQuery strings for selecting the station names and the
+ station IDs. As the station name that we pass in the URL will be input
+ from the user, we should protect the XQuery from code injection by using
+ the QXmlQuery::bindVariable() method to do proper quoting of the variable
+ content for us instead of concatenating the two strings manually.
+
+ So, we define a XQuery \c $station variable that is bound to the user
+ input. This variable is concatenated inside the XQuery code with the
+ \c concat method. To extract the station IDs, we select all \c a elements
+ that have an \c title attribute with the content "Velg", and from these
+ elements we take the substring of the \c href attribute that starts at the
+ 18th character.
+
+ The station name can be extracted a bit more easily by just taking the
+ text elements of the selected \a elements.
+
+ After some sanity checks we have all the station IDs and the corresponding
+ names available.
+
+ The rest of the code in this example is just for representing the time and
+ station information to the user, and uses techniques described in the
+ \l{Qt Examples#Widgets}{Widgets examples}.
+*/
diff --git a/doc/src/examples/transformations.qdoc b/doc/src/examples/transformations.qdoc
new file mode 100644
index 0000000..eabb803
--- /dev/null
+++ b/doc/src/examples/transformations.qdoc
@@ -0,0 +1,385 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example painting/transformations
+ \title Transformations Example
+
+ The Transformations example shows how transformations influence
+ the way that QPainter renders graphics primitives. In particular
+ it shows how the order of transformations affect the result.
+
+ \image transformations-example.png
+
+ The application allows the user to manipulate the rendering of a
+ shape by changing the translation, rotation and scale of
+ QPainter's coordinate system.
+
+ The example consists of two classes and a global enum:
+
+ \list
+ \o The \c RenderArea class controls the rendering of a given shape.
+ \o The \c Window class is the application's main window.
+ \o The \c Operation enum describes the various transformation
+ operations available in the application.
+ \endlist
+
+ First we will take a quick look at the \c Operation enum, then we
+ will review the \c RenderArea class to see how a shape is
+ rendered. Finally, we will take a look at the Transformations
+ application's features implemented in the \c Window class.
+
+ \section1 Transformation Operations
+
+ Normally, the QPainter operates on the associated device's own
+ coordinate system, but it also has good support for coordinate
+ transformations.
+
+ The default coordinate system of a paint device has its origin at
+ the top-left corner. The x values increase to the right and the y
+ values increase downwards. You can scale the coordinate system by
+ a given offset using the QPainter::scale() function, you can
+ rotate it clockwise using the QPainter::rotate() function and you
+ can translate it (i.e. adding a given offset to the points) using
+ the QPainter::translate() function. You can also twist the
+ coordinate system around the origin (called shearing) using the
+ QPainter::shear() function.
+
+ All the tranformation operations operate on QPainter's
+ tranformation matrix that you can retrieve using the
+ QPainter::matrix() function. A matrix transforms a point in the
+ plane to another point. For more information about the
+ transformation matrix, see the \l {The Coordinate System} and
+ QMatrix documentation.
+
+ \snippet examples/painting/transformations/renderarea.h 0
+
+ The global \c Operation enum is declared in the \c renderarea.h
+ file and describes the various transformation operations available
+ in the Transformations application.
+
+ \section1 RenderArea Class Definition
+
+ The \c RenderArea class inherits QWidget, and controls the
+ rendering of a given shape.
+
+ \snippet examples/painting/transformations/renderarea.h 1
+
+ We declare two public functions, \c setOperations() and
+ \c setShape(), to be able to specify the \c RenderArea widget's shape
+ and to transform the coordinate system the shape is rendered
+ within.
+
+ We reimplement the QWidget's \l
+ {QWidget::minimumSizeHint()}{minimumSizeHint()} and \l
+ {QWidget::sizeHint()}{sizeHint()} functions to give the \c
+ RenderArea widget a reasonable size within our application, and we
+ reimplement the QWidget::paintEvent() event handler to draw the
+ render area's shape applying the user's transformation choices.
+
+ \snippet examples/painting/transformations/renderarea.h 2
+
+ We also declare several convenience functions to draw the shape,
+ the coordinate system's outline and the coordinates, and to
+ transform the painter according to the chosen transformations.
+
+ In addition, the \c RenderArea widget keeps a list of the
+ currently applied transformation operations, a reference to its
+ shape, and a couple of convenience variables that we will use when
+ rendering the coordinates.
+
+ \section1 RenderArea Class Implementation
+
+ The \c RenderArea widget controls the rendering of a given shape,
+ including the transformations of the coordinate system, by
+ reimplementing the QWidget::paintEvent() event handler. But first
+ we will take a quick look at the constructor and at the functions
+ that provides access to the \c RenderArea widget:
+
+ \snippet examples/painting/transformations/renderarea.cpp 0
+
+ In the constructor we pass the parent parameter on to the base
+ class, and customize the font that we will use to render the
+ coordinates. The QWidget::font() funtion returns the font
+ currently set for the widget. As long as no special font has been
+ set, or after QWidget::setFont() is called, this is either a
+ special font for the widget class, the parent's font or (if this
+ widget is a top level widget) the default application font.
+
+ After ensuring that the font's size is 12 points, we extract the
+ rectangles enclosing the coordinate letters, 'x' and 'y', using the
+ QFontMetrics class.
+
+ QFontMetrics provides functions to access the individual metrics
+ of the font, its characters, and for strings rendered in the
+ font. The QFontMetrics::boundingRect() function returns the
+ bounding rectangle of the given character relative to the
+ left-most point on the base line.
+
+ \snippet examples/painting/transformations/renderarea.cpp 1
+ \codeline
+ \snippet examples/painting/transformations/renderarea.cpp 2
+
+ In the \c setShape() and \c setOperations() functions we update
+ the \c RenderArea widget by storing the new value or values
+ followed by a call to the QWidget::update() slot which schedules a
+ paint event for processing when Qt returns to the main event loop.
+
+ \snippet examples/painting/transformations/renderarea.cpp 3
+ \codeline
+ \snippet examples/painting/transformations/renderarea.cpp 4
+
+ We reimplement the QWidget's \l
+ {QWidget::minimumSizeHint()}{minimumSizeHint()} and \l
+ {QWidget::sizeHint()}{sizeHint()} functions to give the \c
+ RenderArea widget a reasonable size within our application. The
+ default implementations of these functions returns an invalid size
+ if there is no layout for this widget, and returns the layout's
+ minimum size or preferred size, respectively, otherwise.
+
+ \snippet examples/painting/transformations/renderarea.cpp 5
+
+ The \c paintEvent() event handler recieves the \c RenderArea
+ widget's paint events. A paint event is a request to repaint all
+ or part of the widget. It can happen as a result of
+ QWidget::repaint() or QWidget::update(), or because the widget was
+ obscured and has now been uncovered, or for many other reasons.
+
+ First we create a QPainter for the \c RenderArea widget. The \l
+ {QPainter::RenderHint}{QPainter::Antialiasing} render hint
+ indicates that the engine should antialias edges of primitives if
+ possible. Then we erase the area that needs to be repainted using
+ the QPainter::fillRect() function.
+
+ We also translate the coordinate system with an constant offset to
+ ensure that the original shape is renderend with a suitable
+ margin.
+
+ \snippet examples/painting/transformations/renderarea.cpp 6
+
+ Before we start to render the shape, we call the QPainter::save()
+ function.
+
+ QPainter::save() saves the current painter state (i.e. pushes the
+ state onto a stack) including the current coordinate system. The
+ rationale for saving the painter state is that the following call
+ to the \c transformPainter() function will transform the
+ coordinate system depending on the currently chosen transformation
+ operations, and we need a way to get back to the original state to
+ draw the outline.
+
+ After transforming the coordinate system, we draw the \c
+ RenderArea's shape, and then we restore the painter state using
+ the the QPainter::restore() function (i.e. popping the saved state off
+ the stack).
+
+ \snippet examples/painting/transformations/renderarea.cpp 7
+
+ Then we draw the square outline.
+
+ \snippet examples/painting/transformations/renderarea.cpp 8
+
+ Since we want the coordinates to correspond with the coordinate
+ system the shape is rendered within, we must make another call to
+ the \c transformPainter() function.
+
+ The order of the painting operations is essential with respect to
+ the shared pixels. The reason why we don't render the coordinates
+ when the coordinate system already is transformed to render the
+ shape, but instead defer their rendering to the end, is that we
+ want the coordinates to appear on top of the shape and its
+ outline.
+
+ There is no need to save the QPainter state this time since
+ drawing the coordinates is the last painting operation.
+
+ \snippet examples/painting/transformations/renderarea.cpp 9
+ \codeline
+ \snippet examples/painting/transformations/renderarea.cpp 10
+ \codeline
+ \snippet examples/painting/transformations/renderarea.cpp 11
+
+ The \c drawCoordinates(), \c drawOutline() and \c drawShape() are
+ convenience functions called from the \c paintEvent() event
+ handler. For more information about QPainter's basic drawing
+ operations and how to display basic graphics primitives, see the
+ \l {painting/basicdrawing}{Basic Drawing} example.
+
+ \snippet examples/painting/transformations/renderarea.cpp 12
+
+ The \c transformPainter() convenience function is also called from
+ the \c paintEvent() event handler, and transforms the given
+ QPainter's coordinate system according to the user's
+ transformation choices.
+
+ \section1 Window Class Definition
+
+ The \c Window class is the Transformations application's main
+ window.
+
+ The application displays four \c RenderArea widgets. The left-most
+ widget renders the shape in QPainter's default coordinate system,
+ the others render the shape with the chosen transformation in
+ addition to all the transformations applied to the \c RenderArea
+ widgets to their left.
+
+ \snippet examples/painting/transformations/window.h 0
+
+ We declare two public slots to make the application able to
+ respond to user interaction, updating the displayed \c RenderArea
+ widgets according to the user's transformation choices.
+
+ The \c operationChanged() slot updates each of the \c RenderArea
+ widgets applying the currently chosen transformation operations, and
+ is called whenever the user changes the selected operations. The
+ \c shapeSelected() slot updates the \c RenderArea widgets' shapes
+ whenever the user changes the preferred shape.
+
+ \snippet examples/painting/transformations/window.h 1
+
+ We also declare a private convenience function, \c setupShapes(),
+ that is used when constructing the \c Window widget, and we
+ declare pointers to the various components of the widget. We
+ choose to keep the available shapes in a QList of \l
+ {QPainterPath}s. In addition we declare a private enum counting
+ the number of displayed \c RenderArea widgets except the widget
+ that renders the shape in QPainter's default coordinate system.
+
+ \section1 Window Class Implementation
+
+ In the constructor we create and initialize the application's
+ components:
+
+ \snippet examples/painting/transformations/window.cpp 0
+
+ First we create the \c RenderArea widget that will render the
+ shape in the default coordinate system. We also create the
+ associated QComboBox that allows the user to choose among four
+ different shapes: A clock, a house, a text and a truck. The shapes
+ themselves are created at the end of the constructor, using the
+ \c setupShapes() convenience function.
+
+ \snippet examples/painting/transformations/window.cpp 1
+
+ Then we create the \c RenderArea widgets that will render their
+ shapes with coordinate tranformations. By default the applied
+ operation is \gui {No Transformation}, i.e. the shapes are
+ rendered within the default coordinate system. We create and
+ initialize the associated \l {QComboBox}es with items
+ corresponding to the various transformation operations decribed by
+ the global \c Operation enum.
+
+ We also connect the \l {QComboBox}es' \l
+ {QComboBox::activated()}{activated()} signal to the \c
+ operationChanged() slot to update the application whenever the
+ user changes the selected transformation operations.
+
+ \snippet examples/painting/transformations/window.cpp 2
+
+ Finally, we set the layout for the application window using the
+ QWidget::setLayout() function, construct the available shapes
+ using the private \c setupShapes() convenience function, and make
+ the application show the clock shape on startup using the public
+ \c shapeSelected() slot before we set the window title.
+
+
+ \snippet examples/painting/transformations/window.cpp 3
+ \snippet examples/painting/transformations/window.cpp 4
+ \snippet examples/painting/transformations/window.cpp 5
+ \snippet examples/painting/transformations/window.cpp 6
+ \dots
+
+ \snippet examples/painting/transformations/window.cpp 7
+
+ The \c setupShapes() function is called from the constructor and
+ create the QPainterPath objects representing the shapes that are
+ used in the application. For construction details, see the \l
+ {painting/transformations/window.cpp}{window.cpp} example
+ file. The shapes are stored in a QList. The QList::append()
+ function inserts the given shape at the end of the list.
+
+ We also connect the associated QComboBox's \l
+ {QComboBox::activated()}{activated()} signal to the \c
+ shapeSelected() slot to update the application when the user
+ changes the preferred shape.
+
+ \snippet examples/painting/transformations/window.cpp 8
+
+ The public \c operationChanged() slot is called whenever the user
+ changes the selected operations.
+
+ We retrieve the chosen transformation operation for each of the
+ transformed \c RenderArea widgets by querying the associated \l
+ {QComboBox}{QComboBoxes}. The transformed \c RenderArea widgets
+ are supposed to render the shape with the transformation specified
+ by its associated combobox \e {in addition to} all the
+ transformations applied to the \c RenderArea widgets to its
+ left. For that reason, for each widget we query, we append the
+ associated operation to a QList of transformations which we apply
+ to the widget before proceeding to the next.
+
+ \snippet examples/painting/transformations/window.cpp 9
+
+ The \c shapeSelected() slot is called whenever the user changes
+ the preferred shape, updating the \c RenderArea widgets using
+ their public \c setShape() function.
+
+ \section1 Summary
+
+ The Transformations example shows how transformations influence
+ the way that QPainter renders graphics primitives. Normally, the
+ QPainter operates on the device's own coordinate system, but it
+ also has good support for coordinate transformations. With the
+ Transformations application you can scale, rotate and translate
+ QPainter's coordinate system. The order in which these
+ tranformations are applied is essential for the result.
+
+ All the tranformation operations operate on QPainter's
+ tranformation matrix. For more information about the
+ transformation matrix, see the \l {The Coordinate System} and
+ QMatrix documentation.
+
+ The Qt reference documentation provides several painting
+ demos. Among these is the \l {demos/affine}{Affine
+ Transformations} demo that shows Qt's ability to perform
+ transformations on painting operations. The demo also allows the
+ user to experiment with the various transformation operations.
+*/
diff --git a/doc/src/examples/treemodelcompleter.qdoc b/doc/src/examples/treemodelcompleter.qdoc
new file mode 100644
index 0000000..82e9c24
--- /dev/null
+++ b/doc/src/examples/treemodelcompleter.qdoc
@@ -0,0 +1,185 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/treemodelcompleter
+ \title Tree Model Completer Example
+
+ The Tree Model Completer example shows how to provide completion
+ facilities for a hierarchical model, using a period as the separator
+ to access Child, GrandChild and GrandGrandChild level objects.
+
+ \image treemodelcompleter-example.png
+
+ Similar to the \l{Completer Example}, we provide QComboBox objects to
+ enable selection for completion mode and case sensitivity, as well as
+ a QCheckBox for wrap completions.
+
+ \section1 The Resource File
+
+ The contents of the TreeModelCompleter is read from \e treemodel.txt.
+ This file is embedded within the \e treemodelcompleter.qrc resource file,
+ which contains the following:
+
+ \quotefile examples/tools/treemodelcompleter/treemodelcompleter.qrc
+
+ \section1 TreeModelCompleter Class Definition
+
+ The \c TreeModelCompleter is a subclass of QCompleter with two
+ constructors - one with \a parent as an argument and another with
+ \a parent and \a model as arguments.
+
+ \snippet examples/tools/treemodelcompleter/treemodelcompleter.h 0
+
+ The class reimplements the protected functions
+ \l{QCompleter::splitPath()}{splitPath()} and
+ \l{QCompleter::pathFromIndex()}{pathFromIndex()} to suit a tree model.
+ For more information on customizing QCompleter to suit tree models, refer
+ to \l{QCompleter#Handling Tree Models}{Handling Tree Models}.
+
+ \c TreeModelCompleter also has a separator property which is declared
+ using the Q_PROPERTY() macro. The separator has READ and WRITE attributes
+ and the corresponding functions \c separator() and \c setSeparator(). For
+ more information on Q_PROPERTY(), refer to \l{Qt's Property System}.
+
+ \section1 TreeModelCompleter Class Implementation
+
+ The first constructor constructs a \c TreeModelCompleter object with a
+ parent while the second constructor constructs an object with a parent
+ and a QAbstractItemModel, \a model.
+
+ \snippet examples/tools/treemodelcompleter/treemodelcompleter.cpp 0
+ \codeline
+ \snippet examples/tools/treemodelcompleter/treemodelcompleter.cpp 1
+
+ The \c separator() function is a getter function that returns the
+ separator string.
+
+ \snippet examples/tools/treemodelcompleter/treemodelcompleter.cpp 2
+
+ As mentioned earlier, the \c splitPath() function is reimplemented because
+ the default implementation is more suited to QDirModel or list models. In
+ order for QCompleter to split the path into a list of strings that are
+ matched at each level, we split it using QString::split() with \c sep as its
+ separator.
+
+ \snippet examples/tools/treemodelcompleter/treemodelcompleter.cpp 3
+
+ The \c pathFromIndex() function returns data for the completionRole() for a
+ tree model. This function is reimplemented as its default implementation is
+ more suitable for list models. If there is no separator, we use
+ \l{QCompleter}'s default implementation, otherwise we use the
+ \l{QStringList::prepend()}{prepend()} function to navigate upwards and
+ accumulate the data. The function then returns a QStringList, \c dataList,
+ using a separator to join objects of different levels.
+
+ \snippet examples/tools/treemodelcompleter/treemodelcompleter.cpp 4
+
+ \section1 MainWindow Class Definition
+
+ The \c MainWindow class is a subclass of QMainWindow and implements five
+ custom slots: \c about(), \c changeCase(), \c changeMode(),
+ \c highlight(), and \c updateContentsLabel().
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.h 0
+
+ In addition, the class has two private functions, \c createMenu() and
+ \c modelFromFile(), as well as private instances of QTreeView, QComboBox,
+ QLabel, \c TreeModelCompleter and QLineEdit.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.h 1
+
+ \section1 MainWindow Class Implementation
+
+ The \c{MainWindow}'s constructor creates a \c MainWindow object with a
+ parent and initializes the \c completer and \c lineEdit. The
+ \c createMenu() function is invoked to set up the "File" menu and "Help"
+ menu. The \c{completer}'s model is set to the QAbstractItemModel obtained
+ from \c modelFromFile(), and the \l{QCompleter::highlighted()}
+ {highlighted()} signal is connected to \c{MainWindow}'s \c highlight()
+ slot.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 0
+
+ The QLabel objects \c modelLabel, \c modeLabel and \c caseLabel are
+ instantiated. Also, the QComboBox objects, \c modeCombo and \c caseCombo,
+ are instantiated and populated. By default, the \c{completer}'s mode is
+ "Filtered Popup" and the case is insensitive.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 1
+ \codeline
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 2
+
+ We use a QGridLayout to place all the objects in the \c MainWindow.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 3
+
+ The \c createMenu() function sets up the QAction objects required and
+ adds them to the "File" menu and "Help" menu. The
+ \l{QAction::triggered()}{triggered()} signals from these actions are
+ connected to their respective slots.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 4
+
+ The \c changeMode() function accepts an \a index corresponding to the
+ user's choice of completion mode and changes the \c{completer}'s mode
+ accordingly.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 5
+
+ The \c about() function provides a brief description on the Tree Model
+ Completer example.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 6
+
+ The \c changeCase() function alternates between \l{Qt::CaseSensitive}
+ {Case Sensitive} and \l{Qt::CaseInsensitive}{Case Insensitive} modes,
+ depending on the value of \a cs.
+
+ \snippet examples/tools/treemodelcompleter/mainwindow.cpp 7
+
+ \section1 \c main() Function
+
+ The \c main() function instantiates \c MainWindow and invokes the
+ \l{QWidget::show()}{show()} function to display it.
+
+ \snippet examples/tools/treemodelcompleter/main.cpp 0
+*/
diff --git a/doc/src/examples/trivialwizard.qdoc b/doc/src/examples/trivialwizard.qdoc
new file mode 100644
index 0000000..360ea00
--- /dev/null
+++ b/doc/src/examples/trivialwizard.qdoc
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example dialogs/trivialwizard
+ \title Trivial Wizard Example
+
+ The Trivial Wizard example illustrates how to create a linear three-page
+ registration wizard using three instances of QWizardPage and one instance
+ of QWizard.
+
+ \image trivialwizard-example-flow.png
+
+ \section1 Introduction Page
+
+ \image trivialwizard-example-introduction.png
+
+ The introduction page is created with the \c createIntroPage()
+ function where a QWizardPage is created and its title is set to
+ "Introduction". A QLabel is used to hold the description of \c page.
+ A QVBoxLayout is used to hold the \c label. This \c page is returned
+ when the \c createIntroPage() function is called.
+
+ \snippet examples/dialogs/trivialwizard/trivialwizard.cpp 0
+
+ \section1 Registration Page
+
+ \image trivialwizard-example-registration.png
+
+ The registration page is created with the \c createRegistrationPage()
+ function. QLineEdit objects are used to allow the user to input a name
+ and an e-mail address. A QGridLayout is used to hold the QLabel and
+ QLineEdit objects.
+
+ \snippet examples/dialogs/trivialwizard/trivialwizard.cpp 2
+
+ \section1 Conclusion Page
+
+ \image trivialwizard-example-conclusion.png
+
+ The conclusion page is created in the \c createConclusionPage()
+ function. This function's content is similar to \c createIntroPage(). A
+ QLabel is used to inform the user that the registration process has
+ completed successfully.
+
+ \snippet examples/dialogs/trivialwizard/trivialwizard.cpp 6
+
+ \section1 \c main() Function
+
+ The \c main() function instantiates a QWizard object, \c wizard, and
+ adds all three QWizardPage objects to it. The \c wizard window title is
+ set to "Trivial Wizard" and its \c show() function is invoked to display
+ it.
+
+ \snippet examples/dialogs/trivialwizard/trivialwizard.cpp 10
+
+ \sa QWizard, {Class Wizard Example}, {License Wizard Example}
+*/
diff --git a/doc/src/examples/trollprint.qdoc b/doc/src/examples/trollprint.qdoc
new file mode 100644
index 0000000..38251ee
--- /dev/null
+++ b/doc/src/examples/trollprint.qdoc
@@ -0,0 +1,275 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example linguist/trollprint
+ \title Troll Print Example
+
+ Troll Print is an example application that lets the user choose
+ printer settings. It comes in two versions: English and
+ Portuguese.
+
+ \image linguist-trollprint_10_en.png
+
+ We've included a translation file, \c trollprint_pt.ts, which contains some
+ Portuguese translations for this example.
+
+ We will consider two releases of the same application: Troll Print
+ 1.0 and 1.1. We will learn to reuse the translations created for one
+ release in a subsequent release. (In this tutorial, you need to edit
+ some source files. It's probably best to copy all the files to a new
+ temporary directory and work from there.)
+
+ See the \l{Qt Linguist manual} for more information about
+ translating Qt application.
+
+ \section1 Line by Line Walkthrough
+
+ The \c PrintPanel class is defined in \c printpanel.h.
+
+ \snippet examples/linguist/trollprint/printpanel.h 0
+
+ \c PrintPanel is a QWidget. It needs the \c Q_OBJECT macro for \c
+ tr() to work properly.
+
+ The implementation file is \c printpanel.cpp.
+
+ \snippet examples/linguist/trollprint/printpanel.cpp 0
+
+ Some of the code is commented out in Troll Print 1.0; you will
+ uncomment it later, for Troll Print 1.1.
+
+ \snippet examples/linguist/trollprint/printpanel.cpp 1
+ \snippet examples/linguist/trollprint/printpanel.cpp 2
+
+ Notice the two occurrences of \c tr("Enabled") and of \c
+ tr("Disabled") in PrintPanel. Since both "Enabled"s and "Disabled"s
+ appear in the same context \e {Qt Linguist} will only display one
+ occurrence of each and will use the same translations for the
+ duplicates that it doesn't display. Whilst this is a useful
+ timesaver, in some languages, such as Portuguese, the second
+ occurrence requires a separate translation. We will see how \e {Qt
+ Linguist} can be made to display all the occurrences for separate
+ translation shortly.
+
+ The header file for \c MainWindow, \c mainwindow.h, contains no
+ surprises. In the implementation, \c mainwindow.cpp, we have some
+ user-visible source texts that must be marked for translation.
+
+ \snippet examples/linguist/trollprint/mainwindow.cpp 0
+
+ We must translate the window title.
+
+ \snippet examples/linguist/trollprint/mainwindow.cpp 1
+ \snippet examples/linguist/trollprint/mainwindow.cpp 3
+
+ We also need to translate the actions and menus. Note that the
+ two argument form of \c tr() is used for the keyboard
+ accelerator, "Ctrl+Q", since the second argument is the only clue
+ the translator has to indicate what function that accelerator
+ will perform.
+
+ \snippet examples/linguist/trollprint/main.cpp 0
+
+ The \c main() function in \c main.cpp is the same as the one in
+ the \l{linguist/arrowpad}{Arrow Pad} example. In particular, it
+ chooses a translation file based on the current locale.
+
+ \section1 Running Troll Print 1.0 in English and in Portuguese
+
+ We will use the translations in the \c trollprint_pt.ts file that is provided.
+
+ Set the \c LANG environment variable to \c pt, and then run \c
+ trollprint. You should still see the English version. Now run \c
+ lrelease, e.g. \c {lrelease trollprint.pro}, and then run the
+ example again. Now you should see the Portuguese edition (Troll
+ Imprimir 1.0):
+
+ \image linguist-trollprint_10_pt_bad.png
+
+ Whilst the translation has appeared correctly, it is in fact wrong. In
+ good Portuguese, the second occurrence of "Enabled" should be
+ "Ativadas", not "Ativado" and the ending for the second translation of
+ "Disabled" must change similarly too.
+
+ If you open \c trollprint_pt.ts using \e {Qt Linguist}, you will see that
+ there is just one occurrence of "Enabled" and of "Disabled" in the
+ translation source file, even though there are two of each in the
+ source code. This is because \e {Qt Linguist} tries to minimize the
+ translator's work by using the same translation for duplicate source
+ texts. In cases such as this where an identical translation is wrong,
+ the programmer must disambiguate the duplicate occurrences. This is
+ easily achieved by using the two argument form of \c tr().
+
+ We can easily determine which file must be changed because the
+ translator's "context" is in fact the class name for the class where
+ the texts that must be changed appears. In this case the file is \c
+ printpanel.cpp, where the there are four lines to change. Add the
+ second argument "two-sided" in the appropriate \c tr() calls to the
+ first pair of radio buttons:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 0
+
+ and add the second argument "colors" in the appropriate \c tr() calls
+ for the second pair of radio buttons:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 1
+
+ Now run \c lupdate and open \c trollprint_pt.ts with \e {Qt Linguist}. You
+ should now see two changes.
+
+ First, the translation source file now contains \e three "Enabled",
+ "Disabled" pairs. The first pair is marked "(obs.)" signifying that they
+ are obsolete. This is because these texts appeared in \c tr() calls that
+ have been replaced by new calls with two arguments. The second pair has
+ "two-sided" as their comment, and the third pair has "colors" as their
+ comment. The comments are shown in the \gui {Source text and comments}
+ area in \e {Qt Linguist}.
+
+ Second, the translation text "Ativado" and "Desativado" have been
+ automatically used as translations for the new "Enabled" and "Disabled"
+ texts, again to minimize the translator's work. Of course in this case
+ these are not correct for the second occurrence of each word, but they
+ provide a good starting point.
+
+ Change the second "Ativado" into "Ativadas" and the second
+ "Desativado" into "Desativadas", then save and quit. Run \c lrelease
+ to obtain an up-to-date binary \c trollprint_pt.qm file, and run Troll Print
+ (or rather Troll Imprimir).
+
+ \image linguist-trollprint_10_pt_good.png
+
+ The second argument to \c tr() calls, called "comments" in \e {Qt
+ Linguist}, distinguish between identical source texts that occur in
+ the same context (class). They are also useful in other cases to give
+ clues to the translator, and in the case of Ctrl key accelerators are
+ the only means of conveying the function performed by the accelerator to
+ the translator.
+
+ An additional way of helping the translator is to provide information on
+ how to navigate to the particular part of the application that contains
+ the source texts they must translate. This helps them see the context
+ in which the translation appears and also helps them to find and test
+ the translations. This can be achieved by using a \c TRANSLATOR comment
+ in the source code:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 2
+
+ Try adding these comments to some source files, particularly to
+ dialog classes, describing the navigation necessary to reach the
+ dialogs. You could also add them to the example files, e.g. \c
+ mainwindow.cpp and \c printpanel.cpp are appropriate files. Run \c
+ lupdate and then start \e {Qt Linguist} and load in \c trollprint_pt.ts.
+ You should see the comments in the \gui {Source text and comments} area
+ as you browse through the list of source texts.
+
+ Sometimes, particularly with large programs, it can be difficult for
+ the translator to find their translations and check that they're
+ correct. Comments that provide good navigation information can save
+ them time:
+
+ \snippet doc/src/snippets/code/doc_src_examples_trollprint.qdoc 3
+
+ \section1 Troll Print 1.1
+
+ We'll now prepare release 1.1 of Troll Print. Start your favorite text
+ editor and follow these steps:
+
+ \list
+ \o Uncomment the two lines that create a QLabel with the text
+ "\<b\>TROLL PRINT\</b\>" in \c printpanel.cpp.
+ \o Word-tidying: Replace "2-sided" by "Two-sided" in \c printpanel.cpp.
+ \o Replace "1.0" with "1.1" everywhere it occurs in \c mainwindow.cpp.
+ \o Update the copyright year to 1999-2000 in \c mainwindow.cpp.
+ \endlist
+
+ (Of course the version number and copyright year would be consts or
+ #defines in a real application.)
+
+ Once finished, run \c lupdate, then open \c trollprint_pt.ts in \e {Qt
+ Linguist}. The following items are of special interest:
+
+ \list
+ \o \c MainWindow
+ \list
+ \o Troll Print 1.0 - marked "(obs.)", obsolete
+ \o About Troll Print 1.0 - marked "(obs.)", obsolete
+ \o Troll Print 1.0. Copyright 1999 Software, Inc. -
+ marked obsolete
+ \o Troll Print 1.1 - automatically translated as
+ "Troll Imprimir 1.1"
+ \o About Troll Print 1.1 - automatically translated as
+ "Troll Imprimir 1.1"
+ \o Troll Print 1.1. Copyright 1999-2000 Software,
+ Inc. - automatically translated as "Troll Imprimir 1.1.
+ Copyright 1999-2000 Software, Inc."
+ \endlist
+ \o \c PrintPanel
+ \list
+ \o 2-sided - marked "(obs.)", obsolete
+ \o \<b\>TROLL PRINT\</b\> - unmarked, i.e. untranslated
+ \o Two-sided - unmarked, i.e. untranslated.
+ \endlist
+ \endlist
+
+ Notice that \c lupdate works hard behind the scenes to make revisions
+ easier, and it's pretty smart with numbers.
+
+ Go over the translations in \c MainWindow and mark these as "done".
+ Translate "\<b\>TROLL PRINT\</b\>" as "\<b\>TROLL IMPRIMIR\</b\>".
+ When you're translating "Two-sided", press the \gui {Guess Again}
+ button to translate "Two-sided", but change the "2" into "Dois".
+
+ Save and quit, then run \c lrelease. The Portuguese version
+ should look like this:
+
+ \image linguist-trollprint_11_pt.png
+
+ Choose \gui{Ajuda|Sobre} (\gui{Help|About}) to see the about box.
+
+ If you choose \gui {Ajuda|Sobre Qt} (\gui {Help|About Qt}), you'll get
+ an English dialog. Oops! Qt itself needs to be translated. See
+ \l{Internationalization with Qt} for details.
+
+ Now set \c LANG=en to get the original English version:
+
+ \image linguist-trollprint_11_en.png
+*/
diff --git a/doc/src/examples/undoframework.qdoc b/doc/src/examples/undoframework.qdoc
new file mode 100644
index 0000000..3d0965f
--- /dev/null
+++ b/doc/src/examples/undoframework.qdoc
@@ -0,0 +1,306 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example tools/undoframework
+ \title Undo Framework Example
+
+ This example shows how to implement undo/redo functionality
+ with the Qt undo framework.
+
+ \image undoframeworkexample.png The Undo Diagram Example
+
+ In the Qt undo framework, all actions that the user performs are
+ implemented in classes that inherit QUndoCommand. An undo command
+ class knows how to both \l{QUndoCommand::}{redo()} - or just do
+ the first time - and \l{QUndoCommand::}{undo()} an action. For
+ each action the user performs, a command is placed on a
+ QUndoStack. Since the stack contains all commands executed
+ (stacked in chronological order) on the document, it can roll the
+ state of the document backwards and forwards by undoing and redoing
+ its commands. See the \l{Overview of Qt's Undo Framework}{overview
+ document} for a high-level introduction to the undo framework.
+
+ The undo example implements a simple diagram application. It is
+ possible to add and delete items, which are either box or
+ rectangular shaped, and move the items by dragging them with the
+ mouse. The undo stack is shown in a QUndoView, which is a list in
+ which the commands are shown as list items. Undo and redo are
+ available through the edit menu. The user can also select a command
+ from the undo view.
+
+ We use the \l{The Graphics View Framework}{graphics view
+ framework} to implement the diagram. We only treat the related
+ code briefly as the framework has examples of its own (e.g., the
+ \l{Diagram Scene Example}).
+
+ The example consists of the following classes:
+
+ \list
+ \o \c MainWindow is the main window and arranges the
+ example's widgets. It creates the commands based
+ on user input and keeps them on the command stack.
+ \o \c AddCommand adds an item to the scene.
+ \o \c DeleteCommand deletes an item from the scene.
+ \o \c MoveCommand when an item is moved the MoveCommand keeps record
+ of the start and stop positions of the move, and it
+ moves the item according to these when \c redo() and \c undo()
+ is called.
+ \o \c DiagramScene inherits QGraphicsScene and
+ emits signals for the \c MoveComands when an item is moved.
+ \o \c DiagramItem inherits QGraphicsPolygonItem and represents
+ an item in the diagram.
+ \endlist
+
+ \section1 MainWindow Class Definition
+
+ \snippet examples/tools/undoframework/mainwindow.h 0
+
+ The \c MainWindow class maintains the undo stack, i.e., it creates
+ \l{QUndoCommand}s and pushes and pops them from the stack when it
+ receives the \c triggered() signal from \c undoAction and \c
+ redoAction.
+
+ \section1 MainWindow Class Implementation
+
+ We will start with a look at the constructor:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 0
+
+ In the constructor, we set up the DiagramScene and QGraphicsView.
+
+ Here is the \c createUndoView() function:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 1
+
+ The QUndoView is a widget that display the text, which is set with
+ the \l{QUndoCommand::}{setText()} function, for each QUndoCommand
+ in the undo stack in a list.
+
+ Here is the \c createActions() function:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 2
+ \codeline
+ \snippet examples/tools/undoframework/mainwindow.cpp 3
+ \dots
+ \snippet examples/tools/undoframework/mainwindow.cpp 5
+
+ The \c createActions() function sets up all the examples actions
+ in the manner shown above. The
+ \l{QUndoStack::}{createUndoAction()} and
+ \l{QUndoStack::}{createRedoAction()} helps us crate actions that
+ are disabled and enabled based on the state of the stack. Also,
+ the text of the action will be updated automatically based on the
+ \l{QUndoCommand::}{text()} of the undo commands. For the other
+ actions we have implemented slots in the \c MainWindow class.
+
+ Here is the \c createMenus() function:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 6
+
+ \dots
+ \snippet examples/tools/undoframework/mainwindow.cpp 7
+ \dots
+ \snippet examples/tools/undoframework/mainwindow.cpp 8
+
+ We have to use the QMenu \c aboutToShow() and \c aboutToHide()
+ signals since we only want \c deleteAction to be enabled when we
+ have selected an item.
+
+ Here is the \c itemMoved() slot:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 9
+
+ We simply push a MoveCommand on the stack, which calls \c redo()
+ on it.
+
+ Here is the \c deleteItem() slot:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 10
+
+ An item must be selected to be deleted. We need to check if it is
+ selected as the \c deleteAction may be enabled even if an item is
+ not selected. This can happen as we do not catch a signal or event
+ when an item is selected.
+
+ Here is the \c itemMenuAboutToShow() and itemMenuAboutToHide() slots:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 11
+ \codeline
+ \snippet examples/tools/undoframework/mainwindow.cpp 12
+
+ We implement \c itemMenuAboutToShow() and \c itemMenuAboutToHide()
+ to get a dynamic item menu. These slots are connected to the
+ \l{QMenu::}{aboutToShow()} and \l{QMenu::}{aboutToHide()} signals.
+ We need this to disable or enable the \c deleteAction.
+
+ Here is the \c addBox() slot:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 13
+
+ The \c addBox() function creates an AddCommand and pushes it on
+ the undo stack.
+
+ Here is the \c addTriangle() sot:
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 14
+
+ The \c addTriangle() function creates an AddCommand and pushes it
+ on the undo stack.
+
+ Here is the implementation of \c about():
+
+ \snippet examples/tools/undoframework/mainwindow.cpp 15
+
+ The about slot is triggered by the \c aboutAction and displays an
+ about box for the example.
+
+ \section1 AddCommand Class Definition
+
+ \snippet examples/tools/undoframework/commands.h 2
+
+ The \c AddCommand class adds DiagramItem graphics items to the
+ DiagramScene.
+
+ \section1 AddCommand Class Implementation
+
+ We start with the constructor:
+
+ \snippet examples/tools/undoframework/commands.cpp 7
+
+ We first create the DiagramItem to add to the DiagramScene. The
+ \l{QUndoCommand::}{setText()} function let us set a QString that
+ describes the command. We use this to get custom messages in the
+ QUndoView and in the menu of the main window.
+
+ \snippet examples/tools/undoframework/commands.cpp 8
+
+ \c undo() removes the item from the scene. We need to update the
+ scene as ...(ask Andreas)
+
+ \snippet examples/tools/undoframework/commands.cpp 9
+
+ We set the position of the item as we do not do this in the
+ constructor.
+
+ \section1 DeleteCommand Class Definition
+
+ \snippet examples/tools/undoframework/commands.h 1
+
+ The DeleteCommand class implements the functionality to remove an
+ item from the scene.
+
+ \section1 DeleteCommand Class Implementation
+
+ \snippet examples/tools/undoframework/commands.cpp 4
+
+ We know that there must be one selected item as it is not possible
+ to create a DeleteCommand unless the item to be deleted is
+ selected and that only one item can be selected at any time.
+ The item must be unselected if it is inserted back into the
+ scene.
+
+ \snippet examples/tools/undoframework/commands.cpp 5
+
+ The item is simply reinserted into the scene.
+
+ \snippet examples/tools/undoframework/commands.cpp 6
+
+ The item is removed from the scene.
+
+ \section1 MoveCommand Class Definition
+
+ \snippet examples/tools/undoframework/commands.h 0
+
+ The \l{QUndoCommand::}{mergeWith()} is reimplemented to make
+ consecutive moves of an item one MoveCommand, i.e, the item will
+ be moved back to the start position of the first move.
+
+ \section1 MoveCommand Class Implementation
+
+
+ The constructor of MoveCommand looks like this:
+
+ \snippet examples/tools/undoframework/commands.cpp 0
+
+ We save both the old and new positions for undo and redo
+ respectively.
+
+ \snippet examples/tools/undoframework/commands.cpp 2
+
+ We simply set the items old position and update the scene.
+
+ \snippet examples/tools/undoframework/commands.cpp 3
+
+ We set the item to its new position.
+
+ \snippet examples/tools/undoframework/commands.cpp 1
+
+ Whenever a MoveCommand is created, this function is called to
+ check if it should be merged with the previous command. It is the
+ previous command object that is kept on the stack. The function
+ returns true if the command is merged; otherwise false.
+
+ We first check whether it is the same item that has been moved
+ twice, in which case we merge the commands. We update the position
+ of the item so that it will take the last position in the move
+ sequence when undone.
+
+ \section1 DiagramScene Class Definition
+
+ \snippet examples/tools/undoframework/diagramscene.h 0
+
+ The DiagramScene implements the functionality to move a
+ DiagramItem with the mouse. It emits a signal when a move is
+ completed. This is caught by the \c MainWindow, which makes
+ MoveCommands. We do not examine the implementation of DiagramScene
+ as it only deals with graphics framework issues.
+
+ \section1 The \c main() Function
+
+ The \c main() function of the program looks like this:
+
+ \snippet examples/tools/undoframework/main.cpp 0
+
+ We draw a grid in the background of the DiagramScene, so we use a
+ resource file. The rest of the function creates the \c MainWindow and
+ shows it as a top level window.
+*/
diff --git a/doc/src/examples/waitconditions.qdoc b/doc/src/examples/waitconditions.qdoc
new file mode 100644
index 0000000..dce0411
--- /dev/null
+++ b/doc/src/examples/waitconditions.qdoc
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example threads/waitconditions
+ \title Wait Conditions Example
+
+ The Wait Conditions example shows how to use QWaitCondition and
+ QMutex to control access to a circular buffer shared by a
+ producer thread and a consumer thread.
+
+ The producer writes data to the buffer until it reaches the end
+ of the buffer, at which point it restarts from the beginning,
+ overwriting existing data. The consumer thread reads the data as
+ it is produced and writes it to standard error.
+
+ Wait conditions make it possible to have a higher level of
+ concurrency than what is possible with mutexes alone. If accesses
+ to the buffer were simply guarded by a QMutex, the consumer
+ thread couldn't access the buffer at the same time as the
+ producer thread. Yet, there is no harm in having both threads
+ working on \e{different parts} of the buffer at the same time.
+
+ The example comprises two classes: \c Producer and \c Consumer.
+ Both inherit from QThread. The circular buffer used for
+ communicating between these two classes and the synchronization
+ tools that protect it are global variables.
+
+ An alternative to using QWaitCondition and QMutex to solve the
+ producer-consumer problem is to use QSemaphore. This is what the
+ \l{threads/semaphores}{Semaphores} example does.
+
+ \section1 Global Variables
+
+ Let's start by reviewing the circular buffer and the associated
+ synchronization tools:
+
+ \snippet examples/threads/waitconditions/waitconditions.cpp 0
+
+ \c DataSize is the amount of data that the producer will generate.
+ To keep the example as simple as possible, we make it a constant.
+ \c BufferSize is the size of the circular buffer. It is less than
+ \c DataSize, meaning that at some point the producer will reach
+ the end of the buffer and restart from the beginning.
+
+ To synchronize the producer and the consumer, we need two wait
+ conditions and one mutex. The \c bufferNotEmpty condition is
+ signalled when the producer has generated some data, telling the
+ consumer that it can start reading it. The \c bufferNotFull
+ condition is signalled when the consumer has read some data,
+ telling the producer that it can generate more. The \c numUsedBytes
+ is the number of bytes in the buffer that contain data.
+
+ Together, the wait conditions, the mutex, and the \c numUsedBytes
+ counter ensure that the producer is never more than \c BufferSize
+ bytes ahead of the consumer, and that the consumer never reads
+ data that the consumer hasn't generated yet.
+
+ \section1 Producer Class
+
+ Let's review the code for the \c Producer class:
+
+ \snippet examples/threads/waitconditions/waitconditions.cpp 1
+ \snippet examples/threads/waitconditions/waitconditions.cpp 2
+
+ The producer generates \c DataSize bytes of data. Before it
+ writes a byte to the circular buffer, it must first check whether
+ the buffer is full (i.e., \c numUsedBytes equals \c BufferSize).
+ If the buffer is full, the thread waits on the \c bufferNotFull
+ condition.
+
+ At the end, the producer increments \c numUsedBytes and signalls
+ that the condition \c bufferNotEmpty is true, since \c
+ numUsedBytes is necessarily greater than 0.
+
+ We guard all accesses to the \c numUsedBytes variable with a
+ mutex. In addition, the QWaitCondition::wait() function accepts a
+ mutex as its argument. This mutex is unlocked before the thread
+ is put to sleep and locked when the thread wakes up. Furthermore,
+ the transition from the locked state to the wait state is atomic,
+ to prevent race conditions from occurring.
+
+ \section1 Consumer Class
+
+ Let's turn to the \c Consumer class:
+
+ \snippet examples/threads/waitconditions/waitconditions.cpp 3
+ \snippet examples/threads/waitconditions/waitconditions.cpp 4
+
+ The code is very similar to the producer. Before we read the
+ byte, we check whether the buffer is empty (\c numUsedBytes is 0)
+ instead of whether it's full and wait on the \c bufferNotEmpty
+ condition if it's empty. After we've read the byte, we decrement
+ \c numUsedBytes (instead of incrementing it), and we signal the
+ \c bufferNotFull condition (instead of the \c bufferNotEmpty
+ condition).
+
+ \section1 The main() Function
+
+ In \c main(), we create the two threads and call QThread::wait()
+ to ensure that both threads get time to finish before we exit:
+
+ \snippet examples/threads/waitconditions/waitconditions.cpp 5
+ \snippet examples/threads/waitconditions/waitconditions.cpp 6
+
+ So what happens when we run the program? Initially, the producer
+ thread is the only one that can do anything; the consumer is
+ blocked waiting for the \c bufferNotEmpty condition to be
+ signalled (\c numUsedBytes is 0). Once the producer has put one
+ byte in the buffer, \c numUsedBytes is \c BufferSize - 1 and the
+ \c bufferNotEmpty condition is signalled. At that point, two
+ things can happen: Either the consumer thread takes over and
+ reads that byte, or the consumer gets to produce a second byte.
+
+ The producer-consumer model presented in this example makes it
+ possible to write highly concurrent multithreaded applications.
+ On a multiprocessor machine, the program is potentially up to
+ twice as fast as the equivalent mutex-based program, since the
+ two threads can be active at the same time on different parts of
+ the buffer.
+
+ Be aware though that these benefits aren't always realized.
+ Locking and unlocking a QMutex has a cost. In practice, it would
+ probably be worthwhile to divide the buffer into chunks and to
+ operate on chunks instead of individual bytes. The buffer size is
+ also a parameter that must be selected carefully, based on
+ experimentation.
+*/
diff --git a/doc/src/examples/wiggly.qdoc b/doc/src/examples/wiggly.qdoc
new file mode 100644
index 0000000..5406c77
--- /dev/null
+++ b/doc/src/examples/wiggly.qdoc
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/wiggly
+ \title Wiggly Example
+
+ The Wiggly example shows how to animate a widget using
+ QBasicTimer and \l{QObject::timerEvent()}{timerEvent()}. In
+ addition, the example demonstrates how to use QFontMetrics to
+ determine the size of text on screen.
+
+ \image wiggly-example.png Screenshot of the Wiggly example
+
+ QBasicTimer is a low-level class for timers. Unlike QTimer,
+ QBasicTimer doesn't inherit from QObject; instead of emitting a
+ \l{QTimer::timeout()}{timeout()} signal when a certain amount of
+ time has passed, it sends a QTimerEvent to a QObject of our
+ choice. This makes QBasicTimer a more lightweight alternative to
+ QTimer. Qt's built-in widgets use it internally, and it is
+ provided in Qt's API for highly-optimized applications (e.g.,
+ \l{Qt for Embedded Linux} applications).
+
+ The example consists of two classes:
+
+ \list
+ \o \c WigglyWidget is the custom widget displaying the text
+ in a wiggly line.
+
+ \o \c Dialog is the dialog widget allowing the user to enter a
+ text. It combines a \c WigglyWidget and a \c QLineEdit.
+ \endlist
+
+ We will first take a quick look at the \c Dialog class, then we
+ will review the \c WigglyWidget class.
+
+ \section1 Dialog Class Definition
+
+ \snippet examples/widgets/wiggly/dialog.h 0
+
+ The \c Dialog class provides a dialog widget that allows the user
+ to enter a text. The text is then rendered by \c WigglyWidget.
+
+ \section1 Dialog Class Implementation
+
+ \snippet examples/widgets/wiggly/dialog.cpp 0
+
+ In the constructor we create a wiggly widget along with a
+ \l{QLineEdit}{line edit}, and we put the two widgets in a
+ vertical layout. We connect the line edit's \l
+ {QLineEdit::textChanged()}{textChanged()} signal to the wiggly
+ widget's \c setText() slot to obtain the real time interaction
+ with the wiggly widget. The widget's default text is "Hello
+ world!".
+
+ \section1 WigglyWidget Class Definition
+
+ \snippet examples/widgets/wiggly/wigglywidget.h 0
+
+ The \c WigglyWidget class provides the wiggly line displaying the
+ text. We subclass QWidget and reimplement the standard \l
+ {QWidget::paintEvent()}{paintEvent()} and \l
+ {QObject::timerEvent()}{timerEvent()} functions to draw and update
+ the widget. In addition we implement a public \c setText() slot
+ that sets the widget's text.
+
+ The \c timer variable, of type QBasicTimer, is used to update the
+ widget at regular intervals, making the widget move. The \c text
+ variable is used to store the currently displayed text, and \c
+ step to calculate position and color for each character on the
+ wiggly line.
+
+ \section1 WigglyWidget Class Implementation
+
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 0
+
+ In the constructor, we make the widget's background slightly
+ lighter than the usual background using the QPalette::Midlight
+ color role. The background role defines the brush from the
+ widget's palette that Qt uses to paint the background. Then we
+ enlarge the widget's font with 20 points.
+
+ Finally we start the timer; the call to QBasicTimer::start()
+ makes sure that \e this particular wiggly widget will receive the
+ timer events generated when the timer times out (every 60
+ milliseconds).
+
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 1
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 2
+
+ The \c paintEvent() function is called whenever a QPaintEvent is
+ sent to the widget. Paint events are sent to widgets that need to
+ update themselves, for instance when part of a widget is exposed
+ because a covering widget was moved. For the wiggly widget, a
+ paint event will also be generated every 60 milliseconds from
+ the \c timerEvent() slot.
+
+ The \c sineTable represents y-values of the sine curve,
+ multiplied by 100. It is used to make the wiggly widget move
+ along the sine curve.
+
+ The QFontMetrics object provides information about the widget's
+ font. The \c x variable is the horizontal position where we start
+ drawing the text. The \c y variable is the vertical position of
+ the text's base line. Both variables are computed so that the
+ text is horizontally and vertically centered. To compute the base
+ line, we take into account the font's ascent (the height of the
+ font above the base line) and font's descent (the height of the
+ font below the base line). If the descent equals the ascent, they
+ cancel out each other and the base line is at \c height() / 2.
+
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 3
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 4
+
+ Each time the \c paintEvent() function is called, we create a
+ QPainter object \c painter to draw the contents of the widget.
+ For each character in \c text, we determine the color and the
+ position on the wiggly line based on \c step. In addition, \c x
+ is incremented by the character's width.
+
+ For simplicity, we assume that QFontMetrics::width(\c text)
+ returns the sum of the individual character widths
+ (QFontMetrics::width(\c text[i])). In practice, this is not
+ always the case because QFontMetrics::width(\c text) also takes
+ into account the kerning between certain letters (e.g., 'A' and
+ 'V'). The result is that the text isn't perfectly centered. You
+ can verify this by typing "AVAVAVAVAVAV" in the line edit.
+
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 5
+ \snippet examples/widgets/wiggly/wigglywidget.cpp 6
+
+ The \c timerEvent() function receives all the timer events that
+ are generated for this widget. If a timer event is sent from the
+ widget's QBasicTimer, we increment \c step to make the text move,
+ and call QWidget::update() to refresh the display. Any other
+ timer event is passed on to the base class's implementation of
+ the \l{QWidget::timerEvent()}{timerEvent()} function.
+
+ The QWidget::update() slot does not cause an immediate repaint;
+ instead the slot schedules a paint event for processing when Qt
+ returns to the main event loop. The paint events are then handled
+ by \c{WigglyWidget}'s \c paintEvent() function.
+*/
diff --git a/doc/src/examples/windowflags.qdoc b/doc/src/examples/windowflags.qdoc
new file mode 100644
index 0000000..b25206e
--- /dev/null
+++ b/doc/src/examples/windowflags.qdoc
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example widgets/windowflags
+ \title Window Flags Example
+
+ The Window Flags example shows how to use the window flags
+ available in Qt.
+
+ A window flag is either a type or a hint. A type is used to
+ specify various window-system properties for the widget. A widget
+ can only have one type, and the default is Qt::Widget. However, a
+ widget can have zero or more hints. The hints are used to
+ customize the appearance of top-level windows.
+
+ A widget's flags are stored in a Qt::WindowFlags type which stores
+ an OR combination of the flags.
+
+ \image windowflags-example.png Screenshot of the Window Flags example
+
+ The example consists of two classes:
+
+ \list
+ \o \c ControllerWindow is the main application widget that allows
+ the user to choose among the available window flags, and displays
+ the effect on a separate preview window.
+ \o \c PreviewWindow is a custom widget displaying the name of
+ its currently set window flags in a read-only text editor.
+ \endlist
+
+ We will start by reviewing the \c ControllerWindow class, then we
+ will take a look at the \c PreviewWindow class.
+
+ \section1 ControllerWindow Class Definition
+
+ \snippet examples/widgets/windowflags/controllerwindow.h 0
+
+ The \c ControllerWindow class inherits QWidget. The widget allows
+ the user to choose among the available window flags, and displays
+ the effect on a separate preview window.
+
+ We declare a private \c updatePreview() slot to refresh the
+ preview window whenever the user changes the window flags.
+
+ We also declare several private functions to simplify the
+ constructor: We call the \c createTypeGroupBox() function to
+ create a radio button for each available window type, using the
+ private \c createButton() function, and gather them within a group
+ box. In a similar way we use the \c createHintsGroupBox() function
+ to create a check box for each available hint, using the private
+ \c createCheckBox() function.
+
+ In addition to the various radio buttons and checkboxes, we need
+ an associated \c PreviewWindow to show the effect of the currently
+ chosen window flags.
+
+ \image windowflags_controllerwindow.png Screenshot of the Controller Window
+
+ \section1 ControllerWindow Class Implementation
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 0
+
+ In the constructor we first create the preview window. Then we
+ create the group boxes containing the available window flags using
+ the private \c createTypeGroupBox() and \c createHintsGroupBox()
+ functions. In addition we create a \gui Quit button. We put the
+ button and a stretchable space in a separate layout to make the
+ button appear in the \c WindowFlag widget's right bottom corner.
+
+ Finally, we add the button's layout and the two goup boxes to a
+ QVBoxLayout, set the window title and refresh the preview window
+ using the \c updatePreview() slot.
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 1
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 2
+
+ The \c updatePreview() slot is called whenever the user changes
+ any of the window flags. First we create an empty Qt::WindowFlags
+ \c flags, then we determine which one of the types that is checked
+ and add it to \c flags.
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 3
+
+ We also determine which of the hints that are checked, and add
+ them to \c flags using an OR operator. We use \c flags to set the
+ window flags for the preview window.
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 4
+
+ We adjust the position of the preview window. The reason we do
+ that, is that playing around with the window's frame may on some
+ platforms cause the window's position to be changed behind our
+ back. If a window is located in the upper left corner of the
+ screen, parts of the window may not be visible. So we adjust the
+ widget's position to make sure that, if this happens, the window
+ is moved within the screen's boundaries. Finally, we call
+ QWidget::show() to make sure the preview window is visible.
+
+ \omit
+ \skipto pos
+ \printuntil /^\}/
+ \endomit
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 5
+
+ The private \c createTypeGroupBox() function is called from the
+ constructor.
+
+ First we create a group box, and then we create a radio button
+ (using the private \c createRadioButton() function) for each of
+ the available types among the window flags. We make Qt::Window the
+ initially applied type. We put the radio buttons into a
+ QGridLayout and install the layout on the group box.
+
+ We do not include the default Qt::Widget type. The reason is that
+ it behaves somewhat different than the other types. If the type is
+ not specified for a widget, and it has no parent, the widget is a
+ window. However, if it has a parent, it is a standard child
+ widget. The other types are all top-level windows, and since the
+ hints only affect top-level windows, we abandon the Qt::Widget
+ type.
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 6
+
+ The private \c createHintsGroupBox() function is also called from
+ the constructor.
+
+ Again, the first thing we do is to create a group box. Then we
+ create a checkbox, using the private \c createCheckBox() function,
+ for each of the available hints among the window flags. We put the
+ checkboxes into a QGridLayout and install the layout on the group
+ box.
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 7
+
+ The private \c createCheckBox() function is called from \c
+ createHintsGroupBox().
+
+ We simply create a QCheckBox with the provided text, connect it to
+ the private \c updatePreview() slot, and return a pointer to the
+ checkbox.
+
+ \snippet examples/widgets/windowflags/controllerwindow.cpp 8
+
+ In the private \c createRadioButton() function it is a
+ QRadioButton we create with the provided text, and connect to the
+ private \c updatePreview() slot. The function is called from \c
+ createTypeGroupBox(), and returns a pointer to the button.
+
+ \section1 PreviewWindow Class Definition
+
+ \snippet examples/widgets/windowflags/previewwindow.h 0
+
+ The \c PreviewWindow class inherits QWidget. It is a custom widget
+ that displays the names of its currently set window flags in a
+ read-only text editor. It is also provided with a QPushbutton that
+ closes the window.
+
+ We reimplement the constructor to create the \gui Close button and
+ the text editor, and the QWidget::setWindowFlags() function to
+ display the names of the window flags.
+
+ \image windowflags_previewwindow.png Screenshot of the Preview Window
+
+ \section1 PreviewWindow Class Implementation
+
+ \snippet examples/widgets/windowflags/previewwindow.cpp 0
+
+ In the constructor, we first create a QTextEdit and make sure that
+ it is read-only.
+
+ We also prohibit any line wrapping in the text editor using the
+ QTextEdit::setLineWrapMode() function. The result is that a
+ horizontal scrollbar appears when a window flag's name exceeds the
+ width of the editor. This is a reasonable solution since we
+ construct the displayed text with built-in line breaks. If no line
+ breaks were guaranteed, using another QTextEdit::LineWrapMode
+ would perhaps make more sense.
+
+ Then we create the \gui Close button, and put both the widgets
+ into a QVBoxLayout before we set the window title.
+
+ \snippet examples/widgets/windowflags/previewwindow.cpp 1
+
+ In our reimplementation of the \c setWindowFlags() function, we
+ first set the widgets flags using the QWidget::setWindowFlags()
+ function. Then we run through the available window flags, creating
+ a text that contains the names of the flags that matches the \c
+ flags parameter. Finally, we display the text in the widgets text
+ editor.
+*/
diff --git a/doc/src/examples/worldtimeclockbuilder.qdoc b/doc/src/examples/worldtimeclockbuilder.qdoc
new file mode 100644
index 0000000..644ffdb
--- /dev/null
+++ b/doc/src/examples/worldtimeclockbuilder.qdoc
@@ -0,0 +1,111 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/worldtimeclockbuilder
+ \title World Time Clock Builder Example
+
+ The World Time Clock Builder example shows how forms created with Qt
+ Designer that contain custom widgets can be dynamically generated at
+ run-time.
+
+ \image worldtimeclockbuilder-example.png
+
+ This example uses a form containing the custom widget plugin described in the
+ \l{designer/worldtimeclockplugin}{World Time Clock Plugin} example, and
+ dynamically generates a user interface using the QUiLoader class, part of
+ the QtUiTools module.
+
+ \section1 Preparation
+
+ As with the \l{designer/calculatorbuilder}{Calculator Builder} example, the
+ project file for this example needs to include the appropriate definitions
+ to ensure that it is built against the required Qt modules.
+
+ \snippet examples/designer/worldtimeclockbuilder/worldtimeclockbuilder.pro 0
+
+ By appending \c form to the \c CONFIG declaration, we instruct \c qmake to
+ generate a dependency on the \c libQtUiTools library containing the QtUiTools
+ classes.
+
+ Note that we do not inform \c qmake about any .ui files, and so none will
+ be processed and built into the application. The resource file contains
+ an entry for the particular form that we wish to use:
+
+ \quotefile examples/designer/worldtimeclockbuilder/worldtimeclockbuilder.qrc
+
+ Forms do not need to be included with the application in this way. We only
+ include a form in the application's resources for convenience, and to keep
+ the example short.
+
+ \section1 Loading and Building the Form
+
+ Since this example only loads and displays a pre-prepared form, all of the
+ work can be done in the main() function. We are using a class from the
+ QtUiTools library so, in addition to any other Qt classes that are normally
+ required to write an application, we must include the appropriate header
+ file:
+
+ \snippet examples/designer/worldtimeclockbuilder/main.cpp 0
+
+ The main function initializes the resource system with the Q_INIT_RESOURCE()
+ macro and constructs an QApplication instance in the usual way:
+
+ \snippet examples/designer/worldtimeclockbuilder/main.cpp 1
+
+ We construct a QUiLoader object to handle the form we want to use.
+
+ The form itself is obtained from the resource file system using the path
+ defined in the resource file. We use the form loader to load and construct
+ the form:
+
+ \snippet examples/designer/worldtimeclockbuilder/main.cpp 2
+
+ Once the form has been loaded, the resource file can be closed and the
+ widget is shown.
+
+ \snippet examples/designer/worldtimeclockbuilder/main.cpp 3
+
+ The form loader ensures that all the signal and slot connections between
+ objects in the form are set up correctly when the form is loaded. As a
+ result, the time is updated by the World Time Clock widget, and the time
+ zone spin box can be used to change the position of the hour hand.
+*/
diff --git a/doc/src/examples/worldtimeclockplugin.qdoc b/doc/src/examples/worldtimeclockplugin.qdoc
new file mode 100644
index 0000000..072b1f0
--- /dev/null
+++ b/doc/src/examples/worldtimeclockplugin.qdoc
@@ -0,0 +1,210 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example designer/worldtimeclockplugin
+ \title World Time Clock Plugin Example
+
+ The World Time Clock Plugin example shows how to create a custom
+ widget plugin for \QD that uses signals and slots.
+
+ \image worldtimeclockplugin-example.png
+
+ In this example, we simply extend the \l
+ {designer/customwidgetplugin}{Custom Widget Plugin} example and
+ its custom widget (based on the \l{widgets/analogclock}{Analog
+ Clock} example), by introducing the concept of signals and slots.
+
+ The World Time Clock Plugin example consists of two classes:
+
+ \list
+ \o \c WorldTimeClock is a custom clock widget with hour and
+ minute hands that is automatically updated every few seconds.
+ \o \c WorldTimeClockPlugin exposes the \c WorldTimeClock class to \QD.
+ \endlist
+
+ First we will take a look at the \c WorldTimeClock class which
+ extends the \l {designer/customwidgetplugin}{Custom Widget Plugin}
+ example's \c AnalogClock class by providing a signal and a
+ slot. Then we will take a quick look at the \c
+ WorldTimeClockPlugin class, but this class is in most parts
+ identical to the \l {designer/customwidgetplugin}{Custom Widget
+ Plugin} example's implementation.
+
+ Finally we take a look at the plugin's project file. The project
+ file for custom widget plugins needs some additional information
+ to ensure that they will work within \QD. This is also covered in
+ the \l {designer/customwidgetplugin}{Custom Widget Plugin} example,
+ but due to its importance (custom widget plugins rely on
+ components supplied with \QD which must be specified in the
+ project file that we use) we will repeat it here.
+
+ \section1 WorldTimeClock Class
+
+ The \c WorldTimeClock class inherits QWidget, and is a custom
+ clock widget with hour and minute hands that is automatically
+ updated every few seconds. What makes this example different from
+ the \l {designer/customwidgetplugin}{Custom Widget Plugin}
+ example, is the introduction of the signal and slot in the custom
+ widget class:
+
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclock.h 1
+
+ Note the use of the QDESIGNER_WIDGET_EXPORT macro. This is needed
+ to ensure that \QD can create instances of the widget on some
+ platforms, but it is a good idea to use it on all platforms.
+
+ We declare the \c setTimeZone() slot with an associated \c
+ timeZoneOffset variable, and we declare an \c updated() signal
+ which takes the current time as argument and is emitted whenever
+ the widget is repainted.
+
+ \image worldtimeclock-connection.png
+
+ In \QD's workspace we can then, for example, connect the \c
+ WorldTimeClock widget's \c updated() signal to a QTimeEdit's \l
+ {QDateTimeEdit::setTime()}{setTime()} slot using \QD's mode
+ for editing signal and slots.
+
+ \image worldtimeclock-signalandslot.png
+
+ We can also connect a QSpinBox's \l
+ {QSpinBox::valueChanged()}{valueChanged()} signal to the \c
+ WorldTimeClock's \c setTimeZone() slot.
+
+ \section1 WorldTimeClockPlugin Class
+
+ The \c WorldTimeClockPlugin class exposes the \c WorldTimeClock
+ class to \QD. Its definition is equivalent to the \l
+ {designer/customwidgetplugin}{Custom Widget Plugin} example's
+ plugin class which is explained in detail. The only part of the
+ class definition that is specific to this particular custom widget
+ is the class name:
+
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclockplugin.h 0
+
+ The plugin class provides \QD with basic information about our
+ plugin, such as its class name and its include file. Furthermore
+ it knows how to create instances of the \c WorldTimeClockPlugin
+ widget. \c WorldTimeClockPlugin also defines the \l
+ {QDesignerCustomWidgetInterface::initialize()}{initialize()}
+ function which is called after the plugin is loaded into \QD. The
+ function's QDesignerFormEditorInterface parameter provides the
+ plugin with a gateway to all of \QD's API's.
+
+ The \c WorldTimeClockPlugin class inherits from both QObject and
+ QDesignerCustomWidgetInterface. It is important to remember, when
+ using multiple inheritance, to ensure that all the interfaces
+ (i.e. the classes that doesn't inherit Q_OBJECT) are made known to
+ the meta object system using the Q_INTERFACES() macro. This
+ enables \QD to use \l qobject_cast() to query for supported
+ interfaces using nothing but a QObject pointer.
+
+ The implementation of the \c WorldTimeClockPlugin is also
+ equivalent to the plugin interface implementation in the \l
+ {designer/customwidgetplugin}{Custom Widget Plugin} example (only
+ the class name and the implementation of
+ QDesignerCustomWidgetInterface::domXml() differ). The main thing
+ to remember is to use the Q_EXPORT_PLUGIN2() macro to export the \c
+ WorldTimeClockPlugin class for use with \QD:
+
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclockplugin.cpp 0
+
+ Without this macro, there is no way for Qt Designer to use the
+ widget.
+
+ \section1 The Project File: worldtimeclockplugin.pro
+
+ The project file for custom widget plugins needs some additional
+ information to ensure that they will work as expected within \QD:
+
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclockplugin.pro 0
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclockplugin.pro 1
+
+ The \c TEMPLATE variable's value make \c qmake create the custom
+ widget as a library. The \c CONFIG variable contains two values,
+ \c designer and \c plugin:
+
+ \list
+ \o \c designer: Since custom widgets plugins rely on components
+ supplied with \QD, this value ensures that our plugin links against
+ \QD's library (\c libQtDesigner.so).
+
+ \o \c plugin: We also need to ensure that \c qmake considers the
+ custom widget a \e plugin library.
+ \endlist
+
+ When Qt is configured to build in both debug and release modes,
+ \QD will be built in release mode. When this occurs, it is
+ necessary to ensure that plugins are also built in release
+ mode. For that reason you might have to add a \c release value to
+ your \c CONFIG variable. Otherwise, if a plugin is built in a mode
+ that is incompatible with \QD, it won't be loaded and
+ installed.
+
+ The header and source files for the widget are declared in the
+ usual way, and in addition we provide an implementation of the
+ plugin interface so that \QD can use the custom widget.
+
+ \snippet examples/designer/worldtimeclockplugin/worldtimeclockplugin.pro 2
+
+ It is important to ensure that the plugin is installed in a location that
+ is searched by \QD. We do this by specifying a target path for the project
+ and adding it to the list of items to install:
+
+ \snippet doc/src/snippets/code/doc_src_examples_worldtimeclockplugin.qdoc 0
+
+ The custom widget is created as a library, and will be installed
+ alongside the other \QD plugins when the project is installed
+ (using \c{make install} or an equivalent installation procedure).
+ Later, we will ensure that it is recognized as a plugin by \QD by
+ using the Q_EXPORT_PLUGIN2() macro to export the relevant widget
+ information.
+
+ Note that if you want the plugins to appear in a Visual Studio
+ integration, the plugins must be built in release mode and their
+ libraries must be copied into the plugin directory in the install
+ path of the integration (for an example, see \c {C:/program
+ files/trolltech as/visual studio integration/plugins}).
+
+ For more information about plugins, see the \l {How to Create Qt
+ Plugins} document.
+*/
diff --git a/doc/src/examples/xmlstreamlint.qdoc b/doc/src/examples/xmlstreamlint.qdoc
new file mode 100644
index 0000000..925a7a0
--- /dev/null
+++ b/doc/src/examples/xmlstreamlint.qdoc
@@ -0,0 +1,86 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example xml/xmlstreamlint
+ \title XML Stream Lint Example
+
+ The XML Stream Lint example provides a simple command line utility that
+ accepts a file name as its single argument and writes it to the standard
+ output file.
+
+ The specified file is parsed using an QXmlStreamReader object and written
+ to the standard output file using an QXmlStreamWriter object. If the file
+ does not contain a well-formed XML document or the use of namespaces in
+ the document is incorrect, a description of the error is printed to
+ the standard error file and will appear in the console.
+
+ \section1 Basic Operation
+
+ The main function of the example opens the file specified by the user
+ for input (\c inputFile), and it uses QFile to access the standard output
+ file.
+
+ Reading XML is handled by an instance of the QXmlStreamReader class, which
+ operates on the input file object; writing is handled by an instance of
+ QXmlStreamWriter operating on the output file object:
+
+ \snippet examples/xml/xmlstreamlint/main.cpp 0
+
+ The work of parsing and rewriting the XML is done in a while loop, and is
+ driven by input from the reader:
+
+ \snippet examples/xml/xmlstreamlint/main.cpp 1
+
+ If more input is available, the next token from the input file is read
+ and parsed. If an error occurred, information is written to the standard
+ error file via a stream, and the example exits by returning a non-zero
+ value from the main function.
+
+ \snippet examples/xml/xmlstreamlint/main.cpp 2
+
+ For valid input, the writer is fed the current token from the reader,
+ and this is written to the output file that was specified when it was
+ constructed.
+
+ When there is no more input, the loop terminates, and the example can
+ exit successfully.
+*/
diff --git a/doc/src/exportedfunctions.qdoc b/doc/src/exportedfunctions.qdoc
new file mode 100644
index 0000000..f67950c
--- /dev/null
+++ b/doc/src/exportedfunctions.qdoc
@@ -0,0 +1,136 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page exportedfunctions.html
+ \title Special-Purpose Global Functions Exported by Qt
+ \ingroup classlists
+
+ Qt provides a few low-level global functions for fine-tuning
+ applications. Most of these perform very specific tasks and are
+ platform-specific. In general, we recommend that you try using
+ Qt's public API before resorting to using any functions mentioned
+ here.
+
+ These functions are exported by \l QtCore and \l QtGui, but most
+ of them aren't declared in Qt's header files. To use them in your
+ application, you must declare them before calling them. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_exportedfunctions.qdoc 0
+
+ These functions will remain as part of Qt for the lifetime of Qt
+ 4.
+
+ Functions:
+
+ \tableofcontents
+
+ \section1 void qt_set_library_config_file(const QString &\e{fileName})
+
+ Specifies the location of the Qt configuration file. You must
+ call this function before constructing a QApplication or
+ QCoreApplication object. If no location is specified, Qt
+ automatically finds an appropriate location.
+
+ \section1 void qt_set_sequence_auto_mnemonic(bool \e{enable})
+
+ Specifies whether mnemonics for menu items, labels, etc., should
+ be honored or not. On Windows and X11, this feature is
+ on by default; on Mac OS X, it is off. When this feature is off,
+ the QKeySequence::mnemonic() function always returns an empty
+ string. This feature is also enabled on embedded Linux.
+
+ \section1 void qt_x11_wait_for_window_manager(QWidget *\e{widget})
+
+ Blocks until the X11 window manager has shown the widget after a
+ call to QWidget::show().
+
+ \section1 void qt_mac_secure_keyboard(bool \e{enable})
+
+ Turns the Mac OS X secure keyboard feature on or off. QLineEdit
+ uses this when the echo mode is QLineEdit::Password or
+ QLineEdit::NoEcho to guard the editor against keyboard sniffing.
+ If you implement your own password editor, you might want to turn
+ on this feature in your editor's
+ \l{QWidget::focusInEvent()}{focusInEvent()} and turn it off in
+ \l{QWidget::focusOutEvent()}{focusOutEvent()}.
+
+ \section1 void qt_mac_set_dock_menu(QMenu *\e{menu})
+
+ Sets the menu to display in the Mac OS X Dock for the
+ application. This menu is shown when the user attempts a
+ press-and-hold operation on the application's dock icon or
+ \key{Ctrl}-clicks on it while the application is running.
+
+ The menu will be turned into a Mac menu and the items added to the default
+ Dock menu. There is no merging of the Qt menu items with the items that are
+ in the Dock menu (i.e., it is not recommended to include actions that
+ duplicate functionality of items already in the Dock menu).
+
+ \section1 void qt_mac_set_menubar_icons(bool \e{enable})
+
+ Specifies whether icons associated to menu items for the
+ application's menu bar should be shown on Mac OS X. By default,
+ icons are shown on Mac OS X just like on the other platforms.
+
+ In Qt 4.4, this is equivalent to
+ \c { QApplication::instance()->setAttribute(Qt::AA_DontShowIconsInMenus); }.
+
+ \section1 void qt_mac_set_menubar_merge(bool \e{enable})
+
+ Specifies whether Qt should attempt to relocate standard menu
+ items (such as \gui Quit, \gui Preferences, and \gui About) to
+ the application menu on Mac OS X. This feature is on by default.
+ See \l{Qt for Mac OS X - Specific Issues} for the list of menu items for
+ which this applies.
+
+ \section1 void qt_mac_set_native_menubar(bool \e{enable})
+
+ Specifies whether the application should use the native menu bar
+ on Mac OS X or be part of the main window. This feature is on by
+ default.
+
+ \section1 void qt_mac_set_press_and_hold_context(bool \e{enable})
+
+ Turns emulation of the right mouse button by clicking and holding
+ the left mouse button on or off. This feature is off by default.
+*/
diff --git a/doc/src/external-resources.qdoc b/doc/src/external-resources.qdoc
new file mode 100644
index 0000000..f48c3d7
--- /dev/null
+++ b/doc/src/external-resources.qdoc
@@ -0,0 +1,349 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \externalpage http://www.freedesktop.org/
+ \title freedesktop.org
+*/
+
+/*!
+ \externalpage http://www.freedesktop.org/Standards/xembed-spec
+ \title XEmbed Specification
+*/
+
+/*!
+ \externalpage http://www.freedesktop.org/Standards/icon-theme-spec
+ \title Icon Themes Specification
+*/
+
+/*!
+ \externalpage http://www.cups.org/
+ \title Common Unix Printing System (CUPS)
+ \keyword CUPS
+*/
+
+/*!
+ \externalpage http://www.freedesktop.org/wiki/Standards_2fdesktop_2dentry_2dspec
+ \title Desktop Entry Specification
+*/
+
+/*!
+ \externalpage http://www.kde.org/
+ \title The K Desktop Environment
+ \keyword KDE
+*/
+
+/*!
+ \externalpage http://www.gnome.org/
+ \title GNOME
+*/
+
+/*!
+ \externalpage http://www.gnu.org/software/emacs/
+ \title GNU Emacs
+*/
+
+/*!
+ \externalpage http://www.amnesty.org/
+ \title Amnesty International
+*/
+
+/*!
+ \externalpage http://www.w3.org/Graphics/SVG/About.html
+ \title About SVG
+ \keyword Scalable Vector Graphics
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/SVG/types.html#ColorKeywords
+ \title SVG color keyword names
+*/
+
+/*!
+ \externalpage http://www.w3.org/Graphics/SVG/
+ \title SVG Working Group
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/SVGMobile/
+ \title Mobile SVG Profiles
+ \omit
+ Mobile SVG Profiles: SVG Tiny and SVG Basic
+ \endomit
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/SVGMobile12/
+ \title SVG 1.2 Tiny
+*/
+
+/*!
+ \externalpage http://www.w3.org/Graphics/SVG/feature/1.2/#SVG-static
+ \title SVG 1.2 Tiny Static Features
+*/
+
+/*!
+ \externalpage http://www.ietf.org/rfc/rfc1179.txt
+ \title RFC 1179
+ \keyword lpr
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc1738.txt
+ \title RFC 1738
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc1928.txt
+ \title RFC 1928
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc1929.txt
+ \title RFC 1929
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc2045.txt
+ \title RFC 2045
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc2109.txt
+ \title RFC 2109
+ HTTP State Management Mechanism
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc2965.txt
+ \title RFC 2965
+ HTTP State Management Mechanism
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc3174.txt
+ \title RFC 3174
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc3491.txt
+ \title RFC 3491
+*/
+
+/*!
+ \externalpage http://www.rfc-editor.org/rfc/rfc3986.txt
+ \title RFC 3986
+*/
+
+/*!
+ \externalpage http://www.dependencywalker.com/
+ \title Dependency Walker
+*/
+
+/*!
+ \externalpage http://www.ecma-international.org/publications/standards/Ecma-262.htm
+ \title ECMA-262
+*/
+
+/*!
+ \externalpage http://www.davidflanagan.com/javascript5/
+ \title JavaScript: The Definitive Guide
+*/
+
+/*!
+ \externalpage http://webkit.org/
+ \title WebKit Open Source Project
+*/
+
+/*!
+ \externalpage http://www.informit.com/store/product.aspx?isbn=0132354160
+ \title C++ GUI Programming with Qt 4, 2nd Edition
+*/
+
+/*!
+ \externalpage http://www.openssl.org/
+ \title OpenSSL Toolkit
+*/
+
+/*!
+ \externalpage http://arora-browser.org/
+ \title Arora Browser
+*/
+
+/*!
+ \externalpage http://www.activestate.com/Products/activeperl/index.mhtml
+ \title ActivePerl
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/html401/
+ \title HTML 4
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/html5/
+ \title HTML 5
+*/
+
+/*!
+ \externalpage http://pyxml.sourceforge.net/topics/xbel/
+ \title XML Bookmark Exchange Language Resource Page
+*/
+
+/*!
+ \externalpage http://www.w3.org/TR/xquery/#errors
+ \title error handling in the XQuery language
+*/
+
+/*!
+ \externalpage http://xaos.sourceforge.net/
+ \title XaoS
+*/
+
+/*!
+ \externalpage http://www.unixodbc.org
+ \title http://www.unixodbc.org
+*/
+
+/*!
+ \externalpage http://www.postgresql.org
+ \title http://www.postgresql.org
+*/
+
+/*!
+ \externalpage http://www.postgresql.org/docs/faqs.FAQ_MINGW.html
+ \title Compiling PostgreSQL On Native Win32 FAQ
+*/
+
+/*!
+ \externalpage http://www.freetds.org
+ \title http://www.freetds.org
+*/
+
+/*!
+ \externalpage http://www.sybase.com
+ \title http://www.sybase.com
+*/
+
+/*!
+ \externalpage http://linux.sybase.com
+ \title http://linux.sybase.com
+*/
+
+/*!
+ \externalpage http://www.sqlite.org
+ \title http://www.sqlite.org
+*/
+
+/*!
+ \externalpage http://www.amazon.com/exec/obidos/ASIN/0134436989/trolltech/t
+ \title Threads Primer: A Guide to Multithreaded Programming
+*/
+
+/*!
+ \externalpage http://www.amazon.com/exec/obidos/ASIN/0131900676/trolltech/t
+ \title Thread Time: The Multithreaded Programming Guide
+*/
+
+/*!
+ \externalpage http://www.amazon.com/exec/obidos/ASIN/1565921151/trolltech/t
+ \title Pthreads Programming: A POSIX Standard for Better Multiprocessing
+*/
+
+/*!
+ \externalpage http://www.amazon.com/exec/obidos/ASIN/1565922964/trolltech/t
+ \title Win32 Multithreaded Programming
+*/
+
+/*!
+ \externalpage http://www.iana.org/assignments/character-sets
+ \title IANA character-sets encoding file
+*/
+
+/*!
+ \externalpage http://www.phptr.com/content/images/0131872494/samplechapter/blanchette_ch10.pdf
+ \title "Item View Classes" Chapter of C++ GUI Programming with Qt 4
+*/
+
+/*!
+ \externalpage http://developer.apple.com/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGIntro/chapter_1_section_1.html
+ \title Mac OS X Aqua
+*/
+
+/*!
+ \externalpage http://www.kdedevelopers.org/node/2345
+ \title KDE applications
+*/
+
+/*!
+ \externalpage http://cgi.netscape.com/newsref/std/cookie_spec.html
+ \title Netscape Cookie Specification
+*/
+
+/*!
+ \externalpage http://msdn.microsoft.com/en-us/library/ms533046(VS.85).aspx
+ \title Mitigating Cross-site Scripting With HTTP-only Cookies
+*/
+
+/*!
+ \externalpage http://en.tldp.org/HOWTO/Framebuffer-HOWTO.html
+ \title Framebuffer HOWTO
+*/
+
+/*!
+ \externalpage http://wap.trafikanten.no
+ \title Trafikanten
+*/
+
+/*!
+ \externalpage http://www.gnu.org/licenses/gpl.html
+ \title GNU General Public License
+*/
+
+/*!
+ \externalpage http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
+ \title GNU Lesser General Public License, version 2.1
+*/
+
+/*!
+ \externalpage http://developers.sun.com/sunstudio/downloads/patches/index.jsp
+ \title Sun Studio Patches
+*/
diff --git a/doc/src/focus.qdoc b/doc/src/focus.qdoc
new file mode 100644
index 0000000..defb3e0
--- /dev/null
+++ b/doc/src/focus.qdoc
@@ -0,0 +1,213 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Documentation of focus handling in Qt.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page focus.html
+ \title Keyboard Focus
+ \ingroup architecture
+ \ingroup gui-programming
+ \brief An overview of the keyboard focus management and handling.
+
+ \keyword keyboard focus
+
+ Qt's widgets handle keyboard focus in the ways that have become
+ customary in GUIs.
+
+ The basic issue is that the user's key strokes can be directed at any
+ of several windows on the screen, and any of several widgets inside
+ the intended window. When the user presses a key, they expect it to go
+ to the right place, and the software must try to meet this
+ expectation. The system must determine which application the key stroke
+ is directed at, which window within that application, and which widget
+ within that window.
+
+ \section1 Focus Motion
+
+ The customs which have evolved for directing keyboard focus to a
+ particular widget are these:
+
+ \list 1
+
+ \o The user presses \key Tab (or \key Shift+Tab).
+ \o The user clicks a widget.
+ \o The user presses a keyboard shortcut.
+ \o The user uses the mouse wheel.
+ \o The user moves the focus to a window, and the application must
+ determine which widget within the window should get the focus.
+ \endlist
+
+ Each of these motion mechanisms is different, and different types of
+ widgets receive focus in only some of them. We'll cover each of them
+ in turn.
+
+ \section2 Tab or Shift+Tab
+
+ Pressing \key Tab is by far the most common way to move focus
+ using the keyboard. (Sometimes in data-entry applications Enter
+ does the same as \key{Tab}; this can easily be achieved in Qt by
+ implementing an \l{Events and Event Filters}{event filter}.)
+
+ Pressing \key Tab, in all window systems in common use today,
+ moves the keyboard focus to the next widget in a circular
+ per-window list. \key Tab moves focus along the circular list in
+ one direction, \key Shift+Tab in the other. The order in which
+ \key Tab presses move from widget to widget is called the tab order.
+
+ You can customize the tab order using QWidget::setTabOrder(). (If
+ you don't, \key Tab generally moves focus in the order of widget
+ construction.) \l{Qt Designer} provides a means of visually
+ changing the tab order.
+
+ Since pressing \key Tab is so common, most widgets that can have focus
+ should support tab focus. The major exception is widgets that are
+ rarely used, and where there is some keyboard accelerator or error
+ handler that moves the focus.
+
+ For example, in a data entry dialog, there might be a field that
+ is only necessary in one per cent of all cases. In such a dialog,
+ \key Tab could skip this field, and the dialog could use one of
+ these mechanisms:
+
+ \list 1
+
+ \o If the program can determine whether the field is needed, it can
+ move focus there when the user finishes entry and presses \gui OK, or when
+ the user presses Enter after finishing the other fields. Alternately,
+ include the field in the tab order but disable it. Enable it if it
+ becomes appropriate in view of what the user has set in the other
+ fields.
+
+ \o The label for the field can include a keyboard shortcut that moves
+ focus to this field.
+
+ \endlist
+
+ Another exception to \key Tab support is text-entry widgets that
+ must support the insertion of tabs; almost all text editors fall
+ into this class. Qt treats \key Ctrl+Tab as \key Tab and \key
+ Ctrl+Shift+Tab as \key Shift+Tab, and such widgets can
+ reimplement QWidget::event() and handle Tab before calling
+ QWidget::event() to get normal processing of all other keys.
+ However, since some systems use \key Ctrl+Tab for other purposes,
+ and many users aren't aware of \key Ctrl+Tab anyway, this isn't a
+ complete solution.
+
+ \section2 The User Clicks a Widget
+
+ This is perhaps even more common than pressing \key Tab on
+ computers with a mouse or other pointing device.
+
+ Clicking to move the focus is slightly more powerful than \key
+ Tab. While it moves the focus \e to a widget, for editor widgets
+ it also moves the text cursor (the widget's internal focus) to
+ the spot where the mouse is clicked.
+
+ Since it is so common and people are used to it, it's a good idea to
+ support it for most widgets. However, there is also an important
+ reason to avoid it: you may not want to remove focus from the widget
+ where it was.
+
+ For example, in a word processor, when the user clicks the 'B' (bold)
+ tool button, what should happen to the keyboard focus? Should it
+ remain where it was, almost certainly in the editing widget, or should
+ it move to the 'B' button?
+
+ We advise supporting click-to-focus for widgets that support text
+ entry, and to avoid it for most widgets where a mouse click has a
+ different effect. (For buttons, we also recommend adding a keyboard
+ shortcut: QAbstractButton and its subclasses make this very easy.)
+
+ In Qt, only the QWidget::setFocusPolicy() function affects
+ click-to-focus.
+
+ \section2 The User Presses a Keyboard Shortcut
+
+ It's not unusual for keyboard shortcuts to move the focus. This
+ can happen implicitly by opening modal dialogs, but also
+ explicitly using focus accelerators such as those provided by
+ QLabel::setBuddy(), QGroupBox, and QTabBar.
+
+ We advise supporting shortcut focus for all widgets that the user
+ may want to jump to. For example, a tab dialog can have keyboard
+ shortcuts for each of its pages, so the user can press e.g. \key
+ Alt+P to step to the \underline{P}rinting page. It is easy to
+ overdo this: there are only a few keys, and it's also important
+ to provide keyboard shortcuts for commands. \key Alt+P is also
+ used for Paste, Play, Print, and Print Here in the \l{Standard
+ Accelerator Keys} list, for example.
+
+ \section2 The User Rotates the Mouse Wheel
+
+ On Microsoft Windows, mouse wheel usage is always handled by the
+ widget that has keyboard focus. On Mac OS X and X11, it's handled by
+ the widget that gets other mouse events.
+
+ The way Qt handles this platform difference is by letting widgets move
+ the keyboard focus when the wheel is used. With the right focus policy
+ on each widget, applications can work idiomatically correctly on
+ Windows, Mac OS X, and X11.
+
+ \section2 The User Moves the Focus to This Window
+
+ In this situation the application must determine which widget within
+ the window should receive the focus.
+
+ This can be simple: If the focus has been in this window before,
+ then the last widget to have focus should regain it. Qt does this
+ automatically.
+
+ If focus has never been in this window before and you know where
+ focus should start out, call QWidget::setFocus() on the widget
+ which should receive focus before you call QWidget::show() it. If
+ you don't, Qt will pick a suitable widget.
+*/
diff --git a/doc/src/functions.qdoc b/doc/src/functions.qdoc
new file mode 100644
index 0000000..4aa0851
--- /dev/null
+++ b/doc/src/functions.qdoc
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/****************************************************************************
+**
+** Documentation for class overview.
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the Qt GUI Toolkit.
+** EDITIONS: FREE, PROFESSIONAL, ENTERPRISE
+**
+****************************************************************************/
+
+/*!
+ \page functions.html
+ \title Member Function Index
+ \ingroup classlists
+
+ Here is the list of all the documented member functions in the Qt
+ API with links to the class documentation for each function.
+
+ \generatelist functionindex
+*/
diff --git a/doc/src/gallery-cde.qdoc b/doc/src/gallery-cde.qdoc
new file mode 100644
index 0000000..36916a2
--- /dev/null
+++ b/doc/src/gallery-cde.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-cde.html
+
+ \title CDE Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "cde" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.
+\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cde-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cde-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-cleanlooks.qdoc b/doc/src/gallery-cleanlooks.qdoc
new file mode 100644
index 0000000..7ae5385
--- /dev/null
+++ b/doc/src/gallery-cleanlooks.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-cleanlooks.html
+
+ \title Cleanlooks Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "cleanlooks" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage cleanlooks-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-gtk.qdoc b/doc/src/gallery-gtk.qdoc
new file mode 100644
index 0000000..8251f04
--- /dev/null
+++ b/doc/src/gallery-gtk.qdoc
@@ -0,0 +1,358 @@
+/*!
+ \page gallery-gtk.html
+
+ \title GTK Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "gtk" style.
+
+ Take a look at the \l{Qt Widget Gallery} to see how Qt
+ applications appear in other styles.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-toolbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-frame.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage gtk-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td align="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td align="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage gtk-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-macintosh.qdoc b/doc/src/gallery-macintosh.qdoc
new file mode 100644
index 0000000..608713d
--- /dev/null
+++ b/doc/src/gallery-macintosh.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-macintosh.html
+
+ \title Macintosh Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "macintosh" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage macintosh-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage macintosh-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-motif.qdoc b/doc/src/gallery-motif.qdoc
new file mode 100644
index 0000000..79c44b1
--- /dev/null
+++ b/doc/src/gallery-motif.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-motif.html
+
+ \title Motif Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "motif" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage motif-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage motif-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-plastique.qdoc b/doc/src/gallery-plastique.qdoc
new file mode 100644
index 0000000..b184ea8
--- /dev/null
+++ b/doc/src/gallery-plastique.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-plastique.html
+
+ \title Plastique Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "plastique" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage plastique-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage plastique-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-windows.qdoc b/doc/src/gallery-windows.qdoc
new file mode 100644
index 0000000..40ba7ce
--- /dev/null
+++ b/doc/src/gallery-windows.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-windows.html
+
+ \title Windows Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "windows" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windows-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windows-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-windowsvista.qdoc b/doc/src/gallery-windowsvista.qdoc
new file mode 100644
index 0000000..1ad8823
--- /dev/null
+++ b/doc/src/gallery-windowsvista.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-windowsvista.html
+
+ \title Windows Vista Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "windowsvista" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsvista-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsvista-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery-windowsxp.qdoc b/doc/src/gallery-windowsxp.qdoc
new file mode 100644
index 0000000..dcb8e82
--- /dev/null
+++ b/doc/src/gallery-windowsxp.qdoc
@@ -0,0 +1,392 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page gallery-windowsxp.html
+
+ \title Windows XP Style Widget Gallery
+ \ingroup gallery
+
+ This page shows some of the widgets available in Qt
+ when configured to use the "windowsxp" style.
+
+\raw HTML
+<h2 align="center">Buttons</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-pushbutton.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-toolbutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QPushButton widget provides a command button.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolButton class provides a quick-access button to commands
+ or options, usually used inside a QToolBar.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-checkbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-radiobutton.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QCheckBox widget provides a checkbox with a text label.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QRadioButton widget provides a radio button with a text or pixmap label.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Containers</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-groupbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-tabwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QGroupBox widget provides a group box frame with a title.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTabWidget class provides a stack of tabbed widgets.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-frame.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-toolbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFrame widget provides a simple decorated container for other widgets.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QToolBox class provides a column of tabbed widget items.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Item Views</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-listview.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-treeview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-tableview.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Display Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-progressbar.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-lcdnumber.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QProgressBar widget provides a horizontal progress bar.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLCDNumber widget displays a number with LCD-like digits.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-label.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QLabel widget provides a text or image display.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+\raw HTML
+<h2 align="center">Input Widgets</h2>
+
+<table align="center" cellspacing="20%" width="100%">
+<colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+</colgroup>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-slider.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-lineedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSlider widget provides a vertical or horizontal slider.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QLineEdit widget is a one-line text editor.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-combobox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-doublespinbox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QComboBox widget is a combined button and pop-up list.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-spinbox.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-timeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QSpinBox class provides a spin box widget.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QTimeEdit class provides a widget for editing times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-dateedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-datetimeedit.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDateEdit class provides a widget for editing dates.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QDateTimeEdit class provides a widget for editing dates and times.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-textedit.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-horizontalscrollbar.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QTextEdit class provides a widget that is used to edit and
+ display both plain and rich text.\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-dial.png
+\raw HTML
+</td>
+<td align="center">
+\endraw
+\inlineimage windowsxp-calendarwidget.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QDial class provides a rounded range control (like a
+ speedometer or potentiometer).\raw HTML
+</td>
+<td halign="justify" valign="top">
+\endraw
+The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.\raw HTML
+</td>
+</tr>
+<tr>
+<td align="center">
+\endraw
+\inlineimage windowsxp-fontcombobox.png
+\raw HTML
+</td>
+</tr><tr>
+<td halign="justify" valign="top">
+\endraw
+The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.\raw HTML
+</td>
+</tr>
+</table>
+\endraw
+*/
diff --git a/doc/src/gallery.qdoc b/doc/src/gallery.qdoc
new file mode 100644
index 0000000..dc9f732
--- /dev/null
+++ b/doc/src/gallery.qdoc
@@ -0,0 +1,151 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group gallery
+ \title Qt Widget Gallery
+ \ingroup topics
+ \brief Qt widgets shown in different styles on various platforms.
+
+ Qt's support for widget styles and themes enables your application to fit in
+ with the native desktop enviroment. Below, you can find links to the various
+ widget styles that are supplied with Qt 4.
+
+ \raw HTML
+ <table align="center" cellspacing="20%" width="100%">
+ <colgroup span="2">
+ <col width="40%" />
+ <col width="40%" />
+ </colgroup>
+ <tr>
+ <td align="center">
+ \endraw
+ \image plastique-tabwidget.png Plastique Style Widget Gallery
+
+ \bold{\l{Plastique Style Widget Gallery}}
+
+ The Plastique style is provided by QPlastiqueStyle.
+ \raw HTML
+ </td>
+ <td align="center">
+ \endraw
+ \image windowsxp-tabwidget.png Windows XP Style Widget Gallery
+
+ \bold{\l{Windows XP Style Widget Gallery}}
+
+ The Windows XP style is provided by QWindowsXPStyle.
+ \raw HTML
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ \endraw
+ \image gtk-tabwidget.png GTK Style Widget Gallery
+
+ \bold{\l{GTK Style Widget Gallery}}
+
+ The GTK style is provided by QGtkStyle.
+ \raw HTML
+ </td>
+ <td align="center">
+ \endraw
+ \image macintosh-tabwidget.png Macintosh Style Widget Gallery
+
+ \bold{\l{Macintosh Style Widget Gallery}}
+
+ The Macintosh style is provided by QMacStyle.
+ \raw HTML
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ \endraw
+ \image cleanlooks-tabwidget.png Cleanlooks Style Widget Gallery
+
+ \bold{\l{Cleanlooks Style Widget Gallery}}
+
+ The Cleanlooks style is provided by QCleanlooksStyle.
+ \raw HTML
+ </td>
+ <td align="center">
+ \endraw
+ \image windowsvista-tabwidget.png Windows Vista Style Widget Gallery
+
+ \bold{\l{Windows Vista Style Widget Gallery}}
+
+ The Windows Vista style is provided by QWindowsVistaStyle.
+ \raw HTML
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ \endraw
+ \image motif-tabwidget.png Motif Style Widget Gallery
+
+ \bold{\l{Motif Style Widget Gallery}}
+
+ The Motif style is provided by QMotifStyle.
+ \raw HTML
+ </td>
+ <td align="center">
+ \endraw
+ \image windows-tabwidget.png Windows Style Widget Gallery
+
+ \bold{\l{Windows Style Widget Gallery}}
+
+ The Windows style is provided by QWindowsStyle.
+ \raw HTML
+ </td>
+ </tr>
+ <tr>
+ <td align="center">
+ \endraw
+ \image cde-tabwidget.png CDE Style Widget Gallery
+
+ \bold{\l{CDE Style Widget Gallery}}
+
+ The Common Desktop Environment style is provided by QCDEStyle.
+ \raw HTML
+ </td>
+ </tr>
+ </table>
+ \endraw
+*/
diff --git a/doc/src/geometry.qdoc b/doc/src/geometry.qdoc
new file mode 100644
index 0000000..b17aa39
--- /dev/null
+++ b/doc/src/geometry.qdoc
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page geometry.html
+ \title Window Geometry
+ \ingroup architecture
+ \brief An overview of window geometry handling and management.
+
+ QWidget provides several functions that deal with a widget's
+ geometry. Some of these functions operate on the pure client area
+ (i.e. the window excluding the window frame), others include the
+ window frame. The differentiation is done in a way that covers the
+ most common usage transparently.
+
+ \list
+ \o \bold{Including the window frame:}
+ \l{QWidget::x()}{x()},
+ \l{QWidget::y()}{y()},
+ \l{QWidget::frameGeometry()}{frameGeometry()},
+ \l{QWidget::pos()}{pos()}, and
+ \l{QWidget::move()}{move()}.
+ \o \bold{Excluding the window frame:}
+ \l{QWidget::geometry()}{geometry()},
+ \l{QWidget::width()}{width()},
+ \l{QWidget::height()}{height()},
+ \l{QWidget::rect()}{rect()}, and
+ \l{QWidget::size()}{size()}.
+ \endlist
+
+ Note that the distinction only matters for decorated top-level
+ widgets. For all child widgets, the frame geometry is equal to the
+ widget's client geometry.
+
+ This diagram shows most of the functions in use:
+ \img geometry.png Geometry diagram
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 X11 Peculiarities
+
+ On X11, a window does not have a frame until the window manager
+ decorates it. This happens asynchronously at some point in time
+ after calling QWidget::show() and the first paint event the
+ window receives, or it does not happen at all. Bear in mind that
+ X11 is policy-free (others call it flexible). Thus you cannot
+ make any safe assumption about the decoration frame your window
+ will get. Basic rule: There's always one user who uses a window
+ manager that breaks your assumption, and who will complain to
+ you.
+
+ Furthermore, a toolkit cannot simply place windows on the screen. All
+ Qt can do is to send certain hints to the window manager. The window
+ manager, a separate process, may either obey, ignore or misunderstand
+ them. Due to the partially unclear Inter-Client Communication
+ Conventions Manual (ICCCM), window placement is handled quite
+ differently in existing window managers.
+
+ X11 provides no standard or easy way to get the frame geometry
+ once the window is decorated. Qt solves this problem with nifty
+ heuristics and clever code that works on a wide range of window
+ managers that exist today. Don't be surprised if you find one
+ where QWidget::frameGeometry() returns wrong results though.
+
+ Nor does X11 provide a way to maximize a window.
+ QWidget::showMaximized() has to emulate the feature. Its result
+ depends on the result of QWidget::frameGeometry() and the
+ capability of the window manager to do proper window placement,
+ neither of which can be guaranteed.
+
+ \section1 Restoring a Window's Geometry
+
+ Since version 4.2, Qt provides functions that saves and restores a
+ window's geometry and state for you. QWidget::saveGeometry()
+ saves the window geometry and maximized/fullscreen state, while
+ QWidget::restoreGeometry() restores it. The restore function also
+ checks if the restored geometry is outside the available screen
+ geometry, and modifies it as appropriate if it is.
+
+ The rest of this document describes how to save and restore the
+ geometry using the geometry properties. On Windows, this is
+ basically storing the result of QWidget::geometry() and calling
+ QWidget::setGeometry() in the next session before calling
+ \l{QWidget::show()}{show()}. On X11, this won't work because an
+ invisible window doesn't have a frame yet. The window manager
+ will decorate the window later. When this happens, the window
+ shifts towards the bottom/right corner of the screen depending on
+ the size of the decoration frame. Although X provides a way to
+ avoid this shift, most window managers fail to implement this
+ feature.
+
+ A workaround is to call \l{QWidget::setGeometry()}{setGeometry()}
+ after \l{QWidget::show()}{show()}. This has the two disadvantages
+ that the widget appears at a wrong place for a millisecond
+ (results in flashing) and that currently only every second window
+ manager gets it right. A safer solution is to store both
+ \l{QWidget::pos()}{pos()} and \l{QWidget::size()}{size()} and to
+ restore the geometry using \l{QWidget::resize()} and
+ \l{QWidget::move()}{move()} before calling
+ \l{QWidget::show()}{show()}, as demonstrated in the following
+ code snippets (from the \l{mainwindows/application}{Application}
+ example):
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 35
+ \codeline
+ \snippet examples/mainwindows/application/mainwindow.cpp 38
+
+ This method works on Windows, Mac OS X, and most X11 window
+ managers.
+*/
diff --git a/doc/src/gpl.qdoc b/doc/src/gpl.qdoc
new file mode 100644
index 0000000..e423171
--- /dev/null
+++ b/doc/src/gpl.qdoc
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*! \page gpl.html
+\title GNU General Public License (GPL)
+\ingroup licensing
+\brief About the GPL license used for Qt.
+
+The Qt GUI Toolkit is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).\br
+Contact: Qt Software Information (qt-info@nokia.com)
+
+Qt is available under the GPL.
+
+\section1 The GNU General Public License (Version 3)
+
+Reference: \l{GNU General Public License}
+
+\snippet doc/src/snippets/code/doc_src_gpl.qdoc GPL v3
+*/
+
+/*! \page lgpl.html
+\title GNU Lesser General Public License (LGPL)
+\ingroup licensing
+\brief About the LGPL license used for Qt.
+
+The Qt GUI Toolkit is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).\br
+Contact: Qt Software Information (qt-info@nokia.com)
+
+Qt is available under the LGPL.
+
+\section1 The GNU Lesser General Public License (Version 2.1)
+
+Reference: \l{GNU Lesser General Public License, version 2.1}
+
+\snippet doc/src/snippets/code/doc_src_lgpl.qdoc LGPL v2.1
+
+\section1 Nokia Qt LGPL Exception version 1.0
+
+As a special exception to the GNU Lesser General Public License version 2.1,
+the object code form of a "work that uses the Library" may incorporate material
+from a header file that is part of the Library. You may distribute such object
+code under terms of your choice, provided that the incorporated material
+(i) does not exceed more than 5% of the total size of the Library; and
+(ii) is limited to numerical parameters, data structure layouts, accessors,
+macros, inline functions and templates.
+*/
diff --git a/doc/src/graphicsview.qdoc b/doc/src/graphicsview.qdoc
new file mode 100644
index 0000000..049b0c3
--- /dev/null
+++ b/doc/src/graphicsview.qdoc
@@ -0,0 +1,544 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page graphicsview.html
+ \title The Graphics View Framework
+ \ingroup architecture
+ \ingroup multimedia
+ \brief An overview of the Graphics View framework for interactive 2D
+ graphics.
+
+ \keyword Graphics View
+ \keyword GraphicsView
+ \keyword Graphics
+ \keyword Canvas
+ \since 4.2
+
+ Graphics View provides a surface for managing and interacting with a large
+ number of custom-made 2D graphical items, and a view widget for
+ visualizing the items, with support for zooming and rotation.
+
+ The framework includes an event propagation architecture that allows
+ precise double-precision interaction capabilities for the items on the
+ scene. Items can handle key events, mouse press, move, release and
+ double click events, and they can also track mouse movement.
+
+ Graphics View uses a BSP (Binary Space Partitioning) tree to provide very
+ fast item discovery, and as a result of this, it can visualize large
+ scenes in real-time, even with millions of items.
+
+ Graphics View was introduced in Qt 4.2, replacing its predecessor,
+ QCanvas. If you are porting from QCanvas, see \l{Porting to Graphics
+ View}.
+
+ Topics:
+
+ \tableofcontents
+
+ \section1 The Graphics View Architecture
+
+ Graphics View provides an item-based approach to model-view programming,
+ much like InterView's convenience classes QTableView, QTreeView and
+ QListView. Several views can observe a single scene, and the scene
+ contains items of varying geometric shapes.
+
+ \section2 The Scene
+
+ QGraphicsScene provides the Graphics View scene. The scene has the
+ following responsibilities:
+
+ \list
+ \o Providing a fast interface for managing a large number of items
+ \o Propagating events to each item
+ \o Managing item state, such as selection and focus handling
+ \o Providing untransformed rendering functionality; mainly for printing
+ \endlist
+
+ The scene serves as a container for QGraphicsItem objects. Items are
+ added to the scene by calling QGraphicsScene::addItem(), and then
+ retrieved by calling one of the many item discovery functions.
+ QGraphicsScene::items() and its overloads return all items contained
+ by or intersecting with a point, a rectangle, a polygon or a general
+ vector path. QGraphicsScene::itemAt() returns the topmost item at a
+ particular point. All item discovery functions return the items in
+ descending stacking order (i.e., the first returned item is topmost,
+ and the last item is bottom-most).
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 0
+
+ QGraphicsScene's event propagation architecture schedules scene events
+ for delivery to items, and also manages propagation between items. If
+ the scene receives a mouse press event at a certain position, the
+ scene passes the event on to whichever item is at that position.
+
+ QGraphicsScene also manages certain item states, such as item
+ selection and focus. You can select items on the scene by calling
+ QGraphicsScene::setSelectionArea(), passing an arbitrary shape. This
+ functionality is also used as a basis for rubberband selection in
+ QGraphicsView. To get the list of all currently selected items, call
+ QGraphicsScene::selectedItems(). Another state handled by
+ QGraphicsScene is whether or not an item has keyboard input focus. You
+ can set focus on an item by calling QGraphicsScene::setFocusItem() or
+ QGraphicsItem::setFocus(), or get the current focus item by calling
+ QGraphicsScene::focusItem().
+
+ Finally, QGraphicsScene allows you to render parts of the scene into a
+ paint device through the QGraphicsScene::render() function. You can
+ read more about this in the Printing section later in this document.
+
+ \section2 The View
+
+ QGraphicsView provides the view widget, which visualizes the contents
+ of a scene. You can attach several views to the same scene, to provide
+ several viewports into the same data set. The view widget is a scroll
+ area, and provides scroll bars for navigating through large scenes. To
+ enable OpenGL support, you can set a QGLWidget as the viewport by
+ calling QGraphicsView::setViewport().
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 1
+
+ The view receives input events from the keyboard and mouse, and
+ translates these to scene events (converting the coordinates used
+ to scene coordinates where appropriate), before sending the events
+ to the visualized scene.
+
+ Using its transformation matrix, QGraphicsView::matrix(), the view can
+ \e transform the scene's coordinate system. This allows advanced
+ navigation features such as zooming and rotation. For convenience,
+ QGraphicsView also provides functions for translating between view and
+ scene coordinates: QGraphicsView::mapToScene() and
+ QGraphicsView::mapFromScene().
+
+ \img graphicsview-view.png
+
+ \section2 The Item
+
+ QGraphicsItem is the base class for graphical items in a
+ scene. Graphics View provides several standard items for typical
+ shapes, such as rectangles (QGraphicsRectItem), ellipses
+ (QGraphicsEllipseItem) and text items (QGraphicsTextItem), but the
+ most powerful QGraphicsItem features are available when you write a
+ custom item. Among other things, QGraphicsItem supports the following
+ features:
+
+ \list
+ \o Mouse press, move, release and double click events, as well as mouse
+ hover events, wheel events, and context menu events.
+ \o Keyboard input focus, and key events
+ \o Drag and drop
+ \o Grouping, both through parent-child relationships, and with
+ QGraphicsItemGroup
+ \o Collision detection
+ \endlist
+
+ Items live in a local coordinate system, and like QGraphicsView, it
+ also provides many functions for mapping coordinates between the item
+ and the scene, and from item to item. Also, like QGraphicsView, it can
+ transform its coordinate system using a matrix:
+ QGraphicsItem::matrix(). This is useful for rotating and scaling
+ individual items.
+
+ Items can contain other items (children). Parent items'
+ transformations are inherited by all its children. Regardless of an
+ item's accumulated transformation, though, all its functions (e.g.,
+ QGraphicsItem::contains(), QGraphicsItem::boundingRect(),
+ QGraphicsItem::collidesWith()) still operate in local coordinates.
+
+ QGraphicsItem supports collision detection through the
+ QGraphicsItem::shape() function, and QGraphicsItem::collidesWith(),
+ which are both virtual functions. By returning your item's shape as a
+ local coordinate QPainterPath from QGraphicsItem::shape(),
+ QGraphicsItem will handle all collision detection for you. If you want
+ to provide your own collision detection, however, you can reimplement
+ QGraphicsItem::collidesWith().
+
+ \img graphicsview-items.png
+
+ \section1 The Graphics View Coordinate System
+
+ Graphics View is based on the Cartesian coordinate system; items'
+ position and geometry on the scene are represented by sets of two
+ numbers: the x-coordinate, and the y-coordinate. When observing a scene
+ using an untransformed view, one unit on the scene is represented by
+ one pixel on the screen.
+
+ There are three effective coordinate systems in play in Graphics View:
+ Item coordinates, scene coordinates, and view coordinates. To simplify
+ your implementation, Graphics View provides convenience functions that
+ allow you to map between the three coordinate systems.
+
+ When rendering, Graphics View's scene coordinates correspond to
+ QPainter's \e logical coordinates, and view coordinates are the same as
+ \e device coordinates. In \l{The Coordinate System}, you can read about
+ the relationship between logical coordinates and device coordinates.
+
+ \img graphicsview-parentchild.png
+
+ \section2 Item Coordinates
+
+ Items live in their own local coordinate system. Their coordinates
+ are usually centered around its center point (0, 0), and this is
+ also the center for all transformations. Geometric primitives in the
+ item coordinate system are often referred to as item points, item
+ lines, or item rectangles.
+
+ When creating a custom item, item coordinates are all you need to
+ worry about; QGraphicsScene and QGraphicsView will perform all
+ transformations for you. This makes it very easy to implement custom
+ items. For example, if you receive a mouse press or a drag enter
+ event, the event position is given in item coordinates. The
+ QGraphicsItem::contains() virtual function, which returns true if a
+ certain point is inside your item, and false otherwise, takes a
+ point argument in item coordinates. Similarly, an item's bounding
+ rect and shape are in item coordinates.
+
+ At item's \e position is the coordinate of the item's center point
+ in its parent's coordinate system; sometimes referred to as \e
+ parent coordinates. The scene is in this sense regarded as all
+ parent-less items' "parent". Top level items' position are in scene
+ coordinates.
+
+ Child coordinates are relative to the parent's coordinates. If the
+ child is untransformed, the difference between a child coordinate
+ and a parent coordinate is the same as the distance between the
+ items in parent coordinates. For example: If an untransformed child
+ item is positioned precisely in its parent's center point, then the
+ two items' coordinate systems will be identical. If the child's
+ position is (10, 0), however, the child's (0, 10) point will
+ correspond to its parent's (10, 10) point.
+
+ Because items' position and transformation are relative to the
+ parent, child items' coordinates are unaffected by the parent's
+ transformation, although the parent's transformation implicitly
+ transforms the child. In the above example, even if the parent is
+ rotated and scaled, the child's (0, 10) point will still correspond
+ to the parent's (10, 10) point. Relative to the scene, however, the
+ child will follow the parent's transformation and position. If the
+ parent is scaled (2x, 2x), the child's position will be at scene
+ coordinate (20, 0), and its (10, 0) point will correspond to the
+ point (40, 0) on the scene.
+
+ With QGraphicsItem::pos() being one of the few exceptions,
+ QGraphicsItem's functions operate in item coordinates, regardless of
+ the item, or any of its parents' transformation. For example, an
+ item's bounding rect (i.e. QGraphicsItem::boundingRect()) is always
+ given in item coordinates.
+
+ \section2 Scene Coordinates
+
+ The scene represents the base coordinate system for all its items.
+ The scene coordinate system describes the position of each top-level
+ item, and also forms the basis for all scene events delivered to the
+ scene from the view. Each item on the scene has a scene position
+ and bounding rectangle (QGraphicsItem::scenePos(),
+ QGraphicsItem::sceneBoundingRect()), in addition to its local item
+ pos and bounding rectangle. The scene position describes the item's
+ position in scene coordinates, and its scene bounding rect forms the
+ basis for how QGraphicsScene determines what areas of the scene have
+ changed. Changes in the scene are communicated through the
+ QGraphicsScene::changed() signal, and the argument is a list of
+ scene rectangles.
+
+ \section2 View Coordinates
+
+ View coordinates are the coordinates of the widget. Each unit in
+ view coordinates corresponds to one pixel. What's special about this
+ coordinate system is that it is relative to the widget, or viewport,
+ and unaffected by the observed scene. The top left corner of
+ QGraphicsView's viewport is always (0, 0), and the bottom right
+ corner is always (viewport width, viewport height). All mouse events
+ and drag and drop events are originally received as view
+ coordinates, and you need to map these coordinates to the scene in
+ order to interact with items.
+
+ \section2 Coordinate Mapping
+
+ Often when dealing with items in a scene, it can be useful to map
+ coordinates and arbitrary shapes from the scene to an item, from
+ item to item, or from the view to the scene. For example, when you
+ click your mouse in QGraphicsView's viewport, you can ask the scene
+ what item is under the cursor by calling
+ QGraphicsView::mapToScene(), followed by
+ QGraphicsScene::itemAt(). If you want to know where in the viewport
+ an item is located, you can call QGraphicsItem::mapToScene() on the
+ item, then QGraphicsView::mapFromScene() on the view. Finally, if
+ you use want to find what items are inside a view ellipse, you can
+ pass a QPainterPath to mapToScene(), and then pass the mapped path
+ to QGraphicsScene::items().
+
+ You can map coordinates and shapes to and from and item's scene by
+ calling QGraphicsItem::mapToScene() and
+ QGraphicsItem::mapFromScene(). You can also map to an item's parent
+ item by calling QGraphicsItem::mapToParent() and
+ QGraphicsItem::mapFromParent(), or between items by calling
+ QGraphicsItem::mapToItem() and QGraphicsItem::mapFromItem(). All
+ mapping functions can map both points, rectangles, polygons and
+ paths.
+
+ The same mapping functions are available in the view, for mapping to
+ and from the scene. QGraphicsView::mapFromScene() and
+ QGraphicsView::mapToScene(). To map from a view to an item, you
+ first map to the scene, and then map from the scene to the item.
+
+ \section1 Key Features
+
+ \section2 Zooming and rotating
+
+ QGraphicsView supports the same affine transformations as QPainter
+ does through QGraphicsView::setMatrix(). By applying a transformation
+ to the view, you can easily add support for common navigation features
+ such as zooming and rotating.
+
+ Here is an example of how to implement zoom and rotate slots in a
+ subclass of QGraphicsView:
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 2
+
+ The slots could be connected to \l{QToolButton}{QToolButtons} with
+ \l{QAbstractButton::autoRepeat}{autoRepeat} enabled.
+
+ QGraphicsView keeps the center of the view aligned when you transform
+ the view.
+
+ See also the \l{Elastic Nodes Example}{Elastic Nodes} example for
+ code that shows how to implement basic zooming features.
+
+ \section2 Printing
+
+ Graphics View provides single-line printing through its rendering
+ functions, QGraphicsScene::render() and QGraphicsView::render(). The
+ functions provide the same API: You can have the scene or the view
+ render all or parts of their contents into any paint device by passing
+ a QPainter to either of the rendering functions. This example shows
+ how to print the whole scene into a full page, using QPrinter.
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 3
+
+ The difference between the scene and view rendering functions is that
+ one operates in scene coordinates, and the other in view coordinates.
+ QGraphicsScene::render() is often preferred for printing whole
+ segments of a scene untransformed, such as for plotting geometrical
+ data, or for printing a text document. QGraphicsView::render(), on the
+ other hand, is suitable for taking screenshots; its default behavior
+ is to render the exact contents of the viewport using the provided
+ painter.
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 4
+
+ When the source and target areas' sizes do not match, the source
+ contents are stretched to fit into the target area. By passing a
+ Qt::AspectRatioMode to the rendering function you are using, you can
+ choose to maintain or ignore the aspect ratio of the scene when the
+ contents are stretched.
+
+ \section2 Drag and Drop
+
+ Because QGraphicsView inherits QWidget indirectly, it already provides
+ the same drag and drop functionality that QWidget provides. In
+ addition, as a convenience, the Graphics View framework provides drag
+ and drop support for the scene, and for each and every item. As the
+ view receives a drag, it translates the drag and drop events into a
+ QGraphicsSceneDragDropEvent, which is then forwarded to the scene. The
+ scene takes over scheduling of this event, and sends it to the first
+ item under the mouse cursor that accepts drops.
+
+ To start a drag from an item, create a QDrag object, passing a pointer
+ to the widget that starts the drag. Items can be observed by many
+ views at the same time, but only one view can start the drag. Drags
+ are in most cases started as a result of pressing or moving the mouse,
+ so in mousePressEvent() or mouseMoveEvent(), you can get the
+ originating widget pointer from the event. For example:
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 5
+
+ To intercept drag and drop events for the scene, you reimplement
+ QGraphicsScene::dragEnterEvent() and whichever event handlers your
+ particular scene needs, in a QGraphicsItem subclass. You can read more
+ about drag and drop in Graphics View in the documentation for each of
+ QGraphicsScene's event handlers.
+
+ Items can enable drag and drop support by calling
+ QGraphicsItem::setAcceptDrops(). To handle the incoming drag,
+ reimplement QGraphicsItem::dragEnterEvent(),
+ QGraphicsItem::dragMoveEvent(), QGraphicsItem::dragLeaveEvent(), and
+ QGraphicsItem::dropEvent().
+
+ See also the \l{Drag and Drop Robot Example}{Drag and Drop Robot} example
+ for a demonstration of Graphics View's support for drag and drop
+ operations.
+
+ \section2 Cursors and Tooltips
+
+ Like QWidget, QGraphicsItem also supports cursors
+ (QGraphicsItem::setCursor()), and tooltips
+ (QGraphicsItem::setToolTip()). The cursors and tooltips are activated
+ by QGraphicsView as the mouse cursor enters the item's area (detected
+ by calling QGraphicsItem::contains()).
+
+ You can also set a default cursor directly on the view by calling
+ QGraphicsView::setCursor().
+
+ See also the \l{Drag and Drop Robot Example}{Drag and Drop Robot}
+ example for code that implements tooltips and cursor shape handling.
+
+ \section2 Animation
+
+ Graphics View supports animation at several levels. You can easily
+ assemble animation paths by associating a QGraphicsItemAnimation with
+ your item. This allows timeline controlled animations that operate at
+ a steady speed on all platforms (although the frame rate may vary
+ depending on the platform's performance). QGraphicsItemAnimation
+ allows you to create a path for an item's position, rotation, scale,
+ shear and translation. The animation can be controlled by a QSlider,
+ or more commonly by QTimeLine.
+
+ Another option is to create a custom item that inherits from QObject
+ and QGraphicsItem. The item can the set up its own timers, and control
+ animations with incremental steps in QObject::timerEvent().
+
+ A third option, which is mostly available for compatibility with
+ QCanvas in Qt 3, is to \e advance the scene by calling
+ QGraphicsScene::advance(), which in turn calls
+ QGraphicsItem::advance().
+
+ See also the \l{Drag and Drop Robot Example}{Drag and Drop Robot}
+ example for an illustration of timeline-based animation techniques.
+
+ \section2 OpenGL Rendering
+
+ To enable OpenGL rendering, you simply set a new QGLWidget as the
+ viewport of QGraphicsView by calling QGraphicsView::setViewport(). If
+ you want OpenGL with antialiasing, you need OpenGL sample buffer
+ support (see QGLFormat::sampleBuffers()).
+
+ Example:
+
+ \snippet doc/src/snippets/code/doc_src_graphicsview.qdoc 6
+
+ \section2 Item Groups
+
+ By making an item a child of another, you can achieve the most
+ essential feature of item grouping: the items will move together, and
+ all transformations are propagated from parent to child. QGraphicsItem
+ can also handle all events for its children (see
+ QGraphicsItem::setHandlesChildEvents()). This allows the parent item
+ to act on behalf of its children, effectively treating all items as
+ one.
+
+ In addition, QGraphicsItemGroup is a special item that combines child
+ event handling with a useful interface for adding and removing items
+ to and from a group. Adding an item to a QGraphicsItemGroup will keep
+ the item's original position and transformation, whereas reparenting
+ items in general will cause the child to reposition itself relative to
+ its new parent. For convenience, you can create
+ \l{QGraphicsItemGroup}s through the scene by calling
+ QGraphicsScene::createItemGroup().
+
+ \section2 Widgets and Layouts
+
+ Qt 4.4 introduced support for geometry and layout-aware items through
+ QGraphicsWidget. This special base item is similar to QWidget, but
+ unlike QWidget, it doesn't inherit from QPaintDevice; rather from
+ QGraphicsItem instead. This allows you to write complete widgets with
+ events, signals & slots, size hints and policies, and you can also
+ manage your widgets geometries in layouts through
+ QGraphicsLinearLayout and QGraphicsGridLayout.
+
+ \section3 QGraphicsWidget
+
+ Building on top of QGraphicsItem's capabilities and lean footprint,
+ QGraphicsWidget provides the best of both worlds: extra
+ functionality from QWidget, such as the style, font, palette, layout
+ direction, and its geometry, and resolution independence and
+ transformation support from QGraphicsItem. Because Graphics View
+ uses real coordinates instead of integers, QGraphicsWidget's
+ geometry functions also operate on QRectF and QPointF. This also
+ applies to frame rects, margins and spacing. With QGraphicsWidget
+ it's not uncommon to specify contents margins of (0.5, 0.5, 0.5,
+ 0.5), for example. You can create both subwidgets and "top-level"
+ windows; in some cases you can now use Graphics View for advanced
+ MDI applications.
+
+ Some of QWidget's properties are supported, including window flags
+ and attributes, but not all. You should refer to QGraphicsWidget's
+ class documentation for a complete overview of what is and what is
+ not supported. For example, you can create decorated windows by
+ passing the Qt::Window window flag to QGraphicsWidget's constructor,
+ but Graphics View currently doesn't support the Qt::Sheet and
+ Qt::Drawer flags that are common on Mac OS X.
+
+ The capabilities of QGraphicsWidget are expected to grow depending
+ on community feedback.
+
+ \section3 QGraphicsLayout
+
+ QGraphicsLayout is part of a second-generation layout framework
+ designed specifically for QGraphicsWidget. Its API is very similar
+ to that of QLayout. You can manage widgets and sublayouts inside
+ either QGraphicsLinearLayout and QGraphicsGridLayout. You can also
+ easily write your own layout by subclassing QGraphicsLayout
+ yourself, or add your own QGraphicsItem items to the layout by
+ writing an adaptor subclass of QGraphicsLayoutItem.
+
+ \section2 Embedded Widget Support
+
+ Graphics View provides seamless support for embedding any widget
+ into the scene. You can embed simple widgets, such as QLineEdit or
+ QPushButton, complex widgets such as QTabWidget, and even complete
+ main windows. To embed your widget to the scene, simply call
+ QGraphicsScene::addWidget(), or create an instance of
+ QGraphicsProxyWidget to embed your widget manually.
+
+ Through QGraphicsProxyWidget, Graphics View is able to deeply
+ integrate the client widget features including its cursors,
+ tooltips, mouse, tablet and keyboard events, child widgets,
+ animations, pop-ups (e.g., QComboBox or QCompleter), and the widget's
+ input focus and activation. QGraphicsProxyWidget even integrates the
+ embedded widget's tab order so that you can tab in and out of
+ embedded widgets. You can even embed a new QGraphicsView into your
+ scene to provide complex nested scenes.
+
+ When transforming an embedded widget, Graphics View makes sure that
+ the widget is transformed resolution independently, allowing the
+ fonts and style to stay crisp when zoomed in. (Note that the effect
+ of resolution independence depends on the style.)
+*/
diff --git a/doc/src/groups.qdoc b/doc/src/groups.qdoc
new file mode 100644
index 0000000..c9cedc4
--- /dev/null
+++ b/doc/src/groups.qdoc
@@ -0,0 +1,599 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group groups
+ \title Grouped Classes
+ \ingroup classlists
+
+ This page provides a way of navigating Qt's classes by grouping
+ related classes together. Some classes may appear in more than one group.
+
+ \generatelist{related}
+
+ \omit
+ \row
+ \o \l{Component Model}
+ \o Interfaces and helper classes for the Qt Component Model.
+ \endomit
+
+*/
+
+/*!
+ \group advanced
+ \title Advanced Widgets
+ \ingroup groups
+
+ \brief Advanced GUI widgets such as tab widgets and progress bars.
+
+ These classes provide more complex user interface widgets (controls).
+
+*/
+
+/*!
+ \group abstractwidgets
+ \title Abstract Widget Classes
+ \ingroup groups
+
+ \brief Abstract widget classes usable through subclassing.
+
+ These classes are abstract widgets; they are generally not usable in
+ themselves, but provide functionality that can be used by inheriting
+ these classes.
+
+*/
+
+/*!
+ \group accessibility
+ \title Accessibility Classes
+ \ingroup groups
+ \ingroup topics
+
+ \brief Classes that provide support for accessibility.
+
+ Accessible applications are able to be used by users who cannot use
+ conventional means of interaction. These classes provide support for
+ accessible applications.
+
+*/
+
+/*!
+ \group appearance
+ \title Widget Appearance and Style
+ \ingroup groups
+
+ \brief Appearance customization with styles, fonts, colors etc.
+
+ These classes are used to customize an application's appearance and
+ style.
+
+*/
+
+/*!
+ \group application
+ \title Main Window and Related Classes
+ \ingroup groups
+
+ \brief Everything you need for a typical modern main application window,
+ including menus, toolbars, workspace, etc.
+
+ These classes provide everything you need for a typical modern main
+ application window, like the main window itself, menu and tool bars,
+ a status bar, etc.
+
+*/
+
+
+/*!
+ \group basicwidgets
+ \title Basic Widgets
+ \ingroup groups
+
+ \brief Basic GUI widgets such as buttons, comboboxes and scroll bars.
+
+ These basic widgets (controls) are designed for direct use.
+ There are also some \l{Abstract Widget Classes} that are designed for
+ subclassing, and some more complex \l{Advanced Widgets}.
+
+*/
+
+/* \group componentmodel
+ \title Component Model
+
+ These classes and interfaces form the basis of the \l{Qt Component Model}.
+
+*/
+
+/*!
+ \group database
+ \title Database Classes
+ \ingroup groups
+
+ \brief Database related classes, e.g. for SQL databases.
+
+ These classes provide access to SQL databases.
+*/
+
+
+/*!
+ \group dialogs
+ \title Standard Dialog Classes
+ \ingroup groups
+
+ \brief Ready-made dialogs for file, font, color selection and more.
+
+ These classes are complex widgets, composed of simpler widgets; dialog
+ boxes, generally.
+*/
+
+/*!
+ \group desktop
+ \title Desktop Environment Classes
+ \ingroup groups
+
+ \brief Classes for interacting with the user's desktop environment.
+
+ These classes provide ways to interact with the user's desktop environment and
+ take advantage of common services.
+*/
+
+/*!
+ \group draganddrop
+ \title Drag And Drop Classes
+ \ingroup groups
+
+ \brief Classes dealing with drag and drop and mime type encoding and decoding.
+
+ These classes deal with drag and drop and the necessary mime type
+ encoding and decoding. See also \link dnd.html Drag and Drop with
+ Qt. \endlink
+*/
+
+/*!
+ \group environment
+ \title Environment Classes
+ \ingroup groups
+
+ \brief Classes providing various global services such as event handling,
+ access to system settings and internationalization.
+
+ These classes providing various global services to your application such as
+ event handling, access to system settings, internationalization, etc.
+
+*/
+
+/*!
+ \group events
+ \title Event Classes
+ \ingroup groups
+
+ \brief Classes used to create and handle events.
+
+ These classes are used to create and handle events.
+
+ For more information see the \link object.html Object model\endlink
+ and \link signalsandslots.html Signals and Slots\endlink.
+*/
+
+/*!
+ \group explicitly-shared
+ \ingroup groups
+
+ \title Explicitly Shared Classes
+ \brief Classes that use explicit sharing to manage internal data.
+
+ \keyword explicit sharing
+ \keyword explicitly shared
+
+ Unlike many of Qt's data types, which use \l{implicit sharing}, these
+ classes use explicit sharing to manage internal data.
+*/
+
+/*!
+ \group geomanagement
+ \title Layout Management
+ \ingroup groups
+
+ \brief Classes handling automatic resizing and moving of widgets, for
+ composing complex dialogs.
+
+ These classes provide automatic geometry (layout) management of widgets.
+
+*/
+
+/*!
+ \group graphicsview-api
+ \title Graphics View Classes
+ \ingroup groups
+
+ \brief Classes in the Graphics View framework for interactive applications.
+
+ These classes are provided by \l{The Graphics View Framework} for interactive
+ applications and are part of a larger collection of classes related to
+ \l{Multimedia, Graphics and Printing}.
+
+ \note These classes are part of the \l{Open Source Versions of Qt} and
+ \l{Qt Commercial Editions}{Qt Full Framework Edition} for commercial users.
+*/
+
+/*!
+ \group helpsystem
+ \title Help System
+ \ingroup groups
+
+ \brief Classes used to provide online-help for applications.
+
+ \keyword help system
+
+ These classes provide for all forms of online-help in your application,
+ with three levels of detail:
+
+ \list 1
+ \o Tool Tips and Status Bar message - flyweight help, extremely brief,
+ entirely integrated in the user interface, requiring little
+ or no user interaction to invoke.
+ \o What's This? - lightweight, but can be
+ a three-paragraph explanation.
+ \o Online Help - can encompass any amount of information,
+ but is typically slower to call up, somewhat separated
+ from the user's work, and often users feel that using online
+ help is a digression from their real task.
+ \endlist
+
+*/
+
+
+/*!
+ \group io
+ \title Input/Output and Networking
+ \ingroup groups
+
+ \brief Classes providing file input and output along with directory and
+ network handling.
+
+ These classes are used to handle input and output to and from external
+ devices, processes, files etc. as well as manipulating files and directories.
+*/
+
+/*!
+ \group misc
+ \title Miscellaneous Classes
+ \ingroup groups
+
+ \brief Various other useful classes.
+
+ These classes are useful classes not fitting into any other category.
+
+*/
+
+
+/*!
+ \group model-view
+ \title Model/View Classes
+ \ingroup groups
+
+ \brief Classes that use the model/view design pattern.
+
+ These classes use the model/view design pattern in which the
+ underlying data (in the model) is kept separate from the way the data
+ is presented and manipulated by the user (in the view). See also
+ \link model-view-programming.html Model/View Programming\endlink.
+
+*/
+
+/*!
+ \group multimedia
+ \title Multimedia, Graphics and Printing
+ \ingroup groups
+
+ \brief Classes that provide support for graphics (2D, and with OpenGL, 3D),
+ image encoding, decoding, and manipulation, sound, animation,
+ printing, etc.
+
+ These classes provide support for graphics (2D, and with OpenGL, 3D),
+ image encoding, decoding, and manipulation, sound, animation, printing
+ etc.
+
+ See also this introduction to the \link coordsys.html Qt
+ coordinate system. \endlink
+
+*/
+
+/*!
+ \group objectmodel
+ \title Object Model
+ \ingroup groups
+
+ \brief The Qt GUI toolkit's underlying object model.
+
+ These classes form the basis of the \l{Qt Object Model}.
+
+*/
+
+/*!
+ \group organizers
+ \title Organizers
+ \ingroup groups
+
+ \brief User interface organizers such as splitters, tab bars, button groups, etc.
+
+ These classes are used to organize and group GUI primitives into more
+ complex applications or dialogs.
+
+*/
+
+
+/*!
+ \group plugins
+ \title Plugin Classes
+ \ingroup groups
+
+ \brief Plugin related classes.
+
+ These classes deal with shared libraries, (e.g. .so and DLL files),
+ and with Qt plugins.
+
+ See the \link plugins-howto.html plugins documentation\endlink.
+
+ See also the \l{ActiveQt framework} for Windows.
+
+*/
+
+/*!
+ \group qws
+ \title Qt for Embedded Linux Classes
+ \ingroup groups
+
+ \ingroup qt-embedded-linux
+ \brief Classes that are specific to Qt for Embedded Linux.
+
+ These classes are relevant to \l{Qt for Embedded Linux} users.
+*/
+
+/*!
+ \group shared
+ \title Implicitly Shared Classes
+ \ingroup architecture
+ \ingroup groups
+
+ \brief Classes that use reference counting for fast copying.
+
+ \keyword implicit data sharing
+ \keyword implicit sharing
+ \keyword implicitly shared
+ \keyword reference counting
+ \keyword shared implicitly
+ \keyword shared classes
+
+ Many C++ classes in Qt use implicit data sharing to maximize
+ resource usage and minimize copying. Implicitly shared classes are
+ both safe and efficient when passed as arguments, because only a
+ pointer to the data is passed around, and the data is copied only
+ if and when a function writes to it, i.e., \e {copy-on-write}.
+
+ \tableofcontents
+
+ \section1 Overview
+
+ A shared class consists of a pointer to a shared data block that
+ contains a reference count and the data.
+
+ When a shared object is created, it sets the reference count to 1. The
+ reference count is incremented whenever a new object references the
+ shared data, and decremented when the object dereferences the shared
+ data. The shared data is deleted when the reference count becomes
+ zero.
+
+ \keyword deep copy
+ \keyword shallow copy
+
+ When dealing with shared objects, there are two ways of copying an
+ object. We usually speak about \e deep and \e shallow copies. A deep
+ copy implies duplicating an object. A shallow copy is a reference
+ copy, i.e. just a pointer to a shared data block. Making a deep copy
+ can be expensive in terms of memory and CPU. Making a shallow copy is
+ very fast, because it only involves setting a pointer and incrementing
+ the reference count.
+
+ Object assignment (with operator=()) for implicitly shared objects is
+ implemented using shallow copies.
+
+ The benefit of sharing is that a program does not need to duplicate
+ data unnecessarily, which results in lower memory use and less copying
+ of data. Objects can easily be assigned, sent as function arguments,
+ and returned from functions.
+
+ Implicit sharing takes place behind the scenes; the programmer
+ does not need to worry about it. Even in multithreaded
+ applications, implicit sharing takes place, as explained in
+ \l{Threads and Implicit Sharing}.
+
+ \section1 Implicit Sharing in Detail
+
+ Implicit sharing automatically detaches the object from a shared
+ block if the object is about to change and the reference count is
+ greater than one. (This is often called \e {copy-on-write} or
+ \e {value semantics}.)
+
+ An implicitly shared class has total control of its internal data. In
+ any member functions that modify its data, it automatically detaches
+ before modifying the data.
+
+ The QPen class, which uses implicit sharing, detaches from the shared
+ data in all member functions that change the internal data.
+
+ Code fragment:
+ \snippet doc/src/snippets/code/doc_src_groups.qdoc 0
+
+ \section1 List of Classes
+
+ The classes listed below automatically detach from common data if
+ an object is about to be changed. The programmer will not even
+ notice that the objects are shared. Thus you should treat
+ separate instances of them as separate objects. They will always
+ behave as separate objects but with the added benefit of sharing
+ data whenever possible. For this reason, you can pass instances
+ of these classes as arguments to functions by value without
+ concern for the copying overhead.
+
+ Example:
+ \snippet doc/src/snippets/code/doc_src_groups.qdoc 1
+
+ In this example, \c p1 and \c p2 share data until QPainter::begin()
+ is called for \c p2, because painting a pixmap will modify it.
+
+ \warning Do not copy an implicitly shared container (QMap,
+ QVector, etc.) while you are iterating over it using an non-const
+ \l{STL-style iterator}.
+*/
+
+/*!
+ \group ssl
+ \title Secure Sockets Layer (SSL) Classes
+ \ingroup groups
+
+ \brief Classes for secure communication over network sockets.
+ \keyword SSL
+
+ The classes below provide support for secure network communication using
+ the Secure Sockets Layer (SSL) protocol, using the \l{OpenSSL Toolkit} to
+ perform encryption and protocol handling.
+
+ See the \l{General Qt Requirements} page for information about the
+ versions of OpenSSL that are known to work with Qt.
+
+ \note Due to import and export restrictions in some parts of the world, we
+ are unable to supply the OpenSSL Toolkit with Qt packages. Developers wishing
+ to use SSL communication in their deployed applications should either ensure
+ that their users have the appropriate libraries installed, or they should
+ consult a suitably qualified legal professional to ensure that applications
+ using code from the OpenSSL project are correctly certified for import
+ and export in relevant regions of the world.
+
+ When the QtNetwork module is built with SSL support, the library is linked
+ against OpenSSL in a way that requires OpenSSL license compliance.
+*/
+
+/*!
+ \group text
+ \title Text Processing Classes
+ \ingroup groups
+ \ingroup text-processing
+
+ \brief Classes for text processing. (See also \l{XML Classes}.)
+
+ These classes are relevant to text processing. See also the
+ \l{Rich Text Processing} overview and the
+ \l{XML classes}.
+*/
+
+/*!
+ \group thread
+ \title Threading Classes
+ \ingroup groups
+
+ \brief Classes that provide threading support.
+
+ These classes are relevant to threaded applications. See
+ \l{Thread Support in Qt} for an overview of the features
+ Qt provides to help with multithreaded programming.
+*/
+
+
+/*!
+ \group time
+ \title Date and Time Classes
+ \ingroup groups
+
+ \brief Classes for handling date and time.
+
+ These classes provide system-independent date and time abstractions.
+
+*/
+
+/*!
+ \group tools
+ \title Non-GUI Classes
+ \ingroup groups
+
+ \brief Collection classes such as list, queue, stack and string, along
+ with other classes that can be used without needing QApplication.
+
+ The non-GUI classes are general-purpose collection and string classes
+ that may be used independently of the GUI classes.
+
+ In particular, these classes do not depend on QApplication at all,
+ and so can be used in non-GUI programs.
+
+*/
+
+/*!
+ \group xml-tools
+ \title XML Classes
+ \ingroup groups
+
+ \brief Classes that support XML, via, for example DOM and SAX.
+
+ These classes are relevant to XML users.
+*/
+
+/*!
+ \group script
+ \title Scripting Classes
+ \ingroup groups
+ \ingroup scripting
+
+ \brief Qt Script-related classes and overviews.
+
+ These classes are relevant to Qt Script users.
+*/
+
+/*!
+ \group scripttools
+ \title Script Tools
+ \ingroup groups
+ \ingroup scripting
+
+ \brief Classes for managing and debugging scripts.
+
+ These classes are relevant to developers who are working with Qt Script's
+ debugging features.
+*/
diff --git a/doc/src/guibooks.qdoc b/doc/src/guibooks.qdoc
new file mode 100644
index 0000000..888368b
--- /dev/null
+++ b/doc/src/guibooks.qdoc
@@ -0,0 +1,121 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page guibooks.html
+
+ \title Books about GUI Design
+ \ingroup gui-programming
+
+ This is not a comprehensive list -- there are many other books worth
+ buying. Here we mention just a few user interface books that don't
+ gather dust on our shelves.
+
+ \bold{\l{http://www.amazon.com/gp/product/0132354160/ref=ase_trolltech/}{C++
+ GUI Programming with Qt 4, Second Edition}}
+ by Jasmin Blanchette and Mark
+ Summerfield, ISBN 0-13-235416-0. This is the official Qt book written
+ by two veteran Trolls. The first edition, which is based on Qt 4.1, is available
+ \l{http://www.qtrac.eu/C++-GUI-Programming-with-Qt-4-1st-ed.zip}{online}.
+
+ \bold{\l{http://www.amazon.com/exec/obidos/ASIN/0385267746/trolltech/t}{The Design of Everyday Things}}
+ by Donald Norman, ISBN 0-38526774-6, is one of the classics of human
+ interface design. Norman shows how badly something as simple as a
+ kitchen stove can be designed, and everyone should read it who will
+ design a dialog box, write an error message, or design just about
+ anything else humans are supposed to use.
+
+ \target fowler
+ \bold{\l{http://www.amazon.com/exec/obidos/ASIN/0070592748/trolltech/t}{GUI Design Handbook}}
+ by Susan Fowler, ISBN 0-07-059274-8, is an
+ alphabetical dictionary of widgets and other user interface elements,
+ with comprehensive coverage of each. Each chapter covers one widget
+ or other element, contains the most important recommendation from the
+ Macintosh, Windows and Motif style guides, notes about common
+ problems, comparison with other widgets that can serve some of the
+ same roles as this one, etc.
+
+ \target Design Patterns
+ \bold{\l{http://www.amazon.com/exec/obidos/ASIN/0201633612/103-8144203-3273444}
+ {Design Patterns - Elements of Reusable Object-Oriented Software}}
+ by Gamma, Helm, Johnson, and Vlissides, ISBN 0-201-63361-2, provides
+ more information on the Model-View-Controller (MVC) paradigm, explaining
+ MVC and its sub-patterns in detail.
+
+ \bold{\l{http://www.amazon.com/exec/obidos/ASIN/0201622165/trolltech/t}{Macintosh
+ Human Interface Guidelines}}, Second Edition, ISBN
+ 0-201-62216-5, is worth buying for the \e {don't}s alone. Even
+ if you're not writing Macintosh software, avoiding most of what it
+ advises against will produce more easily comprehensible software.
+ Doing what it tells you to do may also help. This book is now available
+ \link http://developer.apple.com/techpubs/mac/HIGuidelines/HIGuidelines-2.html
+ online\endlink and there is a
+ \link http://developer.apple.com/techpubs/mac/HIGOS8Guide/thig-2.html Mac
+ OS 8 addendum.\endlink
+
+ \bold{\l{http://www.amazon.com/exec/obidos/ASIN/047159900X/trolltech/t}{The
+ Microsoft Windows User Experience}}, ISBN 1-55615-679-0,
+ is Microsoft's look and feel bible. Indispensable for everyone who
+ has customers that worship Microsoft, and it's quite good, too.
+ It is also available
+ \link http://msdn.microsoft.com/library/en-us/dnwue/html/welcome.asp online\endlink.
+
+ \bold{\l{http://www.amazon.com/exec/obidos/ASIN/047159900X/trolltech/t}{The Icon Book}}
+ by William Horton, ISBN 0-471-59900-X, is perhaps the only thorough
+ coverage of icons and icon use in software. In order for icons to be
+ successful, people must be able to do four things with them: decode,
+ recognize, find and activate them. This book explains these goals
+ from scratch and how to reach them, both with single icons and icon
+ families. Some 500 examples are scattered throughout the text.
+
+
+ \section1 Buying these Books from Amazon.com
+
+ These books are made available in association with Amazon.com, our
+ favorite online bookstore. Here is more information about
+ \link http://www.amazon.com/exec/obidos/subst/help/shipping-policy.html/t
+ Amazon.com's shipping options\endlink and its
+ \link http://www.amazon.com/exec/obidos/subst/help/desk.html/t
+ customer service.\endlink When you buy a book by following one of these
+ links, Amazon.com gives about 15% of the purchase price to
+ \link http://www.amnesty.org/ Amnesty International.\endlink
+
+*/
diff --git a/doc/src/hierarchy.qdoc b/doc/src/hierarchy.qdoc
new file mode 100644
index 0000000..2b70964
--- /dev/null
+++ b/doc/src/hierarchy.qdoc
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page hierarchy.html
+
+ \title Class Inheritance Hierarchy
+ \ingroup classlists
+
+ This list shows the C++ class inheritance relations between the
+ classes in the Qt API.
+
+ \generatelist classhierarchy
+*/
diff --git a/doc/src/how-to-learn-qt.qdoc b/doc/src/how-to-learn-qt.qdoc
new file mode 100644
index 0000000..4b16294
--- /dev/null
+++ b/doc/src/how-to-learn-qt.qdoc
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page how-to-learn-qt.html
+ \brief Links to guides and resources for learning Qt.
+ \title How to Learn Qt
+ \ingroup howto
+
+ We assume that you already know C++ and will be using it for Qt
+ development. See the \l{Qt website} for more information about
+ using other programming languages with Qt.
+
+ The best way to learn Qt is to read the official Qt book,
+ \l{http://www.amazon.com/gp/product/0132354160/ref=ase_trolltech/}{C++
+ GUI Programming with Qt 4, Second Edition} (ISBN 0-13-235416-0). This book
+ provides comprehensive coverage of Qt programming all the way
+ from "Hello Qt" to advanced features such as multithreading, 2D and
+ 3D graphics, networking, item view classes, and XML. (The first edition,
+ which is based on Qt 4.1, is available
+ \l{http://www.qtrac.eu/C++-GUI-Programming-with-Qt-4-1st-ed.zip}{online}.)
+
+ If you want to program purely in C++, designing your interfaces
+ in code without the aid of any design tools, take a look at the
+ \l{Tutorials}. These are designed to get you into Qt programming,
+ with an emphasis on working code rather than being a tour of features.
+
+ If you want to design your user interfaces using a design tool, then
+ read at least the first few chapters of the \l{Qt Designer manual}.
+
+ By now you'll have produced some small working applications and have a
+ broad feel for Qt programming. You could start work on your own
+ projects straight away, but we recommend reading a couple of key
+ overviews to deepen your understanding of Qt: \l{Qt Object Model}
+ and \l{Signals and Slots}.
+
+ At this point, we recommend looking at the
+ \l{All Overviews and HOWTOs}{overviews} and reading those that are
+ relevant to your projects. You may also find it useful to browse the
+ source code of the \l{Qt Examples}{examples} that have things in
+ common with your projects. You can also read Qt's source code since
+ this is supplied.
+
+ \table
+ \row \o \inlineimage qtdemo-small.png
+ \o \bold{Getting an Overview}
+
+ If you run the \l{Examples and Demos Launcher}, you'll see many of Qt's
+ widgets in action.
+
+ The \l{Qt Widget Gallery} also provides overviews of selected Qt
+ widgets in each of the styles used on various supported platforms.
+ \endtable
+
+ Qt comes with extensive documentation, with hypertext
+ cross-references throughout, so you can easily click your way to
+ whatever interests you. The part of the documentation that you'll
+ probably use the most is the \link index.html API
+ Reference\endlink. Each link provides a different way of
+ navigating the API Reference; try them all to see which work best
+ for you. You might also like to try \l{Qt Assistant}:
+ this tool is supplied with Qt and provides access to the entire
+ Qt API, and it provides a full text search facility.
+
+ There are also a growing number of books about Qt programming; see
+ \l{Books about Qt Programming} for a complete list of Qt books,
+ including translations to various languages.
+
+ Another valuable source of example code and explanations of Qt
+ features is the archive of articles from \l {http://doc.trolltech.com/qq}
+ {Qt Quarterly}, a quarterly newsletter for users of Qt.
+
+ For documentation on specific Qt modules and other guides, refer to
+ \l{All Overviews and HOWTOs}.
+
+ Good luck, and have fun!
+*/
diff --git a/doc/src/i18n.qdoc b/doc/src/i18n.qdoc
new file mode 100644
index 0000000..5018b51
--- /dev/null
+++ b/doc/src/i18n.qdoc
@@ -0,0 +1,508 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group i18n
+ \title Internationalization with Qt
+ \ingroup topics
+
+ \brief Information about Qt's support for internationalization and multiple languages.
+
+ \keyword internationalization
+ \keyword i18n
+
+ The internationalization of an application is the process of making
+ the application usable by people in countries other than one's own.
+
+ \tableofcontents
+
+ In some cases internationalization is simple, for example, making a US
+ application accessible to Australian or British users may require
+ little more than a few spelling corrections. But to make a US
+ application usable by Japanese users, or a Korean application usable
+ by German users, will require that the software operate not only in
+ different languages, but use different input techniques, character
+ encodings and presentation conventions.
+
+ Qt tries to make internationalization as painless as possible for
+ developers. All input widgets and text drawing methods in Qt offer
+ built-in support for all supported languages. The built-in font engine
+ is capable of correctly and attractively rendering text that contains
+ characters from a variety of different writing systems at the same
+ time.
+
+ Qt supports most languages in use today, in particular:
+ \list
+ \o All East Asian languages (Chinese, Japanese and Korean)
+ \o All Western languages (using Latin script)
+ \o Arabic
+ \o Cyrillic languages (Russian, Ukrainian, etc.)
+ \o Greek
+ \o Hebrew
+ \o Thai and Lao
+ \o All scripts in Unicode 4.0 that do not require special processing
+ \endlist
+
+ On Windows, Unix/X11 with FontConfig (client side font support)
+ and Qt for Embedded Linux the following languages are also supported:
+ \list
+ \o Bengali
+ \o Devanagari
+ \o Dhivehi (Thaana)
+ \o Gujarati
+ \o Gurmukhi
+ \o Kannada
+ \o Khmer
+ \o Malayalam
+ \o Myanmar
+ \o Syriac
+ \o Tamil
+ \o Telugu
+ \o Tibetan
+ \endlist
+
+ Many of these writing systems exhibit special features:
+
+ \list
+
+ \o \bold{Special line breaking behavior.} Some of the Asian languages are
+ written without spaces between words. Line breaking can occur either
+ after every character (with exceptions) as in Chinese, Japanese and
+ Korean, or after logical word boundaries as in Thai.
+
+ \o \bold{Bidirectional writing.} Arabic and Hebrew are written from right to
+ left, except for numbers and embedded English text which is written
+ left to right. The exact behavior is defined in the
+ \l{http://www.unicode.org/unicode/reports/tr9/}{Unicode Technical Annex #9}.
+
+ \o \bold{Non-spacing or diacritical marks (accents or umlauts in European
+ languages).} Some languages such as Vietnamese make extensive use of
+ these marks and some characters can have more than one mark at the
+ same time to clarify pronunciation.
+
+ \o \bold{Ligatures.} In special contexts, some pairs of characters get
+ replaced by a combined glyph forming a ligature. Common examples are
+ the fl and fi ligatures used in typesetting US and European books.
+
+ \endlist
+
+ Qt tries to take care of all the special features listed above. You
+ usually don't have to worry about these features so long as you use
+ Qt's input widgets (e.g. QLineEdit, QTextEdit, and derived classes)
+ and Qt's display widgets (e.g. QLabel).
+
+ Support for these writing systems is transparent to the
+ programmer and completely encapsulated in \l{rich text
+ processing}{Qt's text engine}. This means that you don't need to
+ have any knowledge about the writing system used in a particular
+ language, except for the following small points:
+
+ \list
+
+ \o QPainter::drawText(int x, int y, const QString &str) will always
+ draw the string with its left edge at the position specified with
+ the x, y parameters. This will usually give you left aligned strings.
+ Arabic and Hebrew application strings are usually right
+ aligned, so for these languages use the version of drawText() that
+ takes a QRect since this will align in accordance with the language.
+
+ \o When you write your own text input controls, use \l
+ QFontMetrics::charWidth() to determine the width of a character in a
+ string. In some languages (e.g. Arabic or languages from the Indian
+ subcontinent), the width and shape of a glyph changes depending on the
+ surrounding characters. Writing input controls usually requires a
+ certain knowledge of the scripts it is going to be used in. Usually
+ the easiest way is to subclass QLineEdit or QTextEdit.
+
+ \endlist
+
+ The following sections give some information on the status of the
+ internationalization (i18n) support in Qt. See also the \l{Qt
+ Linguist manual}.
+
+ \section1 Step by Step
+
+ Writing cross-platform international software with Qt is a gentle,
+ incremental process. Your software can become internationalized in
+ the following stages:
+
+ \section2 Use QString for All User-Visible Text
+
+ Since QString uses the Unicode 4.0 encoding internally, every
+ language in the world can be processed transparently using
+ familiar text processing operations. Also, since all Qt functions
+ that present text to the user take a QString as a parameter,
+ there is no \c{char *} to QString conversion overhead.
+
+ Strings that are in "programmer space" (such as QObject names
+ and file format texts) need not use QString; the traditional
+ \c{char *} or the QByteArray class will suffice.
+
+ You're unlikely to notice that you are using Unicode;
+ QString, and QChar are just like easier versions of the crude
+ \c{const char *} and char from traditional C.
+
+ \section2 Use tr() for All Literal Text
+
+ Wherever your program uses "quoted text" for text that will
+ be presented to the user, ensure that it is processed by the \l
+ QCoreApplication::translate() function. Essentially all that is necessary
+ to achieve this is to use QObject::tr(). For example, assuming the
+ \c LoginWidget is a subclass of QWidget:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 0
+
+ This accounts for 99% of the user-visible strings you're likely to
+ write.
+
+ If the quoted text is not in a member function of a
+ QObject subclass, use either the tr() function of an
+ appropriate class, or the QCoreApplication::translate() function
+ directly:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 1
+
+ If you need to have translatable text completely
+ outside a function, there are two macros to help: QT_TR_NOOP()
+ and QT_TRANSLATE_NOOP(). They merely mark the text for
+ extraction by the \c lupdate utility described below.
+ The macros expand to just the text (without the context).
+
+ Example of QT_TR_NOOP():
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 2
+
+ Example of QT_TRANSLATE_NOOP():
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 3
+
+ If you disable the \c{const char *} to QString automatic
+ conversion by compiling your software with the macro \c
+ QT_NO_CAST_FROM_ASCII defined, you'll be very likely to catch any
+ strings you are missing. See QString::fromLatin1() for more
+ information. Disabling the conversion can make programming a bit
+ cumbersome.
+
+ If your source language uses characters outside Latin1, you
+ might find QObject::trUtf8() more convenient than
+ QObject::tr(), as tr() depends on the
+ QTextCodec::codecForTr(), which makes it more fragile than
+ QObject::trUtf8().
+
+ \section2 Use QKeySequence() for Accelerator Values
+
+ Accelerator values such as Ctrl+Q or Alt+F need to be translated
+ too. If you hardcode Qt::CTRL + Qt::Key_Q for "quit" in your
+ application, translators won't be able to override it. The
+ correct idiom is
+
+ \snippet examples/mainwindows/application/mainwindow.cpp 20
+
+ \section2 Use QString::arg() for Dynamic Text
+
+ The QString::arg() functions offer a simple means for substituting
+ arguments:
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 4
+
+ In some languages the order of arguments may need to change, and this
+ can easily be achieved by changing the order of the % arguments. For
+ example:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 5
+
+ produces the correct output in English and Norwegian:
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 6
+
+ \section2 Produce Translations
+
+ Once you are using tr() throughout an application, you can start
+ producing translations of the user-visible text in your program.
+
+ The \l{Qt Linguist manual} provides further information about
+ Qt's translation tools, \e{Qt Linguist}, \c lupdate and \c
+ lrelease.
+
+ Translation of a Qt application is a three-step process:
+
+ \list 1
+
+ \o Run \c lupdate to extract translatable text from the C++
+ source code of the Qt application, resulting in a message file
+ for translators (a \c .ts file). The utility recognizes the tr()
+ construct and the \c{QT_TR*_NOOP()} macros described above and
+ produces \c .ts files (usually one per language).
+
+ \o Provide translations for the source texts in the \c .ts file, using
+ \e{Qt Linguist}. Since \c .ts files are in XML format, you can also
+ edit them by hand.
+
+ \o Run \c lrelease to obtain a light-weight message file (a \c .qm
+ file) from the \c .ts file, suitable only for end use. Think of the \c
+ .ts files as "source files", and \c .qm files as "object files". The
+ translator edits the \c .ts files, but the users of your application
+ only need the \c .qm files. Both kinds of files are platform and
+ locale independent.
+
+ \endlist
+
+ Typically, you will repeat these steps for every release of your
+ application. The \c lupdate utility does its best to reuse the
+ translations from previous releases.
+
+ Before you run \c lupdate, you should prepare a project file. Here's
+ an example project file (\c .pro file):
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 7
+
+ When you run \c lupdate or \c lrelease, you must give the name of the
+ project file as a command-line argument.
+
+ In this example, four exotic languages are supported: Danish,
+ Finnish, Norwegian and Swedish. If you use \l{qmake}, you usually
+ don't need an extra project file for \c lupdate; your \c qmake
+ project file will work fine once you add the \c TRANSLATIONS
+ entry.
+
+ In your application, you must \l QTranslator::load() the translation
+ files appropriate for the user's language, and install them using \l
+ QCoreApplication::installTranslator().
+
+ \c linguist, \c lupdate and \c lrelease are installed in the \c bin
+ subdirectory of the base directory Qt is installed into. Click Help|Manual
+ in \e{Qt Linguist} to access the user's manual; it contains a tutorial
+ to get you started.
+
+ \target qt-itself
+ Qt itself contains over 400 strings that will also need to be
+ translated into the languages that you are targeting. You will find
+ translation files for French, German and Simplified Chinese in
+ \c{$QTDIR/translations}, as well as a template for translating to
+ other languages. (This directory also contains some additional
+ unsupported translations which may be useful.)
+
+ Typically, your application's \c main() function will look like
+ this:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 8
+
+ Note the use of QLibraryInfo::location() to locate the Qt translations.
+ Developers should request the path to the translations at run-time by
+ passing QLibraryInfo::TranslationsPath to this function instead of
+ using the \c QTDIR environment variable in their applications.
+
+ \section2 Support for Encodings
+
+ The QTextCodec class and the facilities in QTextStream make it easy to
+ support many input and output encodings for your users' data. When an
+ application starts, the locale of the machine will determine the 8-bit
+ encoding used when dealing with 8-bit data: such as for font
+ selection, text display, 8-bit text I/O, and character input.
+
+ The application may occasionally require encodings other than the
+ default local 8-bit encoding. For example, an application in a
+ Cyrillic KOI8-R locale (the de-facto standard locale in Russia) might
+ need to output Cyrillic in the ISO 8859-5 encoding. Code for this
+ would be:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 9
+
+ For converting Unicode to local 8-bit encodings, a shortcut is
+ available: the QString::toLocal8Bit() function returns such 8-bit
+ data. Another useful shortcut is QString::toUtf8(), which returns
+ text in the 8-bit UTF-8 encoding: this perfectly preserves
+ Unicode information while looking like plain ASCII if the text is
+ wholly ASCII.
+
+ For converting the other way, there are the QString::fromUtf8() and
+ QString::fromLocal8Bit() convenience functions, or the general code,
+ demonstrated by this conversion from ISO 8859-5 Cyrillic to Unicode
+ conversion:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 10
+
+ Ideally Unicode I/O should be used as this maximizes the portability
+ of documents between users around the world, but in reality it is
+ useful to support all the appropriate encodings that your users will
+ need to process existing documents. In general, Unicode (UTF-16 or
+ UTF-8) is best for information transferred between arbitrary people,
+ while within a language or national group, a local standard is often
+ more appropriate. The most important encoding to support is the one
+ returned by QTextCodec::codecForLocale(), as this is the one the user
+ is most likely to need for communicating with other people and
+ applications (this is the codec used by local8Bit()).
+
+ Qt supports most of the more frequently used encodings natively. For a
+ complete list of supported encodings see the \l QTextCodec
+ documentation.
+
+ In some cases and for less frequently used encodings it may be
+ necessary to write your own QTextCodec subclass. Depending on the
+ urgency, it may be useful to contact Qt's technical support team or
+ ask on the \c qt-interest mailing list to see if someone else is
+ already working on supporting the encoding.
+
+ \keyword localization
+
+ \section2 Localize
+
+ Localization is the process of adapting to local conventions, for
+ example presenting dates and times using the locally preferred
+ formats. Such localizations can be accomplished using appropriate tr()
+ strings.
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 11
+
+ In the example, for the US we would leave the translation of
+ "AMPM" as it is and thereby use the 12-hour clock branch; but in
+ Europe we would translate it as something else and this will make
+ the code use the 24-hour clock branch.
+
+ For localized numbers use the QLocale class.
+
+ Localizing images is not recommended. Choose clear icons that are
+ appropriate for all localities, rather than relying on local puns or
+ stretched metaphors. The exception is for images of left and right
+ pointing arrows which may need to be reversed for Arabic and Hebrew
+ locales.
+
+ \section1 Dynamic Translation
+
+ Some applications, such as Qt Linguist, must be able to support changes
+ to the user's language settings while they are still running. To make
+ widgets aware of changes to the installed QTranslators, reimplement the
+ widget's \l{QWidget::changeEvent()}{changeEvent()} function to check whether
+ the event is a \l{QEvent::LanguageChange}{LanguageChange} event, and update
+ the text displayed by widgets using the \l{QObject::tr()}{tr()} function
+ in the usual way. For example:
+
+ \snippet doc/src/snippets/code/doc_src_i18n.qdoc 12
+
+ All other change events should be passed on by calling the default
+ implementation of the function.
+
+ The list of installed translators might change in reaction to a
+ \l{QEvent::LocaleChange}{LocaleChange} event, or the application might
+ provide a user interface that allows the user to change the current
+ application language.
+
+ The default event handler for QWidget subclasses responds to the
+ QEvent::LanguageChange event, and will call this function when necessary;
+ other application components can also force widgets to update themselves
+ by posting the \l{QEvent::LanguageChange}{LanguageChange} event to them.
+
+ \section1 Translating Non-Qt Classes
+
+ It is sometimes necessary to provide internationalization support for
+ strings used in classes that do not inherit QObject or use the Q_OBJECT
+ macro to enable translation features. Since Qt translates strings at
+ run-time based on the class they are associated with and \c lupdate
+ looks for translatable strings in the source code, non-Qt classes must
+ use mechanisms that also provide this information.
+
+ One way to do this is to add translation support to a non-Qt class
+ using the Q_DECLARE_TR_FUNCTIONS() macro; for example:
+
+ \snippet doc/src/snippets/i18n-non-qt-class/myclass.h 0
+ \dots
+ \snippet doc/src/snippets/i18n-non-qt-class/myclass.h 1
+
+ This provides the class with \l{QObject::}{tr()} functions that can
+ be used to translate strings associated with the class, and makes it
+ possible for \c lupdate to find translatable strings in the source
+ code.
+
+ Alternatively, the QCoreApplication::translate() function can be called
+ with a specific context, and this will be recognized by \c lupdate and
+ Qt Linguist.
+
+ \section1 System Support
+
+ Some of the operating systems and windowing systems that Qt runs on
+ only have limited support for Unicode. The level of support available
+ in the underlying system has some influence on the support that Qt can
+ provide on those platforms, although in general Qt applications need
+ not be too concerned with platform-specific limitations.
+
+ \section2 Unix/X11
+
+ \list
+ \o Locale-oriented fonts and input methods. Qt hides these and
+ provides Unicode input and output.
+ \o Filesystem conventions such as
+ \l{http://www.ietf.org/rfc/rfc2279.txt}{UTF-8}
+ are under development in some Unix variants. All Qt file
+ functions allow Unicode, but convert filenames to the local
+ 8-bit encoding, as this is the Unix convention (see
+ QFile::setEncodingFunction() to explore alternative
+ encodings).
+ \o File I/O defaults to the local 8-bit encoding,
+ with Unicode options in QTextStream.
+ \o Many Unix distributions contain only partial support for some locales.
+ For example, if you have a \c /usr/share/locale/ja_JP.EUC directory,
+ this does not necessarily mean you can display Japanese text; you also
+ need JIS encoded fonts (or Unicode fonts), and the
+ \c /usr/share/locale/ja_JP.EUC directory needs to be complete. For
+ best results, use complete locales from your system vendor.
+ \endlist
+
+ \section2 Windows
+
+ \list
+ \o Qt provides full Unicode support, including input methods, fonts,
+ clipboard, drag-and-drop and file names.
+ \o File I/O defaults to Latin1, with Unicode options in QTextStream.
+ Note that some Windows programs do not understand big-endian
+ Unicode text files even though that is the order prescribed by
+ the Unicode Standard in the absence of higher-level protocols.
+ \o Unlike programs written with MFC or plain winlib, Qt programs
+ are portable between Windows 98 and Windows NT.
+ \e {You do not need different binaries to support Unicode.}
+ \endlist
+
+ \section2 Mac OS X
+
+ For details on Mac-specific translation, refer to the Qt/Mac Specific Issues
+ document \l{Qt for Mac OS X - Specific Issues#Translating the Application Menu and Native Dialogs}{here}.
+
+ \section1 Relevant Qt Classes
+
+ These classes are relevant to internationalizing Qt applications.
+*/
diff --git a/doc/src/images/2dpainting-example.png b/doc/src/images/2dpainting-example.png
new file mode 100644
index 0000000..2a77e7d
--- /dev/null
+++ b/doc/src/images/2dpainting-example.png
Binary files differ
diff --git a/doc/src/images/abstract-connections.png b/doc/src/images/abstract-connections.png
new file mode 100644
index 0000000..18d2f4e
--- /dev/null
+++ b/doc/src/images/abstract-connections.png
Binary files differ
diff --git a/doc/src/images/accessibilityarchitecture.png b/doc/src/images/accessibilityarchitecture.png
new file mode 100644
index 0000000..40cd6dc
--- /dev/null
+++ b/doc/src/images/accessibilityarchitecture.png
Binary files differ
diff --git a/doc/src/images/accessibleobjecttree.png b/doc/src/images/accessibleobjecttree.png
new file mode 100644
index 0000000..8b82158
--- /dev/null
+++ b/doc/src/images/accessibleobjecttree.png
Binary files differ
diff --git a/doc/src/images/addressbook-adddialog.png b/doc/src/images/addressbook-adddialog.png
new file mode 100644
index 0000000..e2bab80
--- /dev/null
+++ b/doc/src/images/addressbook-adddialog.png
Binary files differ
diff --git a/doc/src/images/addressbook-classes.png b/doc/src/images/addressbook-classes.png
new file mode 100644
index 0000000..2920f16
--- /dev/null
+++ b/doc/src/images/addressbook-classes.png
Binary files differ
diff --git a/doc/src/images/addressbook-editdialog.png b/doc/src/images/addressbook-editdialog.png
new file mode 100644
index 0000000..fd41ee6
--- /dev/null
+++ b/doc/src/images/addressbook-editdialog.png
Binary files differ
diff --git a/doc/src/images/addressbook-example.png b/doc/src/images/addressbook-example.png
new file mode 100644
index 0000000..b743c16
--- /dev/null
+++ b/doc/src/images/addressbook-example.png
Binary files differ
diff --git a/doc/src/images/addressbook-filemenu.png b/doc/src/images/addressbook-filemenu.png
new file mode 100644
index 0000000..ebd14b6
--- /dev/null
+++ b/doc/src/images/addressbook-filemenu.png
Binary files differ
diff --git a/doc/src/images/addressbook-newaddresstab.png b/doc/src/images/addressbook-newaddresstab.png
new file mode 100644
index 0000000..ff215a4
--- /dev/null
+++ b/doc/src/images/addressbook-newaddresstab.png
Binary files differ
diff --git a/doc/src/images/addressbook-signals.png b/doc/src/images/addressbook-signals.png
new file mode 100644
index 0000000..cda4269
--- /dev/null
+++ b/doc/src/images/addressbook-signals.png
Binary files differ
diff --git a/doc/src/images/addressbook-toolsmenu.png b/doc/src/images/addressbook-toolsmenu.png
new file mode 100644
index 0000000..092e9a2
--- /dev/null
+++ b/doc/src/images/addressbook-toolsmenu.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part1-labeled-layout.png b/doc/src/images/addressbook-tutorial-part1-labeled-layout.png
new file mode 100644
index 0000000..ef514c8
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part1-labeled-layout.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part1-labeled-screenshot.png b/doc/src/images/addressbook-tutorial-part1-labeled-screenshot.png
new file mode 100644
index 0000000..4381079
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part1-labeled-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part1-screenshot.png b/doc/src/images/addressbook-tutorial-part1-screenshot.png
new file mode 100644
index 0000000..cf15627
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part1-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part2-add-contact.png b/doc/src/images/addressbook-tutorial-part2-add-contact.png
new file mode 100644
index 0000000..330858d
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part2-add-contact.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part2-add-flowchart.png b/doc/src/images/addressbook-tutorial-part2-add-flowchart.png
new file mode 100644
index 0000000..ca9af37
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part2-add-flowchart.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part2-add-successful.png b/doc/src/images/addressbook-tutorial-part2-add-successful.png
new file mode 100644
index 0000000..3b108fb
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part2-add-successful.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part2-labeled-layout.png b/doc/src/images/addressbook-tutorial-part2-labeled-layout.png
new file mode 100644
index 0000000..73f6dfb
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part2-labeled-layout.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part2-signals-and-slots.png b/doc/src/images/addressbook-tutorial-part2-signals-and-slots.png
new file mode 100644
index 0000000..e49f8dc
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part2-signals-and-slots.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part2-stretch-effects.png b/doc/src/images/addressbook-tutorial-part2-stretch-effects.png
new file mode 100644
index 0000000..d9f7f31
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part2-stretch-effects.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part3-labeled-layout.png b/doc/src/images/addressbook-tutorial-part3-labeled-layout.png
new file mode 100644
index 0000000..662fa7f
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part3-labeled-layout.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part3-linkedlist.png b/doc/src/images/addressbook-tutorial-part3-linkedlist.png
new file mode 100644
index 0000000..e7f4725
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part3-linkedlist.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part3-screenshot.png b/doc/src/images/addressbook-tutorial-part3-screenshot.png
new file mode 100644
index 0000000..97d1357
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part3-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part4-remove.png b/doc/src/images/addressbook-tutorial-part4-remove.png
new file mode 100644
index 0000000..42b0f92
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part4-remove.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part5-finddialog.png b/doc/src/images/addressbook-tutorial-part5-finddialog.png
new file mode 100644
index 0000000..18e5451
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part5-finddialog.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part5-notfound.png b/doc/src/images/addressbook-tutorial-part5-notfound.png
new file mode 100644
index 0000000..be7172e
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part5-notfound.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part5-screenshot.png b/doc/src/images/addressbook-tutorial-part5-screenshot.png
new file mode 100644
index 0000000..ea4a66c
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part5-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part5-signals-and-slots.png b/doc/src/images/addressbook-tutorial-part5-signals-and-slots.png
new file mode 100644
index 0000000..1771e7b
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part5-signals-and-slots.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part6-load.png b/doc/src/images/addressbook-tutorial-part6-load.png
new file mode 100644
index 0000000..95fdcaf
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part6-load.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part6-save.png b/doc/src/images/addressbook-tutorial-part6-save.png
new file mode 100644
index 0000000..c0deb70
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part6-save.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part6-screenshot.png b/doc/src/images/addressbook-tutorial-part6-screenshot.png
new file mode 100644
index 0000000..f77bf03
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part6-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-part7-screenshot.png b/doc/src/images/addressbook-tutorial-part7-screenshot.png
new file mode 100644
index 0000000..d6b0a50
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-part7-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial-screenshot.png b/doc/src/images/addressbook-tutorial-screenshot.png
new file mode 100644
index 0000000..d6727dc
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial-screenshot.png
Binary files differ
diff --git a/doc/src/images/addressbook-tutorial.png b/doc/src/images/addressbook-tutorial.png
new file mode 100644
index 0000000..495edda
--- /dev/null
+++ b/doc/src/images/addressbook-tutorial.png
Binary files differ
diff --git a/doc/src/images/affine-demo.png b/doc/src/images/affine-demo.png
new file mode 100644
index 0000000..534d695
--- /dev/null
+++ b/doc/src/images/affine-demo.png
Binary files differ
diff --git a/doc/src/images/alphachannelimage.png b/doc/src/images/alphachannelimage.png
new file mode 100644
index 0000000..57b17c6
--- /dev/null
+++ b/doc/src/images/alphachannelimage.png
Binary files differ
diff --git a/doc/src/images/alphafill.png b/doc/src/images/alphafill.png
new file mode 100644
index 0000000..3feff296
--- /dev/null
+++ b/doc/src/images/alphafill.png
Binary files differ
diff --git a/doc/src/images/analogclock-example.png b/doc/src/images/analogclock-example.png
new file mode 100644
index 0000000..ffd7baa
--- /dev/null
+++ b/doc/src/images/analogclock-example.png
Binary files differ
diff --git a/doc/src/images/analogclock-viewport.png b/doc/src/images/analogclock-viewport.png
new file mode 100644
index 0000000..31ce0c3
--- /dev/null
+++ b/doc/src/images/analogclock-viewport.png
Binary files differ
diff --git a/doc/src/images/antialiased.png b/doc/src/images/antialiased.png
new file mode 100644
index 0000000..70619cc
--- /dev/null
+++ b/doc/src/images/antialiased.png
Binary files differ
diff --git a/doc/src/images/application-menus.png b/doc/src/images/application-menus.png
new file mode 100644
index 0000000..1815a2a
--- /dev/null
+++ b/doc/src/images/application-menus.png
Binary files differ
diff --git a/doc/src/images/application.png b/doc/src/images/application.png
new file mode 100644
index 0000000..2fb7f2f
--- /dev/null
+++ b/doc/src/images/application.png
Binary files differ
diff --git a/doc/src/images/arthurplugin-demo.png b/doc/src/images/arthurplugin-demo.png
new file mode 100644
index 0000000..6d372c2
--- /dev/null
+++ b/doc/src/images/arthurplugin-demo.png
Binary files differ
diff --git a/doc/src/images/assistant-address-toolbar.png b/doc/src/images/assistant-address-toolbar.png
new file mode 100644
index 0000000..7f00942
--- /dev/null
+++ b/doc/src/images/assistant-address-toolbar.png
Binary files differ
diff --git a/doc/src/images/assistant-assistant.png b/doc/src/images/assistant-assistant.png
new file mode 100644
index 0000000..d728889
--- /dev/null
+++ b/doc/src/images/assistant-assistant.png
Binary files differ
diff --git a/doc/src/images/assistant-dockwidgets.png b/doc/src/images/assistant-dockwidgets.png
new file mode 100644
index 0000000..17bc064
--- /dev/null
+++ b/doc/src/images/assistant-dockwidgets.png
Binary files differ
diff --git a/doc/src/images/assistant-docwindow.png b/doc/src/images/assistant-docwindow.png
new file mode 100644
index 0000000..c5bac58
--- /dev/null
+++ b/doc/src/images/assistant-docwindow.png
Binary files differ
diff --git a/doc/src/images/assistant-examples.png b/doc/src/images/assistant-examples.png
new file mode 100644
index 0000000..47c01bc
--- /dev/null
+++ b/doc/src/images/assistant-examples.png
Binary files differ
diff --git a/doc/src/images/assistant-filter-toolbar.png b/doc/src/images/assistant-filter-toolbar.png
new file mode 100644
index 0000000..e1411e4
--- /dev/null
+++ b/doc/src/images/assistant-filter-toolbar.png
Binary files differ
diff --git a/doc/src/images/assistant-preferences-documentation.png b/doc/src/images/assistant-preferences-documentation.png
new file mode 100644
index 0000000..42c1fd0
--- /dev/null
+++ b/doc/src/images/assistant-preferences-documentation.png
Binary files differ
diff --git a/doc/src/images/assistant-preferences-filters.png b/doc/src/images/assistant-preferences-filters.png
new file mode 100644
index 0000000..6844d88
--- /dev/null
+++ b/doc/src/images/assistant-preferences-filters.png
Binary files differ
diff --git a/doc/src/images/assistant-preferences-fonts.png b/doc/src/images/assistant-preferences-fonts.png
new file mode 100644
index 0000000..172fcce
--- /dev/null
+++ b/doc/src/images/assistant-preferences-fonts.png
Binary files differ
diff --git a/doc/src/images/assistant-preferences-options.png b/doc/src/images/assistant-preferences-options.png
new file mode 100644
index 0000000..f04499f
--- /dev/null
+++ b/doc/src/images/assistant-preferences-options.png
Binary files differ
diff --git a/doc/src/images/assistant-search.png b/doc/src/images/assistant-search.png
new file mode 100644
index 0000000..ef75c33
--- /dev/null
+++ b/doc/src/images/assistant-search.png
Binary files differ
diff --git a/doc/src/images/assistant-toolbar.png b/doc/src/images/assistant-toolbar.png
new file mode 100644
index 0000000..1b41825
--- /dev/null
+++ b/doc/src/images/assistant-toolbar.png
Binary files differ
diff --git a/doc/src/images/basicdrawing-example.png b/doc/src/images/basicdrawing-example.png
new file mode 100644
index 0000000..043acbe
--- /dev/null
+++ b/doc/src/images/basicdrawing-example.png
Binary files differ
diff --git a/doc/src/images/basicgraphicslayouts-example.png b/doc/src/images/basicgraphicslayouts-example.png
new file mode 100644
index 0000000..5c8f4cb
--- /dev/null
+++ b/doc/src/images/basicgraphicslayouts-example.png
Binary files differ
diff --git a/doc/src/images/basiclayouts-example.png b/doc/src/images/basiclayouts-example.png
new file mode 100644
index 0000000..f293423
--- /dev/null
+++ b/doc/src/images/basiclayouts-example.png
Binary files differ
diff --git a/doc/src/images/basicsortfiltermodel-example.png b/doc/src/images/basicsortfiltermodel-example.png
new file mode 100644
index 0000000..7f3bfdf
--- /dev/null
+++ b/doc/src/images/basicsortfiltermodel-example.png
Binary files differ
diff --git a/doc/src/images/bearings.png b/doc/src/images/bearings.png
new file mode 100644
index 0000000..0010892
--- /dev/null
+++ b/doc/src/images/bearings.png
Binary files differ
diff --git a/doc/src/images/blockingfortuneclient-example.png b/doc/src/images/blockingfortuneclient-example.png
new file mode 100644
index 0000000..cdb7cac
--- /dev/null
+++ b/doc/src/images/blockingfortuneclient-example.png
Binary files differ
diff --git a/doc/src/images/books-demo.png b/doc/src/images/books-demo.png
new file mode 100644
index 0000000..5bcc20b
--- /dev/null
+++ b/doc/src/images/books-demo.png
Binary files differ
diff --git a/doc/src/images/borderlayout-example.png b/doc/src/images/borderlayout-example.png
new file mode 100644
index 0000000..e856e06
--- /dev/null
+++ b/doc/src/images/borderlayout-example.png
Binary files differ
diff --git a/doc/src/images/boxes-demo.png b/doc/src/images/boxes-demo.png
new file mode 100644
index 0000000..6ad253c
--- /dev/null
+++ b/doc/src/images/boxes-demo.png
Binary files differ
diff --git a/doc/src/images/broadcastreceiver-example.png b/doc/src/images/broadcastreceiver-example.png
new file mode 100644
index 0000000..b837895
--- /dev/null
+++ b/doc/src/images/broadcastreceiver-example.png
Binary files differ
diff --git a/doc/src/images/broadcastsender-example.png b/doc/src/images/broadcastsender-example.png
new file mode 100644
index 0000000..bf7ccbe
--- /dev/null
+++ b/doc/src/images/broadcastsender-example.png
Binary files differ
diff --git a/doc/src/images/browser-demo.png b/doc/src/images/browser-demo.png
new file mode 100644
index 0000000..466f218
--- /dev/null
+++ b/doc/src/images/browser-demo.png
Binary files differ
diff --git a/doc/src/images/brush-outline.png b/doc/src/images/brush-outline.png
new file mode 100644
index 0000000..f560c9f
--- /dev/null
+++ b/doc/src/images/brush-outline.png
Binary files differ
diff --git a/doc/src/images/brush-styles.png b/doc/src/images/brush-styles.png
new file mode 100644
index 0000000..eecb006
--- /dev/null
+++ b/doc/src/images/brush-styles.png
Binary files differ
diff --git a/doc/src/images/buttonbox-gnomelayout-horizontal.png b/doc/src/images/buttonbox-gnomelayout-horizontal.png
new file mode 100644
index 0000000..b2f74bb
--- /dev/null
+++ b/doc/src/images/buttonbox-gnomelayout-horizontal.png
Binary files differ
diff --git a/doc/src/images/buttonbox-gnomelayout-vertical.png b/doc/src/images/buttonbox-gnomelayout-vertical.png
new file mode 100644
index 0000000..e7843dc
--- /dev/null
+++ b/doc/src/images/buttonbox-gnomelayout-vertical.png
Binary files differ
diff --git a/doc/src/images/buttonbox-kdelayout-horizontal.png b/doc/src/images/buttonbox-kdelayout-horizontal.png
new file mode 100644
index 0000000..5da11f4
--- /dev/null
+++ b/doc/src/images/buttonbox-kdelayout-horizontal.png
Binary files differ
diff --git a/doc/src/images/buttonbox-kdelayout-vertical.png b/doc/src/images/buttonbox-kdelayout-vertical.png
new file mode 100644
index 0000000..6f5dfc6
--- /dev/null
+++ b/doc/src/images/buttonbox-kdelayout-vertical.png
Binary files differ
diff --git a/doc/src/images/buttonbox-mac-modeless-horizontal.png b/doc/src/images/buttonbox-mac-modeless-horizontal.png
new file mode 100644
index 0000000..2e853d3
--- /dev/null
+++ b/doc/src/images/buttonbox-mac-modeless-horizontal.png
Binary files differ
diff --git a/doc/src/images/buttonbox-mac-modeless-vertical.png b/doc/src/images/buttonbox-mac-modeless-vertical.png
new file mode 100644
index 0000000..f59bd8d
--- /dev/null
+++ b/doc/src/images/buttonbox-mac-modeless-vertical.png
Binary files differ
diff --git a/doc/src/images/buttonbox-maclayout-horizontal.png b/doc/src/images/buttonbox-maclayout-horizontal.png
new file mode 100644
index 0000000..89ae84d
--- /dev/null
+++ b/doc/src/images/buttonbox-maclayout-horizontal.png
Binary files differ
diff --git a/doc/src/images/buttonbox-maclayout-vertical.png b/doc/src/images/buttonbox-maclayout-vertical.png
new file mode 100644
index 0000000..7287600
--- /dev/null
+++ b/doc/src/images/buttonbox-maclayout-vertical.png
Binary files differ
diff --git a/doc/src/images/buttonbox-winlayout-horizontal.png b/doc/src/images/buttonbox-winlayout-horizontal.png
new file mode 100644
index 0000000..dd4ce1c
--- /dev/null
+++ b/doc/src/images/buttonbox-winlayout-horizontal.png
Binary files differ
diff --git a/doc/src/images/buttonbox-winlayout-vertical.png b/doc/src/images/buttonbox-winlayout-vertical.png
new file mode 100644
index 0000000..539de1a
--- /dev/null
+++ b/doc/src/images/buttonbox-winlayout-vertical.png
Binary files differ
diff --git a/doc/src/images/cachedtable-example.png b/doc/src/images/cachedtable-example.png
new file mode 100644
index 0000000..db770df
--- /dev/null
+++ b/doc/src/images/cachedtable-example.png
Binary files differ
diff --git a/doc/src/images/calculator-example.png b/doc/src/images/calculator-example.png
new file mode 100644
index 0000000..6f1158d
--- /dev/null
+++ b/doc/src/images/calculator-example.png
Binary files differ
diff --git a/doc/src/images/calculator-ugly.png b/doc/src/images/calculator-ugly.png
new file mode 100644
index 0000000..cdfa902
--- /dev/null
+++ b/doc/src/images/calculator-ugly.png
Binary files differ
diff --git a/doc/src/images/calculatorbuilder-example.png b/doc/src/images/calculatorbuilder-example.png
new file mode 100644
index 0000000..561e500
--- /dev/null
+++ b/doc/src/images/calculatorbuilder-example.png
Binary files differ
diff --git a/doc/src/images/calculatorform-example.png b/doc/src/images/calculatorform-example.png
new file mode 100644
index 0000000..91432ac
--- /dev/null
+++ b/doc/src/images/calculatorform-example.png
Binary files differ
diff --git a/doc/src/images/calendar-example.png b/doc/src/images/calendar-example.png
new file mode 100644
index 0000000..895ce76
--- /dev/null
+++ b/doc/src/images/calendar-example.png
Binary files differ
diff --git a/doc/src/images/calendarwidgetexample.png b/doc/src/images/calendarwidgetexample.png
new file mode 100644
index 0000000..464be90
--- /dev/null
+++ b/doc/src/images/calendarwidgetexample.png
Binary files differ
diff --git a/doc/src/images/cannon-tutorial.png b/doc/src/images/cannon-tutorial.png
new file mode 100644
index 0000000..7347153
--- /dev/null
+++ b/doc/src/images/cannon-tutorial.png
Binary files differ
diff --git a/doc/src/images/capabilitiesexample.png b/doc/src/images/capabilitiesexample.png
new file mode 100644
index 0000000..d760592
--- /dev/null
+++ b/doc/src/images/capabilitiesexample.png
Binary files differ
diff --git a/doc/src/images/cde-calendarwidget.png b/doc/src/images/cde-calendarwidget.png
new file mode 100644
index 0000000..9615eae
--- /dev/null
+++ b/doc/src/images/cde-calendarwidget.png
Binary files differ
diff --git a/doc/src/images/cde-checkbox.png b/doc/src/images/cde-checkbox.png
new file mode 100644
index 0000000..b2528dc
--- /dev/null
+++ b/doc/src/images/cde-checkbox.png
Binary files differ
diff --git a/doc/src/images/cde-combobox.png b/doc/src/images/cde-combobox.png
new file mode 100644
index 0000000..7458643
--- /dev/null
+++ b/doc/src/images/cde-combobox.png
Binary files differ
diff --git a/doc/src/images/cde-dateedit.png b/doc/src/images/cde-dateedit.png
new file mode 100644
index 0000000..ebb24d5
--- /dev/null
+++ b/doc/src/images/cde-dateedit.png
Binary files differ
diff --git a/doc/src/images/cde-datetimeedit.png b/doc/src/images/cde-datetimeedit.png
new file mode 100644
index 0000000..9ac659a
--- /dev/null
+++ b/doc/src/images/cde-datetimeedit.png
Binary files differ
diff --git a/doc/src/images/cde-dial.png b/doc/src/images/cde-dial.png
new file mode 100644
index 0000000..956d19c
--- /dev/null
+++ b/doc/src/images/cde-dial.png
Binary files differ
diff --git a/doc/src/images/cde-doublespinbox.png b/doc/src/images/cde-doublespinbox.png
new file mode 100644
index 0000000..30a9af6
--- /dev/null
+++ b/doc/src/images/cde-doublespinbox.png
Binary files differ
diff --git a/doc/src/images/cde-fontcombobox.png b/doc/src/images/cde-fontcombobox.png
new file mode 100644
index 0000000..043ca1d
--- /dev/null
+++ b/doc/src/images/cde-fontcombobox.png
Binary files differ
diff --git a/doc/src/images/cde-frame.png b/doc/src/images/cde-frame.png
new file mode 100644
index 0000000..221576e
--- /dev/null
+++ b/doc/src/images/cde-frame.png
Binary files differ
diff --git a/doc/src/images/cde-groupbox.png b/doc/src/images/cde-groupbox.png
new file mode 100644
index 0000000..8bad69b
--- /dev/null
+++ b/doc/src/images/cde-groupbox.png
Binary files differ
diff --git a/doc/src/images/cde-horizontalscrollbar.png b/doc/src/images/cde-horizontalscrollbar.png
new file mode 100644
index 0000000..6e7cde8
--- /dev/null
+++ b/doc/src/images/cde-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/images/cde-label.png b/doc/src/images/cde-label.png
new file mode 100644
index 0000000..4e906ea
--- /dev/null
+++ b/doc/src/images/cde-label.png
Binary files differ
diff --git a/doc/src/images/cde-lcdnumber.png b/doc/src/images/cde-lcdnumber.png
new file mode 100644
index 0000000..97324c1
--- /dev/null
+++ b/doc/src/images/cde-lcdnumber.png
Binary files differ
diff --git a/doc/src/images/cde-lineedit.png b/doc/src/images/cde-lineedit.png
new file mode 100644
index 0000000..6c1527b
--- /dev/null
+++ b/doc/src/images/cde-lineedit.png
Binary files differ
diff --git a/doc/src/images/cde-listview.png b/doc/src/images/cde-listview.png
new file mode 100644
index 0000000..2e58140
--- /dev/null
+++ b/doc/src/images/cde-listview.png
Binary files differ
diff --git a/doc/src/images/cde-progressbar.png b/doc/src/images/cde-progressbar.png
new file mode 100644
index 0000000..41715de
--- /dev/null
+++ b/doc/src/images/cde-progressbar.png
Binary files differ
diff --git a/doc/src/images/cde-pushbutton.png b/doc/src/images/cde-pushbutton.png
new file mode 100644
index 0000000..2d9bdd2
--- /dev/null
+++ b/doc/src/images/cde-pushbutton.png
Binary files differ
diff --git a/doc/src/images/cde-radiobutton.png b/doc/src/images/cde-radiobutton.png
new file mode 100644
index 0000000..e053665
--- /dev/null
+++ b/doc/src/images/cde-radiobutton.png
Binary files differ
diff --git a/doc/src/images/cde-slider.png b/doc/src/images/cde-slider.png
new file mode 100644
index 0000000..bd84371
--- /dev/null
+++ b/doc/src/images/cde-slider.png
Binary files differ
diff --git a/doc/src/images/cde-spinbox.png b/doc/src/images/cde-spinbox.png
new file mode 100644
index 0000000..5f53c8e
--- /dev/null
+++ b/doc/src/images/cde-spinbox.png
Binary files differ
diff --git a/doc/src/images/cde-tableview.png b/doc/src/images/cde-tableview.png
new file mode 100644
index 0000000..7a99217
--- /dev/null
+++ b/doc/src/images/cde-tableview.png
Binary files differ
diff --git a/doc/src/images/cde-tabwidget.png b/doc/src/images/cde-tabwidget.png
new file mode 100644
index 0000000..8cf5473
--- /dev/null
+++ b/doc/src/images/cde-tabwidget.png
Binary files differ
diff --git a/doc/src/images/cde-textedit.png b/doc/src/images/cde-textedit.png
new file mode 100644
index 0000000..c65b8da
--- /dev/null
+++ b/doc/src/images/cde-textedit.png
Binary files differ
diff --git a/doc/src/images/cde-timeedit.png b/doc/src/images/cde-timeedit.png
new file mode 100644
index 0000000..6a5a4b9
--- /dev/null
+++ b/doc/src/images/cde-timeedit.png
Binary files differ
diff --git a/doc/src/images/cde-toolbox.png b/doc/src/images/cde-toolbox.png
new file mode 100644
index 0000000..c0dd4e9
--- /dev/null
+++ b/doc/src/images/cde-toolbox.png
Binary files differ
diff --git a/doc/src/images/cde-toolbutton.png b/doc/src/images/cde-toolbutton.png
new file mode 100644
index 0000000..baff25c
--- /dev/null
+++ b/doc/src/images/cde-toolbutton.png
Binary files differ
diff --git a/doc/src/images/cde-treeview.png b/doc/src/images/cde-treeview.png
new file mode 100644
index 0000000..df3184b
--- /dev/null
+++ b/doc/src/images/cde-treeview.png
Binary files differ
diff --git a/doc/src/images/charactermap-example.png b/doc/src/images/charactermap-example.png
new file mode 100644
index 0000000..c1f25a5
--- /dev/null
+++ b/doc/src/images/charactermap-example.png
Binary files differ
diff --git a/doc/src/images/chart-example.png b/doc/src/images/chart-example.png
new file mode 100644
index 0000000..9823666
--- /dev/null
+++ b/doc/src/images/chart-example.png
Binary files differ
diff --git a/doc/src/images/chip-demo.png b/doc/src/images/chip-demo.png
new file mode 100644
index 0000000..8889424
--- /dev/null
+++ b/doc/src/images/chip-demo.png
Binary files differ
diff --git a/doc/src/images/classwizard-flow.png b/doc/src/images/classwizard-flow.png
new file mode 100644
index 0000000..ad9446c
--- /dev/null
+++ b/doc/src/images/classwizard-flow.png
Binary files differ
diff --git a/doc/src/images/classwizard.png b/doc/src/images/classwizard.png
new file mode 100644
index 0000000..ea740bd
--- /dev/null
+++ b/doc/src/images/classwizard.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-calendarwidget.png b/doc/src/images/cleanlooks-calendarwidget.png
new file mode 100644
index 0000000..99c57b6
--- /dev/null
+++ b/doc/src/images/cleanlooks-calendarwidget.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-checkbox.png b/doc/src/images/cleanlooks-checkbox.png
new file mode 100644
index 0000000..aaf2daa
--- /dev/null
+++ b/doc/src/images/cleanlooks-checkbox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-combobox.png b/doc/src/images/cleanlooks-combobox.png
new file mode 100644
index 0000000..5fff4c8
--- /dev/null
+++ b/doc/src/images/cleanlooks-combobox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-dateedit.png b/doc/src/images/cleanlooks-dateedit.png
new file mode 100644
index 0000000..384136a
--- /dev/null
+++ b/doc/src/images/cleanlooks-dateedit.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-datetimeedit.png b/doc/src/images/cleanlooks-datetimeedit.png
new file mode 100644
index 0000000..7a62ceb
--- /dev/null
+++ b/doc/src/images/cleanlooks-datetimeedit.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-dial.png b/doc/src/images/cleanlooks-dial.png
new file mode 100644
index 0000000..259a088
--- /dev/null
+++ b/doc/src/images/cleanlooks-dial.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-dialogbuttonbox.png b/doc/src/images/cleanlooks-dialogbuttonbox.png
new file mode 100644
index 0000000..907dfda
--- /dev/null
+++ b/doc/src/images/cleanlooks-dialogbuttonbox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-doublespinbox.png b/doc/src/images/cleanlooks-doublespinbox.png
new file mode 100644
index 0000000..93b11f9
--- /dev/null
+++ b/doc/src/images/cleanlooks-doublespinbox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-fontcombobox.png b/doc/src/images/cleanlooks-fontcombobox.png
new file mode 100644
index 0000000..47a5907
--- /dev/null
+++ b/doc/src/images/cleanlooks-fontcombobox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-frame.png b/doc/src/images/cleanlooks-frame.png
new file mode 100644
index 0000000..2427b08
--- /dev/null
+++ b/doc/src/images/cleanlooks-frame.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-groupbox.png b/doc/src/images/cleanlooks-groupbox.png
new file mode 100644
index 0000000..89c6eb2
--- /dev/null
+++ b/doc/src/images/cleanlooks-groupbox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-horizontalscrollbar.png b/doc/src/images/cleanlooks-horizontalscrollbar.png
new file mode 100644
index 0000000..ca1c806
--- /dev/null
+++ b/doc/src/images/cleanlooks-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-label.png b/doc/src/images/cleanlooks-label.png
new file mode 100644
index 0000000..199758f
--- /dev/null
+++ b/doc/src/images/cleanlooks-label.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-lcdnumber.png b/doc/src/images/cleanlooks-lcdnumber.png
new file mode 100644
index 0000000..c6e3412
--- /dev/null
+++ b/doc/src/images/cleanlooks-lcdnumber.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-lineedit.png b/doc/src/images/cleanlooks-lineedit.png
new file mode 100644
index 0000000..3e9f1a4
--- /dev/null
+++ b/doc/src/images/cleanlooks-lineedit.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-listview.png b/doc/src/images/cleanlooks-listview.png
new file mode 100644
index 0000000..95f836c
--- /dev/null
+++ b/doc/src/images/cleanlooks-listview.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-progressbar.png b/doc/src/images/cleanlooks-progressbar.png
new file mode 100644
index 0000000..53fc6c1
--- /dev/null
+++ b/doc/src/images/cleanlooks-progressbar.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-pushbutton-menu.png b/doc/src/images/cleanlooks-pushbutton-menu.png
new file mode 100644
index 0000000..0d5cb59
--- /dev/null
+++ b/doc/src/images/cleanlooks-pushbutton-menu.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-pushbutton.png b/doc/src/images/cleanlooks-pushbutton.png
new file mode 100644
index 0000000..7b3b335
--- /dev/null
+++ b/doc/src/images/cleanlooks-pushbutton.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-radiobutton.png b/doc/src/images/cleanlooks-radiobutton.png
new file mode 100644
index 0000000..4e07768
--- /dev/null
+++ b/doc/src/images/cleanlooks-radiobutton.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-slider.png b/doc/src/images/cleanlooks-slider.png
new file mode 100644
index 0000000..8dfaa01
--- /dev/null
+++ b/doc/src/images/cleanlooks-slider.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-spinbox.png b/doc/src/images/cleanlooks-spinbox.png
new file mode 100644
index 0000000..ad5b5a0
--- /dev/null
+++ b/doc/src/images/cleanlooks-spinbox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-tableview.png b/doc/src/images/cleanlooks-tableview.png
new file mode 100644
index 0000000..d89fecc
--- /dev/null
+++ b/doc/src/images/cleanlooks-tableview.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-tabwidget.png b/doc/src/images/cleanlooks-tabwidget.png
new file mode 100644
index 0000000..bcff296
--- /dev/null
+++ b/doc/src/images/cleanlooks-tabwidget.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-textedit.png b/doc/src/images/cleanlooks-textedit.png
new file mode 100644
index 0000000..0c825a1
--- /dev/null
+++ b/doc/src/images/cleanlooks-textedit.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-timeedit.png b/doc/src/images/cleanlooks-timeedit.png
new file mode 100644
index 0000000..00420a2
--- /dev/null
+++ b/doc/src/images/cleanlooks-timeedit.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-toolbox.png b/doc/src/images/cleanlooks-toolbox.png
new file mode 100644
index 0000000..63366e5
--- /dev/null
+++ b/doc/src/images/cleanlooks-toolbox.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-toolbutton.png b/doc/src/images/cleanlooks-toolbutton.png
new file mode 100644
index 0000000..bcf86ea
--- /dev/null
+++ b/doc/src/images/cleanlooks-toolbutton.png
Binary files differ
diff --git a/doc/src/images/cleanlooks-treeview.png b/doc/src/images/cleanlooks-treeview.png
new file mode 100644
index 0000000..5bc4a06
--- /dev/null
+++ b/doc/src/images/cleanlooks-treeview.png
Binary files differ
diff --git a/doc/src/images/codecs-example.png b/doc/src/images/codecs-example.png
new file mode 100644
index 0000000..8e7ae95
--- /dev/null
+++ b/doc/src/images/codecs-example.png
Binary files differ
diff --git a/doc/src/images/codeeditor-example.png b/doc/src/images/codeeditor-example.png
new file mode 100644
index 0000000..b176406
--- /dev/null
+++ b/doc/src/images/codeeditor-example.png
Binary files differ
diff --git a/doc/src/images/collidingmice-example.png b/doc/src/images/collidingmice-example.png
new file mode 100644
index 0000000..41561de
--- /dev/null
+++ b/doc/src/images/collidingmice-example.png
Binary files differ
diff --git a/doc/src/images/coloreditorfactoryimage.png b/doc/src/images/coloreditorfactoryimage.png
new file mode 100644
index 0000000..cd839a6
--- /dev/null
+++ b/doc/src/images/coloreditorfactoryimage.png
Binary files differ
diff --git a/doc/src/images/combo-widget-mapper.png b/doc/src/images/combo-widget-mapper.png
new file mode 100644
index 0000000..910d6ed
--- /dev/null
+++ b/doc/src/images/combo-widget-mapper.png
Binary files differ
diff --git a/doc/src/images/completer-example-country.png b/doc/src/images/completer-example-country.png
new file mode 100644
index 0000000..fa7c8a9
--- /dev/null
+++ b/doc/src/images/completer-example-country.png
Binary files differ
diff --git a/doc/src/images/completer-example-dirmodel.png b/doc/src/images/completer-example-dirmodel.png
new file mode 100644
index 0000000..94b75b0
--- /dev/null
+++ b/doc/src/images/completer-example-dirmodel.png
Binary files differ
diff --git a/doc/src/images/completer-example-qdirmodel.png b/doc/src/images/completer-example-qdirmodel.png
new file mode 100644
index 0000000..904c198
--- /dev/null
+++ b/doc/src/images/completer-example-qdirmodel.png
Binary files differ
diff --git a/doc/src/images/completer-example-word.png b/doc/src/images/completer-example-word.png
new file mode 100644
index 0000000..aa3fb9c
--- /dev/null
+++ b/doc/src/images/completer-example-word.png
Binary files differ
diff --git a/doc/src/images/completer-example.png b/doc/src/images/completer-example.png
new file mode 100644
index 0000000..dcaa253
--- /dev/null
+++ b/doc/src/images/completer-example.png
Binary files differ
diff --git a/doc/src/images/complexwizard-detailspage.png b/doc/src/images/complexwizard-detailspage.png
new file mode 100644
index 0000000..58eeae4
--- /dev/null
+++ b/doc/src/images/complexwizard-detailspage.png
Binary files differ
diff --git a/doc/src/images/complexwizard-evaluatepage.png b/doc/src/images/complexwizard-evaluatepage.png
new file mode 100644
index 0000000..23f200e
--- /dev/null
+++ b/doc/src/images/complexwizard-evaluatepage.png
Binary files differ
diff --git a/doc/src/images/complexwizard-finishpage.png b/doc/src/images/complexwizard-finishpage.png
new file mode 100644
index 0000000..60703a0
--- /dev/null
+++ b/doc/src/images/complexwizard-finishpage.png
Binary files differ
diff --git a/doc/src/images/complexwizard-flow.png b/doc/src/images/complexwizard-flow.png
new file mode 100644
index 0000000..c74b0ee
--- /dev/null
+++ b/doc/src/images/complexwizard-flow.png
Binary files differ
diff --git a/doc/src/images/complexwizard-registerpage.png b/doc/src/images/complexwizard-registerpage.png
new file mode 100644
index 0000000..18a359c
--- /dev/null
+++ b/doc/src/images/complexwizard-registerpage.png
Binary files differ
diff --git a/doc/src/images/complexwizard-titlepage.png b/doc/src/images/complexwizard-titlepage.png
new file mode 100644
index 0000000..29acbbc
--- /dev/null
+++ b/doc/src/images/complexwizard-titlepage.png
Binary files differ
diff --git a/doc/src/images/complexwizard.png b/doc/src/images/complexwizard.png
new file mode 100644
index 0000000..d08942e
--- /dev/null
+++ b/doc/src/images/complexwizard.png
Binary files differ
diff --git a/doc/src/images/composition-demo.png b/doc/src/images/composition-demo.png
new file mode 100644
index 0000000..942bc58
--- /dev/null
+++ b/doc/src/images/composition-demo.png
Binary files differ
diff --git a/doc/src/images/concentriccircles-example.png b/doc/src/images/concentriccircles-example.png
new file mode 100644
index 0000000..fd308b5
--- /dev/null
+++ b/doc/src/images/concentriccircles-example.png
Binary files differ
diff --git a/doc/src/images/conceptaudio.png b/doc/src/images/conceptaudio.png
new file mode 100644
index 0000000..b4eabad
--- /dev/null
+++ b/doc/src/images/conceptaudio.png
Binary files differ
diff --git a/doc/src/images/conceptprocessor.png b/doc/src/images/conceptprocessor.png
new file mode 100644
index 0000000..2b76df3
--- /dev/null
+++ b/doc/src/images/conceptprocessor.png
@@ -0,0 +1 @@
+This is a temporary placeholder.
diff --git a/doc/src/images/conceptvideo.png b/doc/src/images/conceptvideo.png
new file mode 100644
index 0000000..1777b21
--- /dev/null
+++ b/doc/src/images/conceptvideo.png
Binary files differ
diff --git a/doc/src/images/configdialog-example.png b/doc/src/images/configdialog-example.png
new file mode 100644
index 0000000..20d917b
--- /dev/null
+++ b/doc/src/images/configdialog-example.png
Binary files differ
diff --git a/doc/src/images/conicalGradient.png b/doc/src/images/conicalGradient.png
new file mode 100644
index 0000000..013f6ef
--- /dev/null
+++ b/doc/src/images/conicalGradient.png
Binary files differ
diff --git a/doc/src/images/containerextension-example.png b/doc/src/images/containerextension-example.png
new file mode 100644
index 0000000..2427f91
--- /dev/null
+++ b/doc/src/images/containerextension-example.png
Binary files differ
diff --git a/doc/src/images/context2d-example-smileysmile.png b/doc/src/images/context2d-example-smileysmile.png
new file mode 100644
index 0000000..369f32e
--- /dev/null
+++ b/doc/src/images/context2d-example-smileysmile.png
Binary files differ
diff --git a/doc/src/images/context2d-example.png b/doc/src/images/context2d-example.png
new file mode 100644
index 0000000..0c12754
--- /dev/null
+++ b/doc/src/images/context2d-example.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-analogclock.png b/doc/src/images/coordinatesystem-analogclock.png
new file mode 100644
index 0000000..16e3091
--- /dev/null
+++ b/doc/src/images/coordinatesystem-analogclock.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-line-antialias.png b/doc/src/images/coordinatesystem-line-antialias.png
new file mode 100644
index 0000000..90dfa87
--- /dev/null
+++ b/doc/src/images/coordinatesystem-line-antialias.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-line-raster.png b/doc/src/images/coordinatesystem-line-raster.png
new file mode 100644
index 0000000..65201bd
--- /dev/null
+++ b/doc/src/images/coordinatesystem-line-raster.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-line.png b/doc/src/images/coordinatesystem-line.png
new file mode 100644
index 0000000..fbf6873
--- /dev/null
+++ b/doc/src/images/coordinatesystem-line.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-rect-antialias.png b/doc/src/images/coordinatesystem-rect-antialias.png
new file mode 100644
index 0000000..162e1df
--- /dev/null
+++ b/doc/src/images/coordinatesystem-rect-antialias.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-rect-raster.png b/doc/src/images/coordinatesystem-rect-raster.png
new file mode 100644
index 0000000..be3690d
--- /dev/null
+++ b/doc/src/images/coordinatesystem-rect-raster.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-rect.png b/doc/src/images/coordinatesystem-rect.png
new file mode 100644
index 0000000..76c06be
--- /dev/null
+++ b/doc/src/images/coordinatesystem-rect.png
Binary files differ
diff --git a/doc/src/images/coordinatesystem-transformations.png b/doc/src/images/coordinatesystem-transformations.png
new file mode 100644
index 0000000..2736213
--- /dev/null
+++ b/doc/src/images/coordinatesystem-transformations.png
Binary files differ
diff --git a/doc/src/images/coordsys.png b/doc/src/images/coordsys.png
new file mode 100644
index 0000000..181f2f6
--- /dev/null
+++ b/doc/src/images/coordsys.png
Binary files differ
diff --git a/doc/src/images/cursor-arrow.png b/doc/src/images/cursor-arrow.png
new file mode 100644
index 0000000..a69ef4e
--- /dev/null
+++ b/doc/src/images/cursor-arrow.png
Binary files differ
diff --git a/doc/src/images/cursor-busy.png b/doc/src/images/cursor-busy.png
new file mode 100644
index 0000000..53717e4
--- /dev/null
+++ b/doc/src/images/cursor-busy.png
Binary files differ
diff --git a/doc/src/images/cursor-closedhand.png b/doc/src/images/cursor-closedhand.png
new file mode 100644
index 0000000..b78dd1d
--- /dev/null
+++ b/doc/src/images/cursor-closedhand.png
Binary files differ
diff --git a/doc/src/images/cursor-cross.png b/doc/src/images/cursor-cross.png
new file mode 100644
index 0000000..fe38e74
--- /dev/null
+++ b/doc/src/images/cursor-cross.png
Binary files differ
diff --git a/doc/src/images/cursor-forbidden.png b/doc/src/images/cursor-forbidden.png
new file mode 100644
index 0000000..2b08c4e
--- /dev/null
+++ b/doc/src/images/cursor-forbidden.png
Binary files differ
diff --git a/doc/src/images/cursor-hand.png b/doc/src/images/cursor-hand.png
new file mode 100644
index 0000000..d2004ae
--- /dev/null
+++ b/doc/src/images/cursor-hand.png
Binary files differ
diff --git a/doc/src/images/cursor-hsplit.png b/doc/src/images/cursor-hsplit.png
new file mode 100644
index 0000000..1beda25
--- /dev/null
+++ b/doc/src/images/cursor-hsplit.png
Binary files differ
diff --git a/doc/src/images/cursor-ibeam.png b/doc/src/images/cursor-ibeam.png
new file mode 100644
index 0000000..097fc5f
--- /dev/null
+++ b/doc/src/images/cursor-ibeam.png
Binary files differ
diff --git a/doc/src/images/cursor-openhand.png b/doc/src/images/cursor-openhand.png
new file mode 100644
index 0000000..9181c85
--- /dev/null
+++ b/doc/src/images/cursor-openhand.png
Binary files differ
diff --git a/doc/src/images/cursor-sizeall.png b/doc/src/images/cursor-sizeall.png
new file mode 100644
index 0000000..69f13eb
--- /dev/null
+++ b/doc/src/images/cursor-sizeall.png
Binary files differ
diff --git a/doc/src/images/cursor-sizeb.png b/doc/src/images/cursor-sizeb.png
new file mode 100644
index 0000000..f37d7b9
--- /dev/null
+++ b/doc/src/images/cursor-sizeb.png
Binary files differ
diff --git a/doc/src/images/cursor-sizef.png b/doc/src/images/cursor-sizef.png
new file mode 100644
index 0000000..3b127a0
--- /dev/null
+++ b/doc/src/images/cursor-sizef.png
Binary files differ
diff --git a/doc/src/images/cursor-sizeh.png b/doc/src/images/cursor-sizeh.png
new file mode 100644
index 0000000..a9f40cb
--- /dev/null
+++ b/doc/src/images/cursor-sizeh.png
Binary files differ
diff --git a/doc/src/images/cursor-sizev.png b/doc/src/images/cursor-sizev.png
new file mode 100644
index 0000000..1edbab2
--- /dev/null
+++ b/doc/src/images/cursor-sizev.png
Binary files differ
diff --git a/doc/src/images/cursor-uparrow.png b/doc/src/images/cursor-uparrow.png
new file mode 100644
index 0000000..d3e70ef
--- /dev/null
+++ b/doc/src/images/cursor-uparrow.png
Binary files differ
diff --git a/doc/src/images/cursor-vsplit.png b/doc/src/images/cursor-vsplit.png
new file mode 100644
index 0000000..a5667e3
--- /dev/null
+++ b/doc/src/images/cursor-vsplit.png
Binary files differ
diff --git a/doc/src/images/cursor-wait.png b/doc/src/images/cursor-wait.png
new file mode 100644
index 0000000..69056c4
--- /dev/null
+++ b/doc/src/images/cursor-wait.png
Binary files differ
diff --git a/doc/src/images/cursor-whatsthis.png b/doc/src/images/cursor-whatsthis.png
new file mode 100644
index 0000000..b47601c
--- /dev/null
+++ b/doc/src/images/cursor-whatsthis.png
Binary files differ
diff --git a/doc/src/images/customcompleter-example.png b/doc/src/images/customcompleter-example.png
new file mode 100644
index 0000000..a525208
--- /dev/null
+++ b/doc/src/images/customcompleter-example.png
Binary files differ
diff --git a/doc/src/images/customcompleter-insertcompletion.png b/doc/src/images/customcompleter-insertcompletion.png
new file mode 100644
index 0000000..0bb2c25
--- /dev/null
+++ b/doc/src/images/customcompleter-insertcompletion.png
Binary files differ
diff --git a/doc/src/images/customsortfiltermodel-example.png b/doc/src/images/customsortfiltermodel-example.png
new file mode 100644
index 0000000..d7ee8bd
--- /dev/null
+++ b/doc/src/images/customsortfiltermodel-example.png
Binary files differ
diff --git a/doc/src/images/customtypesending-example.png b/doc/src/images/customtypesending-example.png
new file mode 100644
index 0000000..fbc3953
--- /dev/null
+++ b/doc/src/images/customtypesending-example.png
Binary files differ
diff --git a/doc/src/images/customwidgetplugin-example.png b/doc/src/images/customwidgetplugin-example.png
new file mode 100644
index 0000000..87fde81
--- /dev/null
+++ b/doc/src/images/customwidgetplugin-example.png
Binary files differ
diff --git a/doc/src/images/datetimewidgets.png b/doc/src/images/datetimewidgets.png
new file mode 100644
index 0000000..c2d498c
--- /dev/null
+++ b/doc/src/images/datetimewidgets.png
Binary files differ
diff --git a/doc/src/images/dbus-chat-example.png b/doc/src/images/dbus-chat-example.png
new file mode 100644
index 0000000..ad66d08
--- /dev/null
+++ b/doc/src/images/dbus-chat-example.png
Binary files differ
diff --git a/doc/src/images/defaultprototypes-example.png b/doc/src/images/defaultprototypes-example.png
new file mode 100644
index 0000000..72fe3c4
--- /dev/null
+++ b/doc/src/images/defaultprototypes-example.png
Binary files differ
diff --git a/doc/src/images/deform-demo.png b/doc/src/images/deform-demo.png
new file mode 100644
index 0000000..2f037f0
--- /dev/null
+++ b/doc/src/images/deform-demo.png
Binary files differ
diff --git a/doc/src/images/delayedecoding-example.png b/doc/src/images/delayedecoding-example.png
new file mode 100644
index 0000000..1cafba6
--- /dev/null
+++ b/doc/src/images/delayedecoding-example.png
Binary files differ
diff --git a/doc/src/images/deployment-mac-application.png b/doc/src/images/deployment-mac-application.png
new file mode 100644
index 0000000..99ad23f
--- /dev/null
+++ b/doc/src/images/deployment-mac-application.png
Binary files differ
diff --git a/doc/src/images/deployment-mac-bundlestructure.png b/doc/src/images/deployment-mac-bundlestructure.png
new file mode 100644
index 0000000..db7a298
--- /dev/null
+++ b/doc/src/images/deployment-mac-bundlestructure.png
Binary files differ
diff --git a/doc/src/images/deployment-windows-depends.png b/doc/src/images/deployment-windows-depends.png
new file mode 100644
index 0000000..56c8439
--- /dev/null
+++ b/doc/src/images/deployment-windows-depends.png
Binary files differ
diff --git a/doc/src/images/designer-action-editor.png b/doc/src/images/designer-action-editor.png
new file mode 100644
index 0000000..7d17573
--- /dev/null
+++ b/doc/src/images/designer-action-editor.png
Binary files differ
diff --git a/doc/src/images/designer-add-custom-toolbar.png b/doc/src/images/designer-add-custom-toolbar.png
new file mode 100644
index 0000000..fe16586
--- /dev/null
+++ b/doc/src/images/designer-add-custom-toolbar.png
Binary files differ
diff --git a/doc/src/images/designer-add-files-button.png b/doc/src/images/designer-add-files-button.png
new file mode 100644
index 0000000..45ff4a0
--- /dev/null
+++ b/doc/src/images/designer-add-files-button.png
Binary files differ
diff --git a/doc/src/images/designer-add-resource-entry-button.png b/doc/src/images/designer-add-resource-entry-button.png
new file mode 100644
index 0000000..e29fcf8
--- /dev/null
+++ b/doc/src/images/designer-add-resource-entry-button.png
Binary files differ
diff --git a/doc/src/images/designer-adding-dockwidget.png b/doc/src/images/designer-adding-dockwidget.png
new file mode 100644
index 0000000..87b0fb8
--- /dev/null
+++ b/doc/src/images/designer-adding-dockwidget.png
Binary files differ
diff --git a/doc/src/images/designer-adding-dynamic-property.png b/doc/src/images/designer-adding-dynamic-property.png
new file mode 100644
index 0000000..a92320e
--- /dev/null
+++ b/doc/src/images/designer-adding-dynamic-property.png
Binary files differ
diff --git a/doc/src/images/designer-adding-menu-action.png b/doc/src/images/designer-adding-menu-action.png
new file mode 100644
index 0000000..cf2a9c9
--- /dev/null
+++ b/doc/src/images/designer-adding-menu-action.png
Binary files differ
diff --git a/doc/src/images/designer-adding-toolbar-action.png b/doc/src/images/designer-adding-toolbar-action.png
new file mode 100644
index 0000000..e2201cb
--- /dev/null
+++ b/doc/src/images/designer-adding-toolbar-action.png
Binary files differ
diff --git a/doc/src/images/designer-buddy-making.png b/doc/src/images/designer-buddy-making.png
new file mode 100644
index 0000000..3d8e8a1
--- /dev/null
+++ b/doc/src/images/designer-buddy-making.png
Binary files differ
diff --git a/doc/src/images/designer-buddy-mode.png b/doc/src/images/designer-buddy-mode.png
new file mode 100644
index 0000000..48197f6
--- /dev/null
+++ b/doc/src/images/designer-buddy-mode.png
Binary files differ
diff --git a/doc/src/images/designer-buddy-tool.png b/doc/src/images/designer-buddy-tool.png
new file mode 100644
index 0000000..2a42870
--- /dev/null
+++ b/doc/src/images/designer-buddy-tool.png
Binary files differ
diff --git a/doc/src/images/designer-choosing-form.png b/doc/src/images/designer-choosing-form.png
new file mode 100644
index 0000000..fa6e470
--- /dev/null
+++ b/doc/src/images/designer-choosing-form.png
Binary files differ
diff --git a/doc/src/images/designer-code-viewer.png b/doc/src/images/designer-code-viewer.png
new file mode 100644
index 0000000..c9d8528
--- /dev/null
+++ b/doc/src/images/designer-code-viewer.png
Binary files differ
diff --git a/doc/src/images/designer-connection-dialog.png b/doc/src/images/designer-connection-dialog.png
new file mode 100644
index 0000000..28dfeae
--- /dev/null
+++ b/doc/src/images/designer-connection-dialog.png
Binary files differ
diff --git a/doc/src/images/designer-connection-editing.png b/doc/src/images/designer-connection-editing.png
new file mode 100644
index 0000000..90b6a3a
--- /dev/null
+++ b/doc/src/images/designer-connection-editing.png
Binary files differ
diff --git a/doc/src/images/designer-connection-editor.png b/doc/src/images/designer-connection-editor.png
new file mode 100644
index 0000000..fd4d17d
--- /dev/null
+++ b/doc/src/images/designer-connection-editor.png
Binary files differ
diff --git a/doc/src/images/designer-connection-highlight.png b/doc/src/images/designer-connection-highlight.png
new file mode 100644
index 0000000..089d1e4
--- /dev/null
+++ b/doc/src/images/designer-connection-highlight.png
Binary files differ
diff --git a/doc/src/images/designer-connection-making.png b/doc/src/images/designer-connection-making.png
new file mode 100644
index 0000000..a7ce33f
--- /dev/null
+++ b/doc/src/images/designer-connection-making.png
Binary files differ
diff --git a/doc/src/images/designer-connection-mode.png b/doc/src/images/designer-connection-mode.png
new file mode 100644
index 0000000..8b98f9f
--- /dev/null
+++ b/doc/src/images/designer-connection-mode.png
Binary files differ
diff --git a/doc/src/images/designer-connection-to-form.png b/doc/src/images/designer-connection-to-form.png
new file mode 100644
index 0000000..320f70f
--- /dev/null
+++ b/doc/src/images/designer-connection-to-form.png
Binary files differ
diff --git a/doc/src/images/designer-connection-tool.png b/doc/src/images/designer-connection-tool.png
new file mode 100644
index 0000000..71c9b07
--- /dev/null
+++ b/doc/src/images/designer-connection-tool.png
Binary files differ
diff --git a/doc/src/images/designer-containers-dockwidget.png b/doc/src/images/designer-containers-dockwidget.png
new file mode 100644
index 0000000..f4dcc0b
--- /dev/null
+++ b/doc/src/images/designer-containers-dockwidget.png
Binary files differ
diff --git a/doc/src/images/designer-containers-frame.png b/doc/src/images/designer-containers-frame.png
new file mode 100644
index 0000000..d16823a
--- /dev/null
+++ b/doc/src/images/designer-containers-frame.png
Binary files differ
diff --git a/doc/src/images/designer-containers-groupbox.png b/doc/src/images/designer-containers-groupbox.png
new file mode 100644
index 0000000..d347e2f
--- /dev/null
+++ b/doc/src/images/designer-containers-groupbox.png
Binary files differ
diff --git a/doc/src/images/designer-containers-stackedwidget.png b/doc/src/images/designer-containers-stackedwidget.png
new file mode 100644
index 0000000..3239e52
--- /dev/null
+++ b/doc/src/images/designer-containers-stackedwidget.png
Binary files differ
diff --git a/doc/src/images/designer-containers-tabwidget.png b/doc/src/images/designer-containers-tabwidget.png
new file mode 100644
index 0000000..dab3dfd
--- /dev/null
+++ b/doc/src/images/designer-containers-tabwidget.png
Binary files differ
diff --git a/doc/src/images/designer-containers-toolbox.png b/doc/src/images/designer-containers-toolbox.png
new file mode 100644
index 0000000..e51fad6
--- /dev/null
+++ b/doc/src/images/designer-containers-toolbox.png
Binary files differ
diff --git a/doc/src/images/designer-creating-dynamic-property.png b/doc/src/images/designer-creating-dynamic-property.png
new file mode 100644
index 0000000..0d4f838
--- /dev/null
+++ b/doc/src/images/designer-creating-dynamic-property.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu-entry1.png b/doc/src/images/designer-creating-menu-entry1.png
new file mode 100644
index 0000000..1fcac22
--- /dev/null
+++ b/doc/src/images/designer-creating-menu-entry1.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu-entry2.png b/doc/src/images/designer-creating-menu-entry2.png
new file mode 100644
index 0000000..e7a537c
--- /dev/null
+++ b/doc/src/images/designer-creating-menu-entry2.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu-entry3.png b/doc/src/images/designer-creating-menu-entry3.png
new file mode 100644
index 0000000..f50a448
--- /dev/null
+++ b/doc/src/images/designer-creating-menu-entry3.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu-entry4.png b/doc/src/images/designer-creating-menu-entry4.png
new file mode 100644
index 0000000..aea6639
--- /dev/null
+++ b/doc/src/images/designer-creating-menu-entry4.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu.png b/doc/src/images/designer-creating-menu.png
new file mode 100644
index 0000000..5268aac
--- /dev/null
+++ b/doc/src/images/designer-creating-menu.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu1.png b/doc/src/images/designer-creating-menu1.png
new file mode 100644
index 0000000..ee2732a
--- /dev/null
+++ b/doc/src/images/designer-creating-menu1.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu2.png b/doc/src/images/designer-creating-menu2.png
new file mode 100644
index 0000000..95808d5
--- /dev/null
+++ b/doc/src/images/designer-creating-menu2.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu3.png b/doc/src/images/designer-creating-menu3.png
new file mode 100644
index 0000000..b9d80c0
--- /dev/null
+++ b/doc/src/images/designer-creating-menu3.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menu4.png b/doc/src/images/designer-creating-menu4.png
new file mode 100644
index 0000000..e05c931
--- /dev/null
+++ b/doc/src/images/designer-creating-menu4.png
Binary files differ
diff --git a/doc/src/images/designer-creating-menubar.png b/doc/src/images/designer-creating-menubar.png
new file mode 100644
index 0000000..87606f7
--- /dev/null
+++ b/doc/src/images/designer-creating-menubar.png
Binary files differ
diff --git a/doc/src/images/designer-custom-widget-box.png b/doc/src/images/designer-custom-widget-box.png
new file mode 100644
index 0000000..f3b9c1a
--- /dev/null
+++ b/doc/src/images/designer-custom-widget-box.png
Binary files differ
diff --git a/doc/src/images/designer-customize-toolbar.png b/doc/src/images/designer-customize-toolbar.png
new file mode 100644
index 0000000..3fad021
--- /dev/null
+++ b/doc/src/images/designer-customize-toolbar.png
Binary files differ
diff --git a/doc/src/images/designer-dialog-final.png b/doc/src/images/designer-dialog-final.png
new file mode 100644
index 0000000..0a75670
--- /dev/null
+++ b/doc/src/images/designer-dialog-final.png
Binary files differ
diff --git a/doc/src/images/designer-dialog-initial.png b/doc/src/images/designer-dialog-initial.png
new file mode 100644
index 0000000..a2ebbf0
--- /dev/null
+++ b/doc/src/images/designer-dialog-initial.png
Binary files differ
diff --git a/doc/src/images/designer-dialog-layout.png b/doc/src/images/designer-dialog-layout.png
new file mode 100644
index 0000000..bae945d
--- /dev/null
+++ b/doc/src/images/designer-dialog-layout.png
Binary files differ
diff --git a/doc/src/images/designer-dialog-preview.png b/doc/src/images/designer-dialog-preview.png
new file mode 100644
index 0000000..1059aea
--- /dev/null
+++ b/doc/src/images/designer-dialog-preview.png
Binary files differ
diff --git a/doc/src/images/designer-disambiguation.png b/doc/src/images/designer-disambiguation.png
new file mode 100644
index 0000000..364e70d
--- /dev/null
+++ b/doc/src/images/designer-disambiguation.png
Binary files differ
diff --git a/doc/src/images/designer-dragging-onto-form.png b/doc/src/images/designer-dragging-onto-form.png
new file mode 100644
index 0000000..07b4393
--- /dev/null
+++ b/doc/src/images/designer-dragging-onto-form.png
Binary files differ
diff --git a/doc/src/images/designer-edit-resource.png b/doc/src/images/designer-edit-resource.png
new file mode 100644
index 0000000..390087c
--- /dev/null
+++ b/doc/src/images/designer-edit-resource.png
Binary files differ
diff --git a/doc/src/images/designer-edit-resources-button.png b/doc/src/images/designer-edit-resources-button.png
new file mode 100644
index 0000000..1697836
--- /dev/null
+++ b/doc/src/images/designer-edit-resources-button.png
Binary files differ
diff --git a/doc/src/images/designer-editing-mode.png b/doc/src/images/designer-editing-mode.png
new file mode 100644
index 0000000..cd1c802
--- /dev/null
+++ b/doc/src/images/designer-editing-mode.png
Binary files differ
diff --git a/doc/src/images/designer-embedded-preview.png b/doc/src/images/designer-embedded-preview.png
new file mode 100644
index 0000000..afa6faf
--- /dev/null
+++ b/doc/src/images/designer-embedded-preview.png
Binary files differ
diff --git a/doc/src/images/designer-english-dialog.png b/doc/src/images/designer-english-dialog.png
new file mode 100644
index 0000000..591d971
--- /dev/null
+++ b/doc/src/images/designer-english-dialog.png
Binary files differ
diff --git a/doc/src/images/designer-examples.png b/doc/src/images/designer-examples.png
new file mode 100644
index 0000000..36e54f9
--- /dev/null
+++ b/doc/src/images/designer-examples.png
Binary files differ
diff --git a/doc/src/images/designer-file-menu.png b/doc/src/images/designer-file-menu.png
new file mode 100644
index 0000000..ae65f04
--- /dev/null
+++ b/doc/src/images/designer-file-menu.png
Binary files differ
diff --git a/doc/src/images/designer-find-icon.png b/doc/src/images/designer-find-icon.png
new file mode 100644
index 0000000..aa84bad
--- /dev/null
+++ b/doc/src/images/designer-find-icon.png
Binary files differ
diff --git a/doc/src/images/designer-form-layout-cleanlooks.png b/doc/src/images/designer-form-layout-cleanlooks.png
new file mode 100644
index 0000000..13d5674
--- /dev/null
+++ b/doc/src/images/designer-form-layout-cleanlooks.png
Binary files differ
diff --git a/doc/src/images/designer-form-layout-macintosh.png b/doc/src/images/designer-form-layout-macintosh.png
new file mode 100644
index 0000000..ead3069
--- /dev/null
+++ b/doc/src/images/designer-form-layout-macintosh.png
Binary files differ
diff --git a/doc/src/images/designer-form-layout-windowsXP.png b/doc/src/images/designer-form-layout-windowsXP.png
new file mode 100644
index 0000000..8389986
--- /dev/null
+++ b/doc/src/images/designer-form-layout-windowsXP.png
Binary files differ
diff --git a/doc/src/images/designer-form-layout.png b/doc/src/images/designer-form-layout.png
new file mode 100644
index 0000000..3fb5747
--- /dev/null
+++ b/doc/src/images/designer-form-layout.png
Binary files differ
diff --git a/doc/src/images/designer-form-layoutfunction.png b/doc/src/images/designer-form-layoutfunction.png
new file mode 100644
index 0000000..0c25605
--- /dev/null
+++ b/doc/src/images/designer-form-layoutfunction.png
Binary files differ
diff --git a/doc/src/images/designer-form-settings.png b/doc/src/images/designer-form-settings.png
new file mode 100644
index 0000000..522a978
--- /dev/null
+++ b/doc/src/images/designer-form-settings.png
Binary files differ
diff --git a/doc/src/images/designer-form-viewcode.png b/doc/src/images/designer-form-viewcode.png
new file mode 100644
index 0000000..d79fedd
--- /dev/null
+++ b/doc/src/images/designer-form-viewcode.png
Binary files differ
diff --git a/doc/src/images/designer-french-dialog.png b/doc/src/images/designer-french-dialog.png
new file mode 100644
index 0000000..f76a6e9
--- /dev/null
+++ b/doc/src/images/designer-french-dialog.png
Binary files differ
diff --git a/doc/src/images/designer-getting-started.png b/doc/src/images/designer-getting-started.png
new file mode 100644
index 0000000..7daea6c
--- /dev/null
+++ b/doc/src/images/designer-getting-started.png
Binary files differ
diff --git a/doc/src/images/designer-layout-inserting.png b/doc/src/images/designer-layout-inserting.png
new file mode 100644
index 0000000..2c3a8ce
--- /dev/null
+++ b/doc/src/images/designer-layout-inserting.png
Binary files differ
diff --git a/doc/src/images/designer-main-window.png b/doc/src/images/designer-main-window.png
new file mode 100644
index 0000000..99a6592
--- /dev/null
+++ b/doc/src/images/designer-main-window.png
Binary files differ
diff --git a/doc/src/images/designer-making-connection.png b/doc/src/images/designer-making-connection.png
new file mode 100644
index 0000000..b311536
--- /dev/null
+++ b/doc/src/images/designer-making-connection.png
Binary files differ
diff --git a/doc/src/images/designer-manual-containerextension.png b/doc/src/images/designer-manual-containerextension.png
new file mode 100644
index 0000000..1a82251
--- /dev/null
+++ b/doc/src/images/designer-manual-containerextension.png
Binary files differ
diff --git a/doc/src/images/designer-manual-membersheetextension.png b/doc/src/images/designer-manual-membersheetextension.png
new file mode 100644
index 0000000..7634d63
--- /dev/null
+++ b/doc/src/images/designer-manual-membersheetextension.png
Binary files differ
diff --git a/doc/src/images/designer-manual-propertysheetextension.png b/doc/src/images/designer-manual-propertysheetextension.png
new file mode 100644
index 0000000..a8d2d42
--- /dev/null
+++ b/doc/src/images/designer-manual-propertysheetextension.png
Binary files differ
diff --git a/doc/src/images/designer-manual-taskmenuextension.png b/doc/src/images/designer-manual-taskmenuextension.png
new file mode 100644
index 0000000..cf949bc
--- /dev/null
+++ b/doc/src/images/designer-manual-taskmenuextension.png
Binary files differ
diff --git a/doc/src/images/designer-multiple-screenshot.png b/doc/src/images/designer-multiple-screenshot.png
new file mode 100644
index 0000000..1531903
--- /dev/null
+++ b/doc/src/images/designer-multiple-screenshot.png
Binary files differ
diff --git a/doc/src/images/designer-object-inspector.png b/doc/src/images/designer-object-inspector.png
new file mode 100644
index 0000000..c7f3180
--- /dev/null
+++ b/doc/src/images/designer-object-inspector.png
Binary files differ
diff --git a/doc/src/images/designer-palette-brush-editor.png b/doc/src/images/designer-palette-brush-editor.png
new file mode 100644
index 0000000..b4a9e0f
--- /dev/null
+++ b/doc/src/images/designer-palette-brush-editor.png
Binary files differ
diff --git a/doc/src/images/designer-palette-editor.png b/doc/src/images/designer-palette-editor.png
new file mode 100644
index 0000000..7333abe
--- /dev/null
+++ b/doc/src/images/designer-palette-editor.png
Binary files differ
diff --git a/doc/src/images/designer-palette-gradient-editor.png b/doc/src/images/designer-palette-gradient-editor.png
new file mode 100644
index 0000000..d4b4d66
--- /dev/null
+++ b/doc/src/images/designer-palette-gradient-editor.png
Binary files differ
diff --git a/doc/src/images/designer-palette-pattern-editor.png b/doc/src/images/designer-palette-pattern-editor.png
new file mode 100644
index 0000000..8117e0e
--- /dev/null
+++ b/doc/src/images/designer-palette-pattern-editor.png
Binary files differ
diff --git a/doc/src/images/designer-preview-device-skin.png b/doc/src/images/designer-preview-device-skin.png
new file mode 100644
index 0000000..5fc7836
--- /dev/null
+++ b/doc/src/images/designer-preview-device-skin.png
Binary files differ
diff --git a/doc/src/images/designer-preview-deviceskin-selection.png b/doc/src/images/designer-preview-deviceskin-selection.png
new file mode 100644
index 0000000..3b6aec4
--- /dev/null
+++ b/doc/src/images/designer-preview-deviceskin-selection.png
Binary files differ
diff --git a/doc/src/images/designer-preview-style-selection.png b/doc/src/images/designer-preview-style-selection.png
new file mode 100644
index 0000000..e64cf6e
--- /dev/null
+++ b/doc/src/images/designer-preview-style-selection.png
Binary files differ
diff --git a/doc/src/images/designer-preview-style.png b/doc/src/images/designer-preview-style.png
new file mode 100644
index 0000000..54a243a
--- /dev/null
+++ b/doc/src/images/designer-preview-style.png
Binary files differ
diff --git a/doc/src/images/designer-preview-stylesheet.png b/doc/src/images/designer-preview-stylesheet.png
new file mode 100644
index 0000000..ef9ef4f
--- /dev/null
+++ b/doc/src/images/designer-preview-stylesheet.png
Binary files differ
diff --git a/doc/src/images/designer-promoting-widgets.png b/doc/src/images/designer-promoting-widgets.png
new file mode 100644
index 0000000..2377560
--- /dev/null
+++ b/doc/src/images/designer-promoting-widgets.png
Binary files differ
diff --git a/doc/src/images/designer-property-editor-add-dynamic.png b/doc/src/images/designer-property-editor-add-dynamic.png
new file mode 100644
index 0000000..c7f4cf1
--- /dev/null
+++ b/doc/src/images/designer-property-editor-add-dynamic.png
Binary files differ
diff --git a/doc/src/images/designer-property-editor-configure.png b/doc/src/images/designer-property-editor-configure.png
new file mode 100644
index 0000000..2a96fe3
--- /dev/null
+++ b/doc/src/images/designer-property-editor-configure.png
Binary files differ
diff --git a/doc/src/images/designer-property-editor-link.png b/doc/src/images/designer-property-editor-link.png
new file mode 100644
index 0000000..e43a530
--- /dev/null
+++ b/doc/src/images/designer-property-editor-link.png
Binary files differ
diff --git a/doc/src/images/designer-property-editor-remove-dynamic.png b/doc/src/images/designer-property-editor-remove-dynamic.png
new file mode 100644
index 0000000..cb6ccaa
--- /dev/null
+++ b/doc/src/images/designer-property-editor-remove-dynamic.png
Binary files differ
diff --git a/doc/src/images/designer-property-editor-toolbar.png b/doc/src/images/designer-property-editor-toolbar.png
new file mode 100644
index 0000000..ae6345e
--- /dev/null
+++ b/doc/src/images/designer-property-editor-toolbar.png
Binary files differ
diff --git a/doc/src/images/designer-property-editor.png b/doc/src/images/designer-property-editor.png
new file mode 100644
index 0000000..fad2309
--- /dev/null
+++ b/doc/src/images/designer-property-editor.png
Binary files differ
diff --git a/doc/src/images/designer-reload-resources-button.png b/doc/src/images/designer-reload-resources-button.png
new file mode 100644
index 0000000..c101e76
--- /dev/null
+++ b/doc/src/images/designer-reload-resources-button.png
Binary files differ
diff --git a/doc/src/images/designer-remove-custom-toolbar.png b/doc/src/images/designer-remove-custom-toolbar.png
new file mode 100644
index 0000000..3fecfc2
--- /dev/null
+++ b/doc/src/images/designer-remove-custom-toolbar.png
Binary files differ
diff --git a/doc/src/images/designer-remove-resource-entry-button.png b/doc/src/images/designer-remove-resource-entry-button.png
new file mode 100644
index 0000000..aa3b9d6
--- /dev/null
+++ b/doc/src/images/designer-remove-resource-entry-button.png
Binary files differ
diff --git a/doc/src/images/designer-resource-browser.png b/doc/src/images/designer-resource-browser.png
new file mode 100644
index 0000000..213a58b
--- /dev/null
+++ b/doc/src/images/designer-resource-browser.png
Binary files differ
diff --git a/doc/src/images/designer-resource-selector.png b/doc/src/images/designer-resource-selector.png
new file mode 100644
index 0000000..31a4cb1
--- /dev/null
+++ b/doc/src/images/designer-resource-selector.png
Binary files differ
diff --git a/doc/src/images/designer-resource-tool.png b/doc/src/images/designer-resource-tool.png
new file mode 100644
index 0000000..7ef511c
--- /dev/null
+++ b/doc/src/images/designer-resource-tool.png
Binary files differ
diff --git a/doc/src/images/designer-resources-adding.png b/doc/src/images/designer-resources-adding.png
new file mode 100644
index 0000000..a417bbd
--- /dev/null
+++ b/doc/src/images/designer-resources-adding.png
Binary files differ
diff --git a/doc/src/images/designer-resources-editing.png b/doc/src/images/designer-resources-editing.png
new file mode 100644
index 0000000..6b8aee7
--- /dev/null
+++ b/doc/src/images/designer-resources-editing.png
Binary files differ
diff --git a/doc/src/images/designer-resources-empty.png b/doc/src/images/designer-resources-empty.png
new file mode 100644
index 0000000..47a45d0
--- /dev/null
+++ b/doc/src/images/designer-resources-empty.png
Binary files differ
diff --git a/doc/src/images/designer-resources-using.png b/doc/src/images/designer-resources-using.png
new file mode 100644
index 0000000..4ce9ca2
--- /dev/null
+++ b/doc/src/images/designer-resources-using.png
Binary files differ
diff --git a/doc/src/images/designer-screenshot-small.png b/doc/src/images/designer-screenshot-small.png
new file mode 100644
index 0000000..ad4096b
--- /dev/null
+++ b/doc/src/images/designer-screenshot-small.png
Binary files differ
diff --git a/doc/src/images/designer-screenshot.png b/doc/src/images/designer-screenshot.png
new file mode 100644
index 0000000..1700b06
--- /dev/null
+++ b/doc/src/images/designer-screenshot.png
Binary files differ
diff --git a/doc/src/images/designer-selecting-widget.png b/doc/src/images/designer-selecting-widget.png
new file mode 100644
index 0000000..a358d30
--- /dev/null
+++ b/doc/src/images/designer-selecting-widget.png
Binary files differ
diff --git a/doc/src/images/designer-selecting-widgets.png b/doc/src/images/designer-selecting-widgets.png
new file mode 100644
index 0000000..93d315f
--- /dev/null
+++ b/doc/src/images/designer-selecting-widgets.png
Binary files differ
diff --git a/doc/src/images/designer-set-layout.png b/doc/src/images/designer-set-layout.png
new file mode 100644
index 0000000..86b4ecc
--- /dev/null
+++ b/doc/src/images/designer-set-layout.png
Binary files differ
diff --git a/doc/src/images/designer-set-layout2.png b/doc/src/images/designer-set-layout2.png
new file mode 100644
index 0000000..e93f4dc
--- /dev/null
+++ b/doc/src/images/designer-set-layout2.png
Binary files differ
diff --git a/doc/src/images/designer-splitter-layout.png b/doc/src/images/designer-splitter-layout.png
new file mode 100644
index 0000000..2646c28
--- /dev/null
+++ b/doc/src/images/designer-splitter-layout.png
Binary files differ
diff --git a/doc/src/images/designer-stylesheet-options.png b/doc/src/images/designer-stylesheet-options.png
new file mode 100644
index 0000000..a6893e7
--- /dev/null
+++ b/doc/src/images/designer-stylesheet-options.png
Binary files differ
diff --git a/doc/src/images/designer-stylesheet-usage.png b/doc/src/images/designer-stylesheet-usage.png
new file mode 100644
index 0000000..f687590
--- /dev/null
+++ b/doc/src/images/designer-stylesheet-usage.png
Binary files differ
diff --git a/doc/src/images/designer-tab-order-mode.png b/doc/src/images/designer-tab-order-mode.png
new file mode 100644
index 0000000..8135f3b
--- /dev/null
+++ b/doc/src/images/designer-tab-order-mode.png
Binary files differ
diff --git a/doc/src/images/designer-tab-order-tool.png b/doc/src/images/designer-tab-order-tool.png
new file mode 100644
index 0000000..f54faf9
--- /dev/null
+++ b/doc/src/images/designer-tab-order-tool.png
Binary files differ
diff --git a/doc/src/images/designer-validator-highlighter.png b/doc/src/images/designer-validator-highlighter.png
new file mode 100644
index 0000000..a6661d5
--- /dev/null
+++ b/doc/src/images/designer-validator-highlighter.png
Binary files differ
diff --git a/doc/src/images/designer-widget-box.png b/doc/src/images/designer-widget-box.png
new file mode 100644
index 0000000..bfbc5b7
--- /dev/null
+++ b/doc/src/images/designer-widget-box.png
Binary files differ
diff --git a/doc/src/images/designer-widget-filter.png b/doc/src/images/designer-widget-filter.png
new file mode 100644
index 0000000..ac13a0a
--- /dev/null
+++ b/doc/src/images/designer-widget-filter.png
Binary files differ
diff --git a/doc/src/images/designer-widget-final.png b/doc/src/images/designer-widget-final.png
new file mode 100644
index 0000000..f8acd9f
--- /dev/null
+++ b/doc/src/images/designer-widget-final.png
Binary files differ
diff --git a/doc/src/images/designer-widget-initial.png b/doc/src/images/designer-widget-initial.png
new file mode 100644
index 0000000..d564fbe
--- /dev/null
+++ b/doc/src/images/designer-widget-initial.png
Binary files differ
diff --git a/doc/src/images/designer-widget-layout.png b/doc/src/images/designer-widget-layout.png
new file mode 100644
index 0000000..4788170
--- /dev/null
+++ b/doc/src/images/designer-widget-layout.png
Binary files differ
diff --git a/doc/src/images/designer-widget-morph.png b/doc/src/images/designer-widget-morph.png
new file mode 100644
index 0000000..974bc0e
--- /dev/null
+++ b/doc/src/images/designer-widget-morph.png
Binary files differ
diff --git a/doc/src/images/designer-widget-preview.png b/doc/src/images/designer-widget-preview.png
new file mode 100644
index 0000000..e456564
--- /dev/null
+++ b/doc/src/images/designer-widget-preview.png
Binary files differ
diff --git a/doc/src/images/designer-widget-tool.png b/doc/src/images/designer-widget-tool.png
new file mode 100644
index 0000000..e1aa353
--- /dev/null
+++ b/doc/src/images/designer-widget-tool.png
Binary files differ
diff --git a/doc/src/images/desktop-examples.png b/doc/src/images/desktop-examples.png
new file mode 100644
index 0000000..86b16b4
--- /dev/null
+++ b/doc/src/images/desktop-examples.png
Binary files differ
diff --git a/doc/src/images/diagonalGradient.png b/doc/src/images/diagonalGradient.png
new file mode 100644
index 0000000..623d362
--- /dev/null
+++ b/doc/src/images/diagonalGradient.png
Binary files differ
diff --git a/doc/src/images/diagramscene.png b/doc/src/images/diagramscene.png
new file mode 100644
index 0000000..c84fc81
--- /dev/null
+++ b/doc/src/images/diagramscene.png
Binary files differ
diff --git a/doc/src/images/dialog-examples.png b/doc/src/images/dialog-examples.png
new file mode 100644
index 0000000..26537b5
--- /dev/null
+++ b/doc/src/images/dialog-examples.png
Binary files differ
diff --git a/doc/src/images/dialogbuttonboxexample.png b/doc/src/images/dialogbuttonboxexample.png
new file mode 100644
index 0000000..baa62d3
--- /dev/null
+++ b/doc/src/images/dialogbuttonboxexample.png
Binary files differ
diff --git a/doc/src/images/dialogs-examples.png b/doc/src/images/dialogs-examples.png
new file mode 100644
index 0000000..45bf0ab
--- /dev/null
+++ b/doc/src/images/dialogs-examples.png
Binary files differ
diff --git a/doc/src/images/digitalclock-example.png b/doc/src/images/digitalclock-example.png
new file mode 100644
index 0000000..4739866
--- /dev/null
+++ b/doc/src/images/digitalclock-example.png
Binary files differ
diff --git a/doc/src/images/directapproach-calculatorform.png b/doc/src/images/directapproach-calculatorform.png
new file mode 100644
index 0000000..2b87ed1
--- /dev/null
+++ b/doc/src/images/directapproach-calculatorform.png
Binary files differ
diff --git a/doc/src/images/dirview-example.png b/doc/src/images/dirview-example.png
new file mode 100644
index 0000000..6412ead
--- /dev/null
+++ b/doc/src/images/dirview-example.png
Binary files differ
diff --git a/doc/src/images/dockwidget-cross.png b/doc/src/images/dockwidget-cross.png
new file mode 100644
index 0000000..35db6a2
--- /dev/null
+++ b/doc/src/images/dockwidget-cross.png
Binary files differ
diff --git a/doc/src/images/dockwidget-neighbors.png b/doc/src/images/dockwidget-neighbors.png
new file mode 100644
index 0000000..d299ce6
--- /dev/null
+++ b/doc/src/images/dockwidget-neighbors.png
Binary files differ
diff --git a/doc/src/images/dockwidgets-example.png b/doc/src/images/dockwidgets-example.png
new file mode 100644
index 0000000..2a2d6f8
--- /dev/null
+++ b/doc/src/images/dockwidgets-example.png
Binary files differ
diff --git a/doc/src/images/dombookmarks-example.png b/doc/src/images/dombookmarks-example.png
new file mode 100644
index 0000000..abacacb
--- /dev/null
+++ b/doc/src/images/dombookmarks-example.png
Binary files differ
diff --git a/doc/src/images/draganddrop-examples.png b/doc/src/images/draganddrop-examples.png
new file mode 100644
index 0000000..89d9e50
--- /dev/null
+++ b/doc/src/images/draganddrop-examples.png
Binary files differ
diff --git a/doc/src/images/draganddroppuzzle-example.png b/doc/src/images/draganddroppuzzle-example.png
new file mode 100644
index 0000000..8122782
--- /dev/null
+++ b/doc/src/images/draganddroppuzzle-example.png
Binary files differ
diff --git a/doc/src/images/dragdroprobot-example.png b/doc/src/images/dragdroprobot-example.png
new file mode 100644
index 0000000..53aae77
--- /dev/null
+++ b/doc/src/images/dragdroprobot-example.png
Binary files differ
diff --git a/doc/src/images/draggableicons-example.png b/doc/src/images/draggableicons-example.png
new file mode 100644
index 0000000..003ce13
--- /dev/null
+++ b/doc/src/images/draggableicons-example.png
Binary files differ
diff --git a/doc/src/images/draggabletext-example.png b/doc/src/images/draggabletext-example.png
new file mode 100644
index 0000000..f9b2281
--- /dev/null
+++ b/doc/src/images/draggabletext-example.png
Binary files differ
diff --git a/doc/src/images/draw_arc.png b/doc/src/images/draw_arc.png
new file mode 100644
index 0000000..6e72108
--- /dev/null
+++ b/doc/src/images/draw_arc.png
Binary files differ
diff --git a/doc/src/images/draw_chord.png b/doc/src/images/draw_chord.png
new file mode 100644
index 0000000..4d4ab50
--- /dev/null
+++ b/doc/src/images/draw_chord.png
Binary files differ
diff --git a/doc/src/images/drilldown-example.png b/doc/src/images/drilldown-example.png
new file mode 100644
index 0000000..68353f7
--- /dev/null
+++ b/doc/src/images/drilldown-example.png
Binary files differ
diff --git a/doc/src/images/dropsite-example.png b/doc/src/images/dropsite-example.png
new file mode 100644
index 0000000..42b988d
--- /dev/null
+++ b/doc/src/images/dropsite-example.png
Binary files differ
diff --git a/doc/src/images/dynamiclayouts-example.png b/doc/src/images/dynamiclayouts-example.png
new file mode 100644
index 0000000..65d8150
--- /dev/null
+++ b/doc/src/images/dynamiclayouts-example.png
Binary files differ
diff --git a/doc/src/images/echopluginexample.png b/doc/src/images/echopluginexample.png
new file mode 100644
index 0000000..7cb1e4d
--- /dev/null
+++ b/doc/src/images/echopluginexample.png
Binary files differ
diff --git a/doc/src/images/effectwidget.png b/doc/src/images/effectwidget.png
new file mode 100644
index 0000000..d4a0fc4
--- /dev/null
+++ b/doc/src/images/effectwidget.png
Binary files differ
diff --git a/doc/src/images/elasticnodes-example.png b/doc/src/images/elasticnodes-example.png
new file mode 100644
index 0000000..840f74fe
--- /dev/null
+++ b/doc/src/images/elasticnodes-example.png
Binary files differ
diff --git a/doc/src/images/embedded-demo-launcher.png b/doc/src/images/embedded-demo-launcher.png
new file mode 100644
index 0000000..deafc7b
--- /dev/null
+++ b/doc/src/images/embedded-demo-launcher.png
Binary files differ
diff --git a/doc/src/images/embedded-simpledecoration-example-styles.png b/doc/src/images/embedded-simpledecoration-example-styles.png
new file mode 100644
index 0000000..b2ad83c
--- /dev/null
+++ b/doc/src/images/embedded-simpledecoration-example-styles.png
Binary files differ
diff --git a/doc/src/images/embedded-simpledecoration-example.png b/doc/src/images/embedded-simpledecoration-example.png
new file mode 100644
index 0000000..bfd0450
--- /dev/null
+++ b/doc/src/images/embedded-simpledecoration-example.png
Binary files differ
diff --git a/doc/src/images/embeddeddialogs-demo.png b/doc/src/images/embeddeddialogs-demo.png
new file mode 100644
index 0000000..d0da4b6
--- /dev/null
+++ b/doc/src/images/embeddeddialogs-demo.png
Binary files differ
diff --git a/doc/src/images/extension-example.png b/doc/src/images/extension-example.png
new file mode 100644
index 0000000..dfaacc0
--- /dev/null
+++ b/doc/src/images/extension-example.png
Binary files differ
diff --git a/doc/src/images/extension_more.png b/doc/src/images/extension_more.png
new file mode 100644
index 0000000..2b06809
--- /dev/null
+++ b/doc/src/images/extension_more.png
Binary files differ
diff --git a/doc/src/images/fetchmore-example.png b/doc/src/images/fetchmore-example.png
new file mode 100644
index 0000000..d2359dc
--- /dev/null
+++ b/doc/src/images/fetchmore-example.png
Binary files differ
diff --git a/doc/src/images/filedialogurls.png b/doc/src/images/filedialogurls.png
new file mode 100644
index 0000000..7d22ef3
--- /dev/null
+++ b/doc/src/images/filedialogurls.png
Binary files differ
diff --git a/doc/src/images/filetree_1-example.png b/doc/src/images/filetree_1-example.png
new file mode 100644
index 0000000..7e19174
--- /dev/null
+++ b/doc/src/images/filetree_1-example.png
Binary files differ
diff --git a/doc/src/images/filetree_2-example.png b/doc/src/images/filetree_2-example.png
new file mode 100644
index 0000000..cb794c5
--- /dev/null
+++ b/doc/src/images/filetree_2-example.png
Binary files differ
diff --git a/doc/src/images/findfiles-example.png b/doc/src/images/findfiles-example.png
new file mode 100644
index 0000000..acb5ea1
--- /dev/null
+++ b/doc/src/images/findfiles-example.png
Binary files differ
diff --git a/doc/src/images/findfiles_progress_dialog.png b/doc/src/images/findfiles_progress_dialog.png
new file mode 100644
index 0000000..05eda2c
--- /dev/null
+++ b/doc/src/images/findfiles_progress_dialog.png
Binary files differ
diff --git a/doc/src/images/flowlayout-example.png b/doc/src/images/flowlayout-example.png
new file mode 100644
index 0000000..27660d6
--- /dev/null
+++ b/doc/src/images/flowlayout-example.png
Binary files differ
diff --git a/doc/src/images/fontsampler-example.png b/doc/src/images/fontsampler-example.png
new file mode 100644
index 0000000..7df4a50
--- /dev/null
+++ b/doc/src/images/fontsampler-example.png
Binary files differ
diff --git a/doc/src/images/foreignkeys.png b/doc/src/images/foreignkeys.png
new file mode 100644
index 0000000..7a6a19b
--- /dev/null
+++ b/doc/src/images/foreignkeys.png
Binary files differ
diff --git a/doc/src/images/formextractor-example.png b/doc/src/images/formextractor-example.png
new file mode 100644
index 0000000..155cdaa
--- /dev/null
+++ b/doc/src/images/formextractor-example.png
Binary files differ
diff --git a/doc/src/images/fortuneclient-example.png b/doc/src/images/fortuneclient-example.png
new file mode 100644
index 0000000..b34a987
--- /dev/null
+++ b/doc/src/images/fortuneclient-example.png
Binary files differ
diff --git a/doc/src/images/fortuneserver-example.png b/doc/src/images/fortuneserver-example.png
new file mode 100644
index 0000000..73f27d5
--- /dev/null
+++ b/doc/src/images/fortuneserver-example.png
Binary files differ
diff --git a/doc/src/images/framebufferobject-example.png b/doc/src/images/framebufferobject-example.png
new file mode 100644
index 0000000..df9b6db
--- /dev/null
+++ b/doc/src/images/framebufferobject-example.png
Binary files differ
diff --git a/doc/src/images/framebufferobject2-example.png b/doc/src/images/framebufferobject2-example.png
new file mode 100644
index 0000000..bafb05a
--- /dev/null
+++ b/doc/src/images/framebufferobject2-example.png
Binary files differ
diff --git a/doc/src/images/frames.png b/doc/src/images/frames.png
new file mode 100644
index 0000000..13c0850
--- /dev/null
+++ b/doc/src/images/frames.png
Binary files differ
diff --git a/doc/src/images/fridgemagnets-example.png b/doc/src/images/fridgemagnets-example.png
new file mode 100644
index 0000000..9adb572
--- /dev/null
+++ b/doc/src/images/fridgemagnets-example.png
Binary files differ
diff --git a/doc/src/images/ftp-example.png b/doc/src/images/ftp-example.png
new file mode 100644
index 0000000..504c658
--- /dev/null
+++ b/doc/src/images/ftp-example.png
Binary files differ
diff --git a/doc/src/images/geometry.png b/doc/src/images/geometry.png
new file mode 100644
index 0000000..c69e11d
--- /dev/null
+++ b/doc/src/images/geometry.png
Binary files differ
diff --git a/doc/src/images/grabber-example.png b/doc/src/images/grabber-example.png
new file mode 100644
index 0000000..6a05b94
--- /dev/null
+++ b/doc/src/images/grabber-example.png
Binary files differ
diff --git a/doc/src/images/gradientText.png b/doc/src/images/gradientText.png
new file mode 100644
index 0000000..9ee7164
--- /dev/null
+++ b/doc/src/images/gradientText.png
Binary files differ
diff --git a/doc/src/images/gradients-demo.png b/doc/src/images/gradients-demo.png
new file mode 100644
index 0000000..d80708e
--- /dev/null
+++ b/doc/src/images/gradients-demo.png
Binary files differ
diff --git a/doc/src/images/graphicsview-ellipseitem-pie.png b/doc/src/images/graphicsview-ellipseitem-pie.png
new file mode 100644
index 0000000..136175a
--- /dev/null
+++ b/doc/src/images/graphicsview-ellipseitem-pie.png
Binary files differ
diff --git a/doc/src/images/graphicsview-ellipseitem.png b/doc/src/images/graphicsview-ellipseitem.png
new file mode 100644
index 0000000..7c7a8e5
--- /dev/null
+++ b/doc/src/images/graphicsview-ellipseitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-examples.png b/doc/src/images/graphicsview-examples.png
new file mode 100644
index 0000000..b58bdc3
--- /dev/null
+++ b/doc/src/images/graphicsview-examples.png
Binary files differ
diff --git a/doc/src/images/graphicsview-items.png b/doc/src/images/graphicsview-items.png
new file mode 100644
index 0000000..73be2dd
--- /dev/null
+++ b/doc/src/images/graphicsview-items.png
Binary files differ
diff --git a/doc/src/images/graphicsview-lineitem.png b/doc/src/images/graphicsview-lineitem.png
new file mode 100644
index 0000000..952a3c2
--- /dev/null
+++ b/doc/src/images/graphicsview-lineitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-map.png b/doc/src/images/graphicsview-map.png
new file mode 100644
index 0000000..e7f5ac6
--- /dev/null
+++ b/doc/src/images/graphicsview-map.png
Binary files differ
diff --git a/doc/src/images/graphicsview-parentchild.png b/doc/src/images/graphicsview-parentchild.png
new file mode 100644
index 0000000..0fc2dbf
--- /dev/null
+++ b/doc/src/images/graphicsview-parentchild.png
Binary files differ
diff --git a/doc/src/images/graphicsview-pathitem.png b/doc/src/images/graphicsview-pathitem.png
new file mode 100644
index 0000000..c1ddd56
--- /dev/null
+++ b/doc/src/images/graphicsview-pathitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-pixmapitem.png b/doc/src/images/graphicsview-pixmapitem.png
new file mode 100644
index 0000000..d14fac5
--- /dev/null
+++ b/doc/src/images/graphicsview-pixmapitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-polygonitem.png b/doc/src/images/graphicsview-polygonitem.png
new file mode 100644
index 0000000..3cd2232
--- /dev/null
+++ b/doc/src/images/graphicsview-polygonitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-rectitem.png b/doc/src/images/graphicsview-rectitem.png
new file mode 100644
index 0000000..a5917e5
--- /dev/null
+++ b/doc/src/images/graphicsview-rectitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-shapes.png b/doc/src/images/graphicsview-shapes.png
new file mode 100644
index 0000000..466eb33
--- /dev/null
+++ b/doc/src/images/graphicsview-shapes.png
Binary files differ
diff --git a/doc/src/images/graphicsview-simpletextitem.png b/doc/src/images/graphicsview-simpletextitem.png
new file mode 100644
index 0000000..908d67f
--- /dev/null
+++ b/doc/src/images/graphicsview-simpletextitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-text.png b/doc/src/images/graphicsview-text.png
new file mode 100644
index 0000000..e7441df
--- /dev/null
+++ b/doc/src/images/graphicsview-text.png
Binary files differ
diff --git a/doc/src/images/graphicsview-textitem.png b/doc/src/images/graphicsview-textitem.png
new file mode 100644
index 0000000..f1ae3c0
--- /dev/null
+++ b/doc/src/images/graphicsview-textitem.png
Binary files differ
diff --git a/doc/src/images/graphicsview-view.png b/doc/src/images/graphicsview-view.png
new file mode 100644
index 0000000..212195f
--- /dev/null
+++ b/doc/src/images/graphicsview-view.png
Binary files differ
diff --git a/doc/src/images/graphicsview-zorder.png b/doc/src/images/graphicsview-zorder.png
new file mode 100644
index 0000000..a1cc3d0
--- /dev/null
+++ b/doc/src/images/graphicsview-zorder.png
Binary files differ
diff --git a/doc/src/images/gridlayout.png b/doc/src/images/gridlayout.png
new file mode 100644
index 0000000..ae76c04
--- /dev/null
+++ b/doc/src/images/gridlayout.png
Binary files differ
diff --git a/doc/src/images/groupbox-example.png b/doc/src/images/groupbox-example.png
new file mode 100644
index 0000000..443f812
--- /dev/null
+++ b/doc/src/images/groupbox-example.png
Binary files differ
diff --git a/doc/src/images/gtk-calendarwidget.png b/doc/src/images/gtk-calendarwidget.png
new file mode 100644
index 0000000..568cd1a
--- /dev/null
+++ b/doc/src/images/gtk-calendarwidget.png
Binary files differ
diff --git a/doc/src/images/gtk-checkbox.png b/doc/src/images/gtk-checkbox.png
new file mode 100644
index 0000000..1fd5fc7
--- /dev/null
+++ b/doc/src/images/gtk-checkbox.png
Binary files differ
diff --git a/doc/src/images/gtk-columnview.png b/doc/src/images/gtk-columnview.png
new file mode 100644
index 0000000..548ce8b
--- /dev/null
+++ b/doc/src/images/gtk-columnview.png
Binary files differ
diff --git a/doc/src/images/gtk-combobox.png b/doc/src/images/gtk-combobox.png
new file mode 100644
index 0000000..3b4544d
--- /dev/null
+++ b/doc/src/images/gtk-combobox.png
Binary files differ
diff --git a/doc/src/images/gtk-dateedit.png b/doc/src/images/gtk-dateedit.png
new file mode 100644
index 0000000..25229f0
--- /dev/null
+++ b/doc/src/images/gtk-dateedit.png
Binary files differ
diff --git a/doc/src/images/gtk-datetimeedit.png b/doc/src/images/gtk-datetimeedit.png
new file mode 100644
index 0000000..0c934a4
--- /dev/null
+++ b/doc/src/images/gtk-datetimeedit.png
Binary files differ
diff --git a/doc/src/images/gtk-dial.png b/doc/src/images/gtk-dial.png
new file mode 100644
index 0000000..18e14b3
--- /dev/null
+++ b/doc/src/images/gtk-dial.png
Binary files differ
diff --git a/doc/src/images/gtk-doublespinbox.png b/doc/src/images/gtk-doublespinbox.png
new file mode 100644
index 0000000..3a69043
--- /dev/null
+++ b/doc/src/images/gtk-doublespinbox.png
Binary files differ
diff --git a/doc/src/images/gtk-fontcombobox.png b/doc/src/images/gtk-fontcombobox.png
new file mode 100644
index 0000000..4cb1bc1
--- /dev/null
+++ b/doc/src/images/gtk-fontcombobox.png
Binary files differ
diff --git a/doc/src/images/gtk-frame.png b/doc/src/images/gtk-frame.png
new file mode 100644
index 0000000..c1bf52f
--- /dev/null
+++ b/doc/src/images/gtk-frame.png
Binary files differ
diff --git a/doc/src/images/gtk-groupbox.png b/doc/src/images/gtk-groupbox.png
new file mode 100644
index 0000000..6d217c8
--- /dev/null
+++ b/doc/src/images/gtk-groupbox.png
Binary files differ
diff --git a/doc/src/images/gtk-horizontalscrollbar.png b/doc/src/images/gtk-horizontalscrollbar.png
new file mode 100644
index 0000000..2887730
--- /dev/null
+++ b/doc/src/images/gtk-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/images/gtk-label.png b/doc/src/images/gtk-label.png
new file mode 100644
index 0000000..006d013
--- /dev/null
+++ b/doc/src/images/gtk-label.png
Binary files differ
diff --git a/doc/src/images/gtk-lcdnumber.png b/doc/src/images/gtk-lcdnumber.png
new file mode 100644
index 0000000..142d298
--- /dev/null
+++ b/doc/src/images/gtk-lcdnumber.png
Binary files differ
diff --git a/doc/src/images/gtk-lineedit.png b/doc/src/images/gtk-lineedit.png
new file mode 100644
index 0000000..8fb513c
--- /dev/null
+++ b/doc/src/images/gtk-lineedit.png
Binary files differ
diff --git a/doc/src/images/gtk-listview.png b/doc/src/images/gtk-listview.png
new file mode 100644
index 0000000..d32f8e8
--- /dev/null
+++ b/doc/src/images/gtk-listview.png
Binary files differ
diff --git a/doc/src/images/gtk-progressbar.png b/doc/src/images/gtk-progressbar.png
new file mode 100644
index 0000000..6162484
--- /dev/null
+++ b/doc/src/images/gtk-progressbar.png
Binary files differ
diff --git a/doc/src/images/gtk-pushbutton.png b/doc/src/images/gtk-pushbutton.png
new file mode 100644
index 0000000..f4f4d7c
--- /dev/null
+++ b/doc/src/images/gtk-pushbutton.png
Binary files differ
diff --git a/doc/src/images/gtk-radiobutton.png b/doc/src/images/gtk-radiobutton.png
new file mode 100644
index 0000000..b3620fa
--- /dev/null
+++ b/doc/src/images/gtk-radiobutton.png
Binary files differ
diff --git a/doc/src/images/gtk-slider.png b/doc/src/images/gtk-slider.png
new file mode 100644
index 0000000..3d8e0ee
--- /dev/null
+++ b/doc/src/images/gtk-slider.png
Binary files differ
diff --git a/doc/src/images/gtk-spinbox.png b/doc/src/images/gtk-spinbox.png
new file mode 100644
index 0000000..a39eb3a
--- /dev/null
+++ b/doc/src/images/gtk-spinbox.png
Binary files differ
diff --git a/doc/src/images/gtk-style-screenshot.png b/doc/src/images/gtk-style-screenshot.png
new file mode 100644
index 0000000..2d493a0
--- /dev/null
+++ b/doc/src/images/gtk-style-screenshot.png
Binary files differ
diff --git a/doc/src/images/gtk-tableview.png b/doc/src/images/gtk-tableview.png
new file mode 100644
index 0000000..a025193
--- /dev/null
+++ b/doc/src/images/gtk-tableview.png
Binary files differ
diff --git a/doc/src/images/gtk-tabwidget.png b/doc/src/images/gtk-tabwidget.png
new file mode 100644
index 0000000..089c76d
--- /dev/null
+++ b/doc/src/images/gtk-tabwidget.png
Binary files differ
diff --git a/doc/src/images/gtk-textedit.png b/doc/src/images/gtk-textedit.png
new file mode 100644
index 0000000..e4b91c0
--- /dev/null
+++ b/doc/src/images/gtk-textedit.png
Binary files differ
diff --git a/doc/src/images/gtk-timeedit.png b/doc/src/images/gtk-timeedit.png
new file mode 100644
index 0000000..acf6730
--- /dev/null
+++ b/doc/src/images/gtk-timeedit.png
Binary files differ
diff --git a/doc/src/images/gtk-toolbox.png b/doc/src/images/gtk-toolbox.png
new file mode 100644
index 0000000..25e6137
--- /dev/null
+++ b/doc/src/images/gtk-toolbox.png
Binary files differ
diff --git a/doc/src/images/gtk-toolbutton.png b/doc/src/images/gtk-toolbutton.png
new file mode 100644
index 0000000..f0eb86e
--- /dev/null
+++ b/doc/src/images/gtk-toolbutton.png
Binary files differ
diff --git a/doc/src/images/gtk-treeview.png b/doc/src/images/gtk-treeview.png
new file mode 100644
index 0000000..7b4e304
--- /dev/null
+++ b/doc/src/images/gtk-treeview.png
Binary files differ
diff --git a/doc/src/images/hellogl-es-example.png b/doc/src/images/hellogl-es-example.png
new file mode 100644
index 0000000..7e55f09
--- /dev/null
+++ b/doc/src/images/hellogl-es-example.png
Binary files differ
diff --git a/doc/src/images/hellogl-example.png b/doc/src/images/hellogl-example.png
new file mode 100644
index 0000000..ecb3a3a
--- /dev/null
+++ b/doc/src/images/hellogl-example.png
Binary files differ
diff --git a/doc/src/images/http-example.png b/doc/src/images/http-example.png
new file mode 100644
index 0000000..16b0539
--- /dev/null
+++ b/doc/src/images/http-example.png
Binary files differ
diff --git a/doc/src/images/httpstack.png b/doc/src/images/httpstack.png
new file mode 100644
index 0000000..658927b
--- /dev/null
+++ b/doc/src/images/httpstack.png
Binary files differ
diff --git a/doc/src/images/i18n-example.png b/doc/src/images/i18n-example.png
new file mode 100644
index 0000000..20c46c9
--- /dev/null
+++ b/doc/src/images/i18n-example.png
Binary files differ
diff --git a/doc/src/images/icon.png b/doc/src/images/icon.png
new file mode 100644
index 0000000..cc2b6ac
--- /dev/null
+++ b/doc/src/images/icon.png
Binary files differ
diff --git a/doc/src/images/icons-example.png b/doc/src/images/icons-example.png
new file mode 100644
index 0000000..ae4b1d3
--- /dev/null
+++ b/doc/src/images/icons-example.png
Binary files differ
diff --git a/doc/src/images/icons-view-menu.png b/doc/src/images/icons-view-menu.png
new file mode 100644
index 0000000..7fc02a0
--- /dev/null
+++ b/doc/src/images/icons-view-menu.png
Binary files differ
diff --git a/doc/src/images/icons_find_normal.png b/doc/src/images/icons_find_normal.png
new file mode 100644
index 0000000..c92c7e1
--- /dev/null
+++ b/doc/src/images/icons_find_normal.png
Binary files differ
diff --git a/doc/src/images/icons_find_normal_disabled.png b/doc/src/images/icons_find_normal_disabled.png
new file mode 100644
index 0000000..534d6de
--- /dev/null
+++ b/doc/src/images/icons_find_normal_disabled.png
Binary files differ
diff --git a/doc/src/images/icons_images_groupbox.png b/doc/src/images/icons_images_groupbox.png
new file mode 100644
index 0000000..f4942f7
--- /dev/null
+++ b/doc/src/images/icons_images_groupbox.png
Binary files differ
diff --git a/doc/src/images/icons_monkey.png b/doc/src/images/icons_monkey.png
new file mode 100644
index 0000000..141a87c
--- /dev/null
+++ b/doc/src/images/icons_monkey.png
Binary files differ
diff --git a/doc/src/images/icons_monkey_active.png b/doc/src/images/icons_monkey_active.png
new file mode 100644
index 0000000..edb5132
--- /dev/null
+++ b/doc/src/images/icons_monkey_active.png
Binary files differ
diff --git a/doc/src/images/icons_monkey_mess.png b/doc/src/images/icons_monkey_mess.png
new file mode 100644
index 0000000..c23eed6
--- /dev/null
+++ b/doc/src/images/icons_monkey_mess.png
Binary files differ
diff --git a/doc/src/images/icons_preview_area.png b/doc/src/images/icons_preview_area.png
new file mode 100644
index 0000000..098afae
--- /dev/null
+++ b/doc/src/images/icons_preview_area.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_16x16.png b/doc/src/images/icons_qt_extended_16x16.png
new file mode 100644
index 0000000..9274369
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_16x16.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_17x17.png b/doc/src/images/icons_qt_extended_17x17.png
new file mode 100644
index 0000000..e9bb24a
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_17x17.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_32x32.png b/doc/src/images/icons_qt_extended_32x32.png
new file mode 100644
index 0000000..cd3d0f3
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_32x32.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_33x33.png b/doc/src/images/icons_qt_extended_33x33.png
new file mode 100644
index 0000000..a67565c
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_33x33.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_48x48.png b/doc/src/images/icons_qt_extended_48x48.png
new file mode 100644
index 0000000..5aa2d73
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_48x48.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_64x64.png b/doc/src/images/icons_qt_extended_64x64.png
new file mode 100644
index 0000000..5aa2d73
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_64x64.png
Binary files differ
diff --git a/doc/src/images/icons_qt_extended_8x8.png b/doc/src/images/icons_qt_extended_8x8.png
new file mode 100644
index 0000000..8de7fce
--- /dev/null
+++ b/doc/src/images/icons_qt_extended_8x8.png
Binary files differ
diff --git a/doc/src/images/icons_size_groupbox.png b/doc/src/images/icons_size_groupbox.png
new file mode 100644
index 0000000..1360280
--- /dev/null
+++ b/doc/src/images/icons_size_groupbox.png
Binary files differ
diff --git a/doc/src/images/icons_size_spinbox.png b/doc/src/images/icons_size_spinbox.png
new file mode 100644
index 0000000..a23ee9f
--- /dev/null
+++ b/doc/src/images/icons_size_spinbox.png
Binary files differ
diff --git a/doc/src/images/imagecomposition-example.png b/doc/src/images/imagecomposition-example.png
new file mode 100644
index 0000000..697c980
--- /dev/null
+++ b/doc/src/images/imagecomposition-example.png
Binary files differ
diff --git a/doc/src/images/imageviewer-example.png b/doc/src/images/imageviewer-example.png
new file mode 100644
index 0000000..69b4f7a
--- /dev/null
+++ b/doc/src/images/imageviewer-example.png
Binary files differ
diff --git a/doc/src/images/imageviewer-fit_to_window_1.png b/doc/src/images/imageviewer-fit_to_window_1.png
new file mode 100644
index 0000000..0fe1ba1
--- /dev/null
+++ b/doc/src/images/imageviewer-fit_to_window_1.png
Binary files differ
diff --git a/doc/src/images/imageviewer-fit_to_window_2.png b/doc/src/images/imageviewer-fit_to_window_2.png
new file mode 100644
index 0000000..29e3a93
--- /dev/null
+++ b/doc/src/images/imageviewer-fit_to_window_2.png
Binary files differ
diff --git a/doc/src/images/imageviewer-original_size.png b/doc/src/images/imageviewer-original_size.png
new file mode 100644
index 0000000..c0443eb
--- /dev/null
+++ b/doc/src/images/imageviewer-original_size.png
Binary files differ
diff --git a/doc/src/images/imageviewer-zoom_in_1.png b/doc/src/images/imageviewer-zoom_in_1.png
new file mode 100644
index 0000000..05b0fff
--- /dev/null
+++ b/doc/src/images/imageviewer-zoom_in_1.png
Binary files differ
diff --git a/doc/src/images/imageviewer-zoom_in_2.png b/doc/src/images/imageviewer-zoom_in_2.png
new file mode 100644
index 0000000..0c36111
--- /dev/null
+++ b/doc/src/images/imageviewer-zoom_in_2.png
Binary files differ
diff --git a/doc/src/images/inputdialogs.png b/doc/src/images/inputdialogs.png
new file mode 100644
index 0000000..135c2f6
--- /dev/null
+++ b/doc/src/images/inputdialogs.png
Binary files differ
diff --git a/doc/src/images/insertrowinmodelview.png b/doc/src/images/insertrowinmodelview.png
new file mode 100644
index 0000000..bddc401
--- /dev/null
+++ b/doc/src/images/insertrowinmodelview.png
Binary files differ
diff --git a/doc/src/images/interview-demo.png b/doc/src/images/interview-demo.png
new file mode 100644
index 0000000..d4a1956
--- /dev/null
+++ b/doc/src/images/interview-demo.png
Binary files differ
diff --git a/doc/src/images/interview-shareddirmodel.png b/doc/src/images/interview-shareddirmodel.png
new file mode 100644
index 0000000..0213a8d
--- /dev/null
+++ b/doc/src/images/interview-shareddirmodel.png
Binary files differ
diff --git a/doc/src/images/itemview-examples.png b/doc/src/images/itemview-examples.png
new file mode 100644
index 0000000..71d29fe
--- /dev/null
+++ b/doc/src/images/itemview-examples.png
Binary files differ
diff --git a/doc/src/images/itemviews-editabletreemodel-indexes.png b/doc/src/images/itemviews-editabletreemodel-indexes.png
new file mode 100644
index 0000000..4c66e88
--- /dev/null
+++ b/doc/src/images/itemviews-editabletreemodel-indexes.png
Binary files differ
diff --git a/doc/src/images/itemviews-editabletreemodel-items.png b/doc/src/images/itemviews-editabletreemodel-items.png
new file mode 100644
index 0000000..35fcb75
--- /dev/null
+++ b/doc/src/images/itemviews-editabletreemodel-items.png
Binary files differ
diff --git a/doc/src/images/itemviews-editabletreemodel-model.png b/doc/src/images/itemviews-editabletreemodel-model.png
new file mode 100644
index 0000000..592e0ff
--- /dev/null
+++ b/doc/src/images/itemviews-editabletreemodel-model.png
Binary files differ
diff --git a/doc/src/images/itemviews-editabletreemodel-values.png b/doc/src/images/itemviews-editabletreemodel-values.png
new file mode 100644
index 0000000..0ace1cc
--- /dev/null
+++ b/doc/src/images/itemviews-editabletreemodel-values.png
Binary files differ
diff --git a/doc/src/images/itemviews-editabletreemodel.png b/doc/src/images/itemviews-editabletreemodel.png
new file mode 100644
index 0000000..a151ea8
--- /dev/null
+++ b/doc/src/images/itemviews-editabletreemodel.png
Binary files differ
diff --git a/doc/src/images/itemviews-examples.png b/doc/src/images/itemviews-examples.png
new file mode 100644
index 0000000..7c026c2
--- /dev/null
+++ b/doc/src/images/itemviews-examples.png
Binary files differ
diff --git a/doc/src/images/itemviewspuzzle-example.png b/doc/src/images/itemviewspuzzle-example.png
new file mode 100644
index 0000000..05ae28b
--- /dev/null
+++ b/doc/src/images/itemviewspuzzle-example.png
Binary files differ
diff --git a/doc/src/images/javaiterators1.png b/doc/src/images/javaiterators1.png
new file mode 100644
index 0000000..7dfcde0
--- /dev/null
+++ b/doc/src/images/javaiterators1.png
Binary files differ
diff --git a/doc/src/images/javaiterators2.png b/doc/src/images/javaiterators2.png
new file mode 100644
index 0000000..c04e3cc
--- /dev/null
+++ b/doc/src/images/javaiterators2.png
Binary files differ
diff --git a/doc/src/images/javastyle/branchindicatorimage.png b/doc/src/images/javastyle/branchindicatorimage.png
new file mode 100644
index 0000000..f2cfc4b
--- /dev/null
+++ b/doc/src/images/javastyle/branchindicatorimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/button.png b/doc/src/images/javastyle/button.png
new file mode 100644
index 0000000..c3a9742
--- /dev/null
+++ b/doc/src/images/javastyle/button.png
Binary files differ
diff --git a/doc/src/images/javastyle/checkbox.png b/doc/src/images/javastyle/checkbox.png
new file mode 100644
index 0000000..bc841a6
--- /dev/null
+++ b/doc/src/images/javastyle/checkbox.png
Binary files differ
diff --git a/doc/src/images/javastyle/checkboxexample.png b/doc/src/images/javastyle/checkboxexample.png
new file mode 100644
index 0000000..69217fb
--- /dev/null
+++ b/doc/src/images/javastyle/checkboxexample.png
Binary files differ
diff --git a/doc/src/images/javastyle/checkingsomestuff.png b/doc/src/images/javastyle/checkingsomestuff.png
new file mode 100644
index 0000000..88e8cad
--- /dev/null
+++ b/doc/src/images/javastyle/checkingsomestuff.png
Binary files differ
diff --git a/doc/src/images/javastyle/combobox.png b/doc/src/images/javastyle/combobox.png
new file mode 100644
index 0000000..de9745a
--- /dev/null
+++ b/doc/src/images/javastyle/combobox.png
Binary files differ
diff --git a/doc/src/images/javastyle/comboboximage.png b/doc/src/images/javastyle/comboboximage.png
new file mode 100644
index 0000000..1f05e5f
--- /dev/null
+++ b/doc/src/images/javastyle/comboboximage.png
Binary files differ
diff --git a/doc/src/images/javastyle/conceptualpushbuttontree.png b/doc/src/images/javastyle/conceptualpushbuttontree.png
new file mode 100644
index 0000000..910000a
--- /dev/null
+++ b/doc/src/images/javastyle/conceptualpushbuttontree.png
Binary files differ
diff --git a/doc/src/images/javastyle/dockwidget.png b/doc/src/images/javastyle/dockwidget.png
new file mode 100644
index 0000000..4bfec14
--- /dev/null
+++ b/doc/src/images/javastyle/dockwidget.png
Binary files differ
diff --git a/doc/src/images/javastyle/dockwidgetimage.png b/doc/src/images/javastyle/dockwidgetimage.png
new file mode 100644
index 0000000..eefe171
--- /dev/null
+++ b/doc/src/images/javastyle/dockwidgetimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/groupbox.png b/doc/src/images/javastyle/groupbox.png
new file mode 100644
index 0000000..a39cd42
--- /dev/null
+++ b/doc/src/images/javastyle/groupbox.png
Binary files differ
diff --git a/doc/src/images/javastyle/groupboximage.png b/doc/src/images/javastyle/groupboximage.png
new file mode 100644
index 0000000..5baf609
--- /dev/null
+++ b/doc/src/images/javastyle/groupboximage.png
Binary files differ
diff --git a/doc/src/images/javastyle/header.png b/doc/src/images/javastyle/header.png
new file mode 100644
index 0000000..b4546d8
--- /dev/null
+++ b/doc/src/images/javastyle/header.png
Binary files differ
diff --git a/doc/src/images/javastyle/headerimage.png b/doc/src/images/javastyle/headerimage.png
new file mode 100644
index 0000000..4117149
--- /dev/null
+++ b/doc/src/images/javastyle/headerimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/menu.png b/doc/src/images/javastyle/menu.png
new file mode 100644
index 0000000..8d44da4
--- /dev/null
+++ b/doc/src/images/javastyle/menu.png
Binary files differ
diff --git a/doc/src/images/javastyle/menubar.png b/doc/src/images/javastyle/menubar.png
new file mode 100644
index 0000000..e68e4a3
--- /dev/null
+++ b/doc/src/images/javastyle/menubar.png
Binary files differ
diff --git a/doc/src/images/javastyle/menubarimage.png b/doc/src/images/javastyle/menubarimage.png
new file mode 100644
index 0000000..b0cf28e
--- /dev/null
+++ b/doc/src/images/javastyle/menubarimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/menuimage.png b/doc/src/images/javastyle/menuimage.png
new file mode 100644
index 0000000..282dde7
--- /dev/null
+++ b/doc/src/images/javastyle/menuimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/plastiquetabimage.png b/doc/src/images/javastyle/plastiquetabimage.png
new file mode 100644
index 0000000..56491ff
--- /dev/null
+++ b/doc/src/images/javastyle/plastiquetabimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/plastiquetabtest.png b/doc/src/images/javastyle/plastiquetabtest.png
new file mode 100644
index 0000000..e537773
--- /dev/null
+++ b/doc/src/images/javastyle/plastiquetabtest.png
Binary files differ
diff --git a/doc/src/images/javastyle/progressbar.png b/doc/src/images/javastyle/progressbar.png
new file mode 100644
index 0000000..de3a838
--- /dev/null
+++ b/doc/src/images/javastyle/progressbar.png
Binary files differ
diff --git a/doc/src/images/javastyle/progressbarimage.png b/doc/src/images/javastyle/progressbarimage.png
new file mode 100644
index 0000000..433b900
--- /dev/null
+++ b/doc/src/images/javastyle/progressbarimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/pushbutton.png b/doc/src/images/javastyle/pushbutton.png
new file mode 100644
index 0000000..e5f92be
--- /dev/null
+++ b/doc/src/images/javastyle/pushbutton.png
Binary files differ
diff --git a/doc/src/images/javastyle/rubberband.png b/doc/src/images/javastyle/rubberband.png
new file mode 100644
index 0000000..087424a
--- /dev/null
+++ b/doc/src/images/javastyle/rubberband.png
Binary files differ
diff --git a/doc/src/images/javastyle/rubberbandimage.png b/doc/src/images/javastyle/rubberbandimage.png
new file mode 100644
index 0000000..2794638
--- /dev/null
+++ b/doc/src/images/javastyle/rubberbandimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/scrollbar.png b/doc/src/images/javastyle/scrollbar.png
new file mode 100644
index 0000000..c1ecb5d
--- /dev/null
+++ b/doc/src/images/javastyle/scrollbar.png
Binary files differ
diff --git a/doc/src/images/javastyle/scrollbarimage.png b/doc/src/images/javastyle/scrollbarimage.png
new file mode 100644
index 0000000..6d3e29d
--- /dev/null
+++ b/doc/src/images/javastyle/scrollbarimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/sizegrip.png b/doc/src/images/javastyle/sizegrip.png
new file mode 100644
index 0000000..667e6fb
--- /dev/null
+++ b/doc/src/images/javastyle/sizegrip.png
Binary files differ
diff --git a/doc/src/images/javastyle/sizegripimage.png b/doc/src/images/javastyle/sizegripimage.png
new file mode 100644
index 0000000..ccbf525
--- /dev/null
+++ b/doc/src/images/javastyle/sizegripimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/slider.png b/doc/src/images/javastyle/slider.png
new file mode 100644
index 0000000..a382233
--- /dev/null
+++ b/doc/src/images/javastyle/slider.png
Binary files differ
diff --git a/doc/src/images/javastyle/sliderhandle.png b/doc/src/images/javastyle/sliderhandle.png
new file mode 100644
index 0000000..28b7544
--- /dev/null
+++ b/doc/src/images/javastyle/sliderhandle.png
Binary files differ
diff --git a/doc/src/images/javastyle/sliderimage.png b/doc/src/images/javastyle/sliderimage.png
new file mode 100644
index 0000000..df700dd
--- /dev/null
+++ b/doc/src/images/javastyle/sliderimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/slidertroubble.png b/doc/src/images/javastyle/slidertroubble.png
new file mode 100644
index 0000000..79eee81
--- /dev/null
+++ b/doc/src/images/javastyle/slidertroubble.png
Binary files differ
diff --git a/doc/src/images/javastyle/spinbox.png b/doc/src/images/javastyle/spinbox.png
new file mode 100644
index 0000000..ec9d6e0
--- /dev/null
+++ b/doc/src/images/javastyle/spinbox.png
Binary files differ
diff --git a/doc/src/images/javastyle/spinboximage.png b/doc/src/images/javastyle/spinboximage.png
new file mode 100644
index 0000000..d0d57c8
--- /dev/null
+++ b/doc/src/images/javastyle/spinboximage.png
Binary files differ
diff --git a/doc/src/images/javastyle/splitter.png b/doc/src/images/javastyle/splitter.png
new file mode 100644
index 0000000..5983804
--- /dev/null
+++ b/doc/src/images/javastyle/splitter.png
Binary files differ
diff --git a/doc/src/images/javastyle/tab.png b/doc/src/images/javastyle/tab.png
new file mode 100644
index 0000000..616580c
--- /dev/null
+++ b/doc/src/images/javastyle/tab.png
Binary files differ
diff --git a/doc/src/images/javastyle/tabwidget.png b/doc/src/images/javastyle/tabwidget.png
new file mode 100644
index 0000000..737155c
--- /dev/null
+++ b/doc/src/images/javastyle/tabwidget.png
Binary files differ
diff --git a/doc/src/images/javastyle/titlebar.png b/doc/src/images/javastyle/titlebar.png
new file mode 100644
index 0000000..5d7ecc4
--- /dev/null
+++ b/doc/src/images/javastyle/titlebar.png
Binary files differ
diff --git a/doc/src/images/javastyle/titlebarimage.png b/doc/src/images/javastyle/titlebarimage.png
new file mode 100644
index 0000000..50287ae
--- /dev/null
+++ b/doc/src/images/javastyle/titlebarimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/toolbar.png b/doc/src/images/javastyle/toolbar.png
new file mode 100644
index 0000000..e69e8df
--- /dev/null
+++ b/doc/src/images/javastyle/toolbar.png
Binary files differ
diff --git a/doc/src/images/javastyle/toolbarimage.png b/doc/src/images/javastyle/toolbarimage.png
new file mode 100644
index 0000000..b9025f5
--- /dev/null
+++ b/doc/src/images/javastyle/toolbarimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/toolbox.png b/doc/src/images/javastyle/toolbox.png
new file mode 100644
index 0000000..c5f61ec
--- /dev/null
+++ b/doc/src/images/javastyle/toolbox.png
Binary files differ
diff --git a/doc/src/images/javastyle/toolboximage.png b/doc/src/images/javastyle/toolboximage.png
new file mode 100644
index 0000000..7bcbd26
--- /dev/null
+++ b/doc/src/images/javastyle/toolboximage.png
Binary files differ
diff --git a/doc/src/images/javastyle/toolbutton.png b/doc/src/images/javastyle/toolbutton.png
new file mode 100644
index 0000000..9167e83
--- /dev/null
+++ b/doc/src/images/javastyle/toolbutton.png
Binary files differ
diff --git a/doc/src/images/javastyle/toolbuttonimage.png b/doc/src/images/javastyle/toolbuttonimage.png
new file mode 100644
index 0000000..3217172
--- /dev/null
+++ b/doc/src/images/javastyle/toolbuttonimage.png
Binary files differ
diff --git a/doc/src/images/javastyle/windowstabimage.png b/doc/src/images/javastyle/windowstabimage.png
new file mode 100644
index 0000000..485e847
--- /dev/null
+++ b/doc/src/images/javastyle/windowstabimage.png
Binary files differ
diff --git a/doc/src/images/layout-examples.png b/doc/src/images/layout-examples.png
new file mode 100644
index 0000000..eb28127
--- /dev/null
+++ b/doc/src/images/layout-examples.png
Binary files differ
diff --git a/doc/src/images/layout1.png b/doc/src/images/layout1.png
new file mode 100644
index 0000000..98cee45
--- /dev/null
+++ b/doc/src/images/layout1.png
Binary files differ
diff --git a/doc/src/images/layout2.png b/doc/src/images/layout2.png
new file mode 100644
index 0000000..dfa2815
--- /dev/null
+++ b/doc/src/images/layout2.png
Binary files differ
diff --git a/doc/src/images/layouts-examples.png b/doc/src/images/layouts-examples.png
new file mode 100644
index 0000000..a7121a9
--- /dev/null
+++ b/doc/src/images/layouts-examples.png
Binary files differ
diff --git a/doc/src/images/licensewizard-example.png b/doc/src/images/licensewizard-example.png
new file mode 100644
index 0000000..97b3aaa
--- /dev/null
+++ b/doc/src/images/licensewizard-example.png
Binary files differ
diff --git a/doc/src/images/licensewizard-flow.png b/doc/src/images/licensewizard-flow.png
new file mode 100644
index 0000000..76df63a
--- /dev/null
+++ b/doc/src/images/licensewizard-flow.png
Binary files differ
diff --git a/doc/src/images/licensewizard.png b/doc/src/images/licensewizard.png
new file mode 100644
index 0000000..40925cc
--- /dev/null
+++ b/doc/src/images/licensewizard.png
Binary files differ
diff --git a/doc/src/images/lineedits-example.png b/doc/src/images/lineedits-example.png
new file mode 100644
index 0000000..ff5e318
--- /dev/null
+++ b/doc/src/images/lineedits-example.png
Binary files differ
diff --git a/doc/src/images/linguist-arrowpad_en.png b/doc/src/images/linguist-arrowpad_en.png
new file mode 100644
index 0000000..9a95eb2
--- /dev/null
+++ b/doc/src/images/linguist-arrowpad_en.png
Binary files differ
diff --git a/doc/src/images/linguist-arrowpad_fr.png b/doc/src/images/linguist-arrowpad_fr.png
new file mode 100644
index 0000000..fc33f9f
--- /dev/null
+++ b/doc/src/images/linguist-arrowpad_fr.png
Binary files differ
diff --git a/doc/src/images/linguist-arrowpad_nl.png b/doc/src/images/linguist-arrowpad_nl.png
new file mode 100644
index 0000000..f2645a8
--- /dev/null
+++ b/doc/src/images/linguist-arrowpad_nl.png
Binary files differ
diff --git a/doc/src/images/linguist-auxlanguages.png b/doc/src/images/linguist-auxlanguages.png
new file mode 100644
index 0000000..634605e
--- /dev/null
+++ b/doc/src/images/linguist-auxlanguages.png
Binary files differ
diff --git a/doc/src/images/linguist-batchtranslation.png b/doc/src/images/linguist-batchtranslation.png
new file mode 100644
index 0000000..2423e9e
--- /dev/null
+++ b/doc/src/images/linguist-batchtranslation.png
Binary files differ
diff --git a/doc/src/images/linguist-check-empty.png b/doc/src/images/linguist-check-empty.png
new file mode 100644
index 0000000..759a41b
--- /dev/null
+++ b/doc/src/images/linguist-check-empty.png
Binary files differ
diff --git a/doc/src/images/linguist-check-obsolete.png b/doc/src/images/linguist-check-obsolete.png
new file mode 100644
index 0000000..b852b63
--- /dev/null
+++ b/doc/src/images/linguist-check-obsolete.png
Binary files differ
diff --git a/doc/src/images/linguist-check-off.png b/doc/src/images/linguist-check-off.png
new file mode 100644
index 0000000..640b689
--- /dev/null
+++ b/doc/src/images/linguist-check-off.png
Binary files differ
diff --git a/doc/src/images/linguist-check-on.png b/doc/src/images/linguist-check-on.png
new file mode 100644
index 0000000..afcaf63
--- /dev/null
+++ b/doc/src/images/linguist-check-on.png
Binary files differ
diff --git a/doc/src/images/linguist-check-warning.png b/doc/src/images/linguist-check-warning.png
new file mode 100644
index 0000000..f689c33
--- /dev/null
+++ b/doc/src/images/linguist-check-warning.png
Binary files differ
diff --git a/doc/src/images/linguist-danger.png b/doc/src/images/linguist-danger.png
new file mode 100644
index 0000000..e101577
--- /dev/null
+++ b/doc/src/images/linguist-danger.png
Binary files differ
diff --git a/doc/src/images/linguist-doneandnext.png b/doc/src/images/linguist-doneandnext.png
new file mode 100644
index 0000000..18f2fb6
--- /dev/null
+++ b/doc/src/images/linguist-doneandnext.png
Binary files differ
diff --git a/doc/src/images/linguist-editcopy.png b/doc/src/images/linguist-editcopy.png
new file mode 100644
index 0000000..d542c3b
--- /dev/null
+++ b/doc/src/images/linguist-editcopy.png
Binary files differ
diff --git a/doc/src/images/linguist-editcut.png b/doc/src/images/linguist-editcut.png
new file mode 100644
index 0000000..38e55f7
--- /dev/null
+++ b/doc/src/images/linguist-editcut.png
Binary files differ
diff --git a/doc/src/images/linguist-editfind.png b/doc/src/images/linguist-editfind.png
new file mode 100644
index 0000000..6ea35e9
--- /dev/null
+++ b/doc/src/images/linguist-editfind.png
Binary files differ
diff --git a/doc/src/images/linguist-editpaste.png b/doc/src/images/linguist-editpaste.png
new file mode 100644
index 0000000..717dd86
--- /dev/null
+++ b/doc/src/images/linguist-editpaste.png
Binary files differ
diff --git a/doc/src/images/linguist-editredo.png b/doc/src/images/linguist-editredo.png
new file mode 100644
index 0000000..9d679fe
--- /dev/null
+++ b/doc/src/images/linguist-editredo.png
Binary files differ
diff --git a/doc/src/images/linguist-editundo.png b/doc/src/images/linguist-editundo.png
new file mode 100644
index 0000000..eee23d2
--- /dev/null
+++ b/doc/src/images/linguist-editundo.png
Binary files differ
diff --git a/doc/src/images/linguist-examples.png b/doc/src/images/linguist-examples.png
new file mode 100644
index 0000000..c39ed5d
--- /dev/null
+++ b/doc/src/images/linguist-examples.png
Binary files differ
diff --git a/doc/src/images/linguist-fileopen.png b/doc/src/images/linguist-fileopen.png
new file mode 100644
index 0000000..1b3e69f
--- /dev/null
+++ b/doc/src/images/linguist-fileopen.png
Binary files differ
diff --git a/doc/src/images/linguist-fileprint.png b/doc/src/images/linguist-fileprint.png
new file mode 100644
index 0000000..2afb769
--- /dev/null
+++ b/doc/src/images/linguist-fileprint.png
Binary files differ
diff --git a/doc/src/images/linguist-filesave.png b/doc/src/images/linguist-filesave.png
new file mode 100644
index 0000000..46eac82
--- /dev/null
+++ b/doc/src/images/linguist-filesave.png
Binary files differ
diff --git a/doc/src/images/linguist-finddialog.png b/doc/src/images/linguist-finddialog.png
new file mode 100644
index 0000000..831a393
--- /dev/null
+++ b/doc/src/images/linguist-finddialog.png
Binary files differ
diff --git a/doc/src/images/linguist-hellotr_en.png b/doc/src/images/linguist-hellotr_en.png
new file mode 100644
index 0000000..6b3d807
--- /dev/null
+++ b/doc/src/images/linguist-hellotr_en.png
Binary files differ
diff --git a/doc/src/images/linguist-hellotr_la.png b/doc/src/images/linguist-hellotr_la.png
new file mode 100644
index 0000000..f1ecdb0
--- /dev/null
+++ b/doc/src/images/linguist-hellotr_la.png
Binary files differ
diff --git a/doc/src/images/linguist-linguist.png b/doc/src/images/linguist-linguist.png
new file mode 100644
index 0000000..303d20b
--- /dev/null
+++ b/doc/src/images/linguist-linguist.png
Binary files differ
diff --git a/doc/src/images/linguist-linguist_2.png b/doc/src/images/linguist-linguist_2.png
new file mode 100644
index 0000000..9ef1c2c
--- /dev/null
+++ b/doc/src/images/linguist-linguist_2.png
Binary files differ
diff --git a/doc/src/images/linguist-menubar.png b/doc/src/images/linguist-menubar.png
new file mode 100644
index 0000000..bc510be
--- /dev/null
+++ b/doc/src/images/linguist-menubar.png
Binary files differ
diff --git a/doc/src/images/linguist-next.png b/doc/src/images/linguist-next.png
new file mode 100644
index 0000000..7700d6f
--- /dev/null
+++ b/doc/src/images/linguist-next.png
Binary files differ
diff --git a/doc/src/images/linguist-nextunfinished.png b/doc/src/images/linguist-nextunfinished.png
new file mode 100644
index 0000000..05c92bd
--- /dev/null
+++ b/doc/src/images/linguist-nextunfinished.png
Binary files differ
diff --git a/doc/src/images/linguist-phrasebookdialog.png b/doc/src/images/linguist-phrasebookdialog.png
new file mode 100644
index 0000000..eb5da70
--- /dev/null
+++ b/doc/src/images/linguist-phrasebookdialog.png
Binary files differ
diff --git a/doc/src/images/linguist-phrasebookopen.png b/doc/src/images/linguist-phrasebookopen.png
new file mode 100644
index 0000000..1b35455
--- /dev/null
+++ b/doc/src/images/linguist-phrasebookopen.png
Binary files differ
diff --git a/doc/src/images/linguist-prev.png b/doc/src/images/linguist-prev.png
new file mode 100644
index 0000000..99dc873
--- /dev/null
+++ b/doc/src/images/linguist-prev.png
Binary files differ
diff --git a/doc/src/images/linguist-previewtool.png b/doc/src/images/linguist-previewtool.png
new file mode 100644
index 0000000..c4fca3c
--- /dev/null
+++ b/doc/src/images/linguist-previewtool.png
Binary files differ
diff --git a/doc/src/images/linguist-prevunfinished.png b/doc/src/images/linguist-prevunfinished.png
new file mode 100644
index 0000000..15c13ea
--- /dev/null
+++ b/doc/src/images/linguist-prevunfinished.png
Binary files differ
diff --git a/doc/src/images/linguist-toolbar.png b/doc/src/images/linguist-toolbar.png
new file mode 100644
index 0000000..b45c31b
--- /dev/null
+++ b/doc/src/images/linguist-toolbar.png
Binary files differ
diff --git a/doc/src/images/linguist-translationfilesettings.png b/doc/src/images/linguist-translationfilesettings.png
new file mode 100644
index 0000000..e524c05
--- /dev/null
+++ b/doc/src/images/linguist-translationfilesettings.png
Binary files differ
diff --git a/doc/src/images/linguist-trollprint_10_en.png b/doc/src/images/linguist-trollprint_10_en.png
new file mode 100644
index 0000000..e460481
--- /dev/null
+++ b/doc/src/images/linguist-trollprint_10_en.png
Binary files differ
diff --git a/doc/src/images/linguist-trollprint_10_pt_bad.png b/doc/src/images/linguist-trollprint_10_pt_bad.png
new file mode 100644
index 0000000..b96d477
--- /dev/null
+++ b/doc/src/images/linguist-trollprint_10_pt_bad.png
Binary files differ
diff --git a/doc/src/images/linguist-trollprint_10_pt_good.png b/doc/src/images/linguist-trollprint_10_pt_good.png
new file mode 100644
index 0000000..293c44a
--- /dev/null
+++ b/doc/src/images/linguist-trollprint_10_pt_good.png
Binary files differ
diff --git a/doc/src/images/linguist-trollprint_11_en.png b/doc/src/images/linguist-trollprint_11_en.png
new file mode 100644
index 0000000..f718c99
--- /dev/null
+++ b/doc/src/images/linguist-trollprint_11_en.png
Binary files differ
diff --git a/doc/src/images/linguist-trollprint_11_pt.png b/doc/src/images/linguist-trollprint_11_pt.png
new file mode 100644
index 0000000..0ff8c39
--- /dev/null
+++ b/doc/src/images/linguist-trollprint_11_pt.png
Binary files differ
diff --git a/doc/src/images/linguist-validateaccelerators.png b/doc/src/images/linguist-validateaccelerators.png
new file mode 100644
index 0000000..4f72648
--- /dev/null
+++ b/doc/src/images/linguist-validateaccelerators.png
Binary files differ
diff --git a/doc/src/images/linguist-validatephrases.png b/doc/src/images/linguist-validatephrases.png
new file mode 100644
index 0000000..30c3ee6
--- /dev/null
+++ b/doc/src/images/linguist-validatephrases.png
Binary files differ
diff --git a/doc/src/images/linguist-validateplacemarkers.png b/doc/src/images/linguist-validateplacemarkers.png
new file mode 100644
index 0000000..cc127fd
--- /dev/null
+++ b/doc/src/images/linguist-validateplacemarkers.png
Binary files differ
diff --git a/doc/src/images/linguist-validatepunctuation.png b/doc/src/images/linguist-validatepunctuation.png
new file mode 100644
index 0000000..3492f95
--- /dev/null
+++ b/doc/src/images/linguist-validatepunctuation.png
Binary files differ
diff --git a/doc/src/images/linguist-whatsthis.png b/doc/src/images/linguist-whatsthis.png
new file mode 100644
index 0000000..0b5d46a
--- /dev/null
+++ b/doc/src/images/linguist-whatsthis.png
Binary files differ
diff --git a/doc/src/images/localfortuneclient-example.png b/doc/src/images/localfortuneclient-example.png
new file mode 100644
index 0000000..614784b
--- /dev/null
+++ b/doc/src/images/localfortuneclient-example.png
Binary files differ
diff --git a/doc/src/images/localfortuneserver-example.png b/doc/src/images/localfortuneserver-example.png
new file mode 100644
index 0000000..2f04c75
--- /dev/null
+++ b/doc/src/images/localfortuneserver-example.png
Binary files differ
diff --git a/doc/src/images/loopback-example.png b/doc/src/images/loopback-example.png
new file mode 100644
index 0000000..2b1bd4a
--- /dev/null
+++ b/doc/src/images/loopback-example.png
Binary files differ
diff --git a/doc/src/images/mac-cocoa.png b/doc/src/images/mac-cocoa.png
new file mode 100644
index 0000000..06c0ba0
--- /dev/null
+++ b/doc/src/images/mac-cocoa.png
Binary files differ
diff --git a/doc/src/images/macintosh-calendarwidget.png b/doc/src/images/macintosh-calendarwidget.png
new file mode 100644
index 0000000..2f74350
--- /dev/null
+++ b/doc/src/images/macintosh-calendarwidget.png
Binary files differ
diff --git a/doc/src/images/macintosh-checkbox.png b/doc/src/images/macintosh-checkbox.png
new file mode 100644
index 0000000..d0130e3
--- /dev/null
+++ b/doc/src/images/macintosh-checkbox.png
Binary files differ
diff --git a/doc/src/images/macintosh-combobox.png b/doc/src/images/macintosh-combobox.png
new file mode 100644
index 0000000..c1dc3c0
--- /dev/null
+++ b/doc/src/images/macintosh-combobox.png
Binary files differ
diff --git a/doc/src/images/macintosh-dateedit.png b/doc/src/images/macintosh-dateedit.png
new file mode 100644
index 0000000..45aee90
--- /dev/null
+++ b/doc/src/images/macintosh-dateedit.png
Binary files differ
diff --git a/doc/src/images/macintosh-datetimeedit.png b/doc/src/images/macintosh-datetimeedit.png
new file mode 100644
index 0000000..62af02d
--- /dev/null
+++ b/doc/src/images/macintosh-datetimeedit.png
Binary files differ
diff --git a/doc/src/images/macintosh-dial.png b/doc/src/images/macintosh-dial.png
new file mode 100644
index 0000000..df0ffe2
--- /dev/null
+++ b/doc/src/images/macintosh-dial.png
Binary files differ
diff --git a/doc/src/images/macintosh-doublespinbox.png b/doc/src/images/macintosh-doublespinbox.png
new file mode 100644
index 0000000..a0695ff
--- /dev/null
+++ b/doc/src/images/macintosh-doublespinbox.png
Binary files differ
diff --git a/doc/src/images/macintosh-fontcombobox.png b/doc/src/images/macintosh-fontcombobox.png
new file mode 100644
index 0000000..8a5a3c7
--- /dev/null
+++ b/doc/src/images/macintosh-fontcombobox.png
Binary files differ
diff --git a/doc/src/images/macintosh-frame.png b/doc/src/images/macintosh-frame.png
new file mode 100644
index 0000000..fee61a3
--- /dev/null
+++ b/doc/src/images/macintosh-frame.png
Binary files differ
diff --git a/doc/src/images/macintosh-groupbox.png b/doc/src/images/macintosh-groupbox.png
new file mode 100644
index 0000000..f6c7bce
--- /dev/null
+++ b/doc/src/images/macintosh-groupbox.png
Binary files differ
diff --git a/doc/src/images/macintosh-horizontalscrollbar.png b/doc/src/images/macintosh-horizontalscrollbar.png
new file mode 100644
index 0000000..8b63572
--- /dev/null
+++ b/doc/src/images/macintosh-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/images/macintosh-label.png b/doc/src/images/macintosh-label.png
new file mode 100644
index 0000000..753aa4d
--- /dev/null
+++ b/doc/src/images/macintosh-label.png
Binary files differ
diff --git a/doc/src/images/macintosh-lcdnumber.png b/doc/src/images/macintosh-lcdnumber.png
new file mode 100644
index 0000000..2ea9ea0
--- /dev/null
+++ b/doc/src/images/macintosh-lcdnumber.png
Binary files differ
diff --git a/doc/src/images/macintosh-lineedit.png b/doc/src/images/macintosh-lineedit.png
new file mode 100644
index 0000000..0e992c7
--- /dev/null
+++ b/doc/src/images/macintosh-lineedit.png
Binary files differ
diff --git a/doc/src/images/macintosh-listview.png b/doc/src/images/macintosh-listview.png
new file mode 100644
index 0000000..346e6427
--- /dev/null
+++ b/doc/src/images/macintosh-listview.png
Binary files differ
diff --git a/doc/src/images/macintosh-menu.png b/doc/src/images/macintosh-menu.png
new file mode 100644
index 0000000..59bdcea
--- /dev/null
+++ b/doc/src/images/macintosh-menu.png
Binary files differ
diff --git a/doc/src/images/macintosh-progressbar.png b/doc/src/images/macintosh-progressbar.png
new file mode 100644
index 0000000..2dfc8ab
--- /dev/null
+++ b/doc/src/images/macintosh-progressbar.png
Binary files differ
diff --git a/doc/src/images/macintosh-pushbutton.png b/doc/src/images/macintosh-pushbutton.png
new file mode 100644
index 0000000..7ec1491
--- /dev/null
+++ b/doc/src/images/macintosh-pushbutton.png
Binary files differ
diff --git a/doc/src/images/macintosh-radiobutton.png b/doc/src/images/macintosh-radiobutton.png
new file mode 100644
index 0000000..8b02f50
--- /dev/null
+++ b/doc/src/images/macintosh-radiobutton.png
Binary files differ
diff --git a/doc/src/images/macintosh-slider.png b/doc/src/images/macintosh-slider.png
new file mode 100644
index 0000000..bf0c546
--- /dev/null
+++ b/doc/src/images/macintosh-slider.png
Binary files differ
diff --git a/doc/src/images/macintosh-spinbox.png b/doc/src/images/macintosh-spinbox.png
new file mode 100644
index 0000000..4196c37
--- /dev/null
+++ b/doc/src/images/macintosh-spinbox.png
Binary files differ
diff --git a/doc/src/images/macintosh-tableview.png b/doc/src/images/macintosh-tableview.png
new file mode 100644
index 0000000..e651249
--- /dev/null
+++ b/doc/src/images/macintosh-tableview.png
Binary files differ
diff --git a/doc/src/images/macintosh-tabwidget.png b/doc/src/images/macintosh-tabwidget.png
new file mode 100644
index 0000000..1d174a4
--- /dev/null
+++ b/doc/src/images/macintosh-tabwidget.png
Binary files differ
diff --git a/doc/src/images/macintosh-textedit.png b/doc/src/images/macintosh-textedit.png
new file mode 100644
index 0000000..4f0ce36
--- /dev/null
+++ b/doc/src/images/macintosh-textedit.png
Binary files differ
diff --git a/doc/src/images/macintosh-timeedit.png b/doc/src/images/macintosh-timeedit.png
new file mode 100644
index 0000000..4bcfce3
--- /dev/null
+++ b/doc/src/images/macintosh-timeedit.png
Binary files differ
diff --git a/doc/src/images/macintosh-toolbox.png b/doc/src/images/macintosh-toolbox.png
new file mode 100644
index 0000000..18d41ea
--- /dev/null
+++ b/doc/src/images/macintosh-toolbox.png
Binary files differ
diff --git a/doc/src/images/macintosh-toolbutton.png b/doc/src/images/macintosh-toolbutton.png
new file mode 100644
index 0000000..f91331c
--- /dev/null
+++ b/doc/src/images/macintosh-toolbutton.png
Binary files differ
diff --git a/doc/src/images/macintosh-treeview.png b/doc/src/images/macintosh-treeview.png
new file mode 100644
index 0000000..afda6d8
--- /dev/null
+++ b/doc/src/images/macintosh-treeview.png
Binary files differ
diff --git a/doc/src/images/macintosh-unified-toolbar.png b/doc/src/images/macintosh-unified-toolbar.png
new file mode 100644
index 0000000..dadd836
--- /dev/null
+++ b/doc/src/images/macintosh-unified-toolbar.png
Binary files differ
diff --git a/doc/src/images/macmainwindow.png b/doc/src/images/macmainwindow.png
new file mode 100644
index 0000000..84eb11c
--- /dev/null
+++ b/doc/src/images/macmainwindow.png
Binary files differ
diff --git a/doc/src/images/mainwindow-contextmenu.png b/doc/src/images/mainwindow-contextmenu.png
new file mode 100644
index 0000000..439ab21
--- /dev/null
+++ b/doc/src/images/mainwindow-contextmenu.png
Binary files differ
diff --git a/doc/src/images/mainwindow-custom-dock.png b/doc/src/images/mainwindow-custom-dock.png
new file mode 100644
index 0000000..ca86471
--- /dev/null
+++ b/doc/src/images/mainwindow-custom-dock.png
Binary files differ
diff --git a/doc/src/images/mainwindow-demo.png b/doc/src/images/mainwindow-demo.png
new file mode 100644
index 0000000..5799dc0
--- /dev/null
+++ b/doc/src/images/mainwindow-demo.png
Binary files differ
diff --git a/doc/src/images/mainwindow-docks-example.png b/doc/src/images/mainwindow-docks-example.png
new file mode 100644
index 0000000..a5641fd
--- /dev/null
+++ b/doc/src/images/mainwindow-docks-example.png
Binary files differ
diff --git a/doc/src/images/mainwindow-docks.png b/doc/src/images/mainwindow-docks.png
new file mode 100644
index 0000000..24f42a2
--- /dev/null
+++ b/doc/src/images/mainwindow-docks.png
Binary files differ
diff --git a/doc/src/images/mainwindow-examples.png b/doc/src/images/mainwindow-examples.png
new file mode 100644
index 0000000..3e946a6
--- /dev/null
+++ b/doc/src/images/mainwindow-examples.png
Binary files differ
diff --git a/doc/src/images/mainwindow-vertical-dock.png b/doc/src/images/mainwindow-vertical-dock.png
new file mode 100644
index 0000000..b6996ec
--- /dev/null
+++ b/doc/src/images/mainwindow-vertical-dock.png
Binary files differ
diff --git a/doc/src/images/mainwindow-vertical-tabs.png b/doc/src/images/mainwindow-vertical-tabs.png
new file mode 100644
index 0000000..fcb901a
--- /dev/null
+++ b/doc/src/images/mainwindow-vertical-tabs.png
Binary files differ
diff --git a/doc/src/images/mainwindowlayout.png b/doc/src/images/mainwindowlayout.png
new file mode 100644
index 0000000..4776ce4
--- /dev/null
+++ b/doc/src/images/mainwindowlayout.png
Binary files differ
diff --git a/doc/src/images/mainwindows-examples.png b/doc/src/images/mainwindows-examples.png
new file mode 100644
index 0000000..45bf0ab
--- /dev/null
+++ b/doc/src/images/mainwindows-examples.png
Binary files differ
diff --git a/doc/src/images/mandelbrot-example.png b/doc/src/images/mandelbrot-example.png
new file mode 100644
index 0000000..f581783
--- /dev/null
+++ b/doc/src/images/mandelbrot-example.png
Binary files differ
diff --git a/doc/src/images/mandelbrot_scroll1.png b/doc/src/images/mandelbrot_scroll1.png
new file mode 100644
index 0000000..b800455
--- /dev/null
+++ b/doc/src/images/mandelbrot_scroll1.png
Binary files differ
diff --git a/doc/src/images/mandelbrot_scroll2.png b/doc/src/images/mandelbrot_scroll2.png
new file mode 100644
index 0000000..704ea0a
--- /dev/null
+++ b/doc/src/images/mandelbrot_scroll2.png
Binary files differ
diff --git a/doc/src/images/mandelbrot_scroll3.png b/doc/src/images/mandelbrot_scroll3.png
new file mode 100644
index 0000000..8b48211
--- /dev/null
+++ b/doc/src/images/mandelbrot_scroll3.png
Binary files differ
diff --git a/doc/src/images/mandelbrot_zoom1.png b/doc/src/images/mandelbrot_zoom1.png
new file mode 100644
index 0000000..30190e4
--- /dev/null
+++ b/doc/src/images/mandelbrot_zoom1.png
Binary files differ
diff --git a/doc/src/images/mandelbrot_zoom2.png b/doc/src/images/mandelbrot_zoom2.png
new file mode 100644
index 0000000..148ac77
--- /dev/null
+++ b/doc/src/images/mandelbrot_zoom2.png
Binary files differ
diff --git a/doc/src/images/mandelbrot_zoom3.png b/doc/src/images/mandelbrot_zoom3.png
new file mode 100644
index 0000000..a669f4b
--- /dev/null
+++ b/doc/src/images/mandelbrot_zoom3.png
Binary files differ
diff --git a/doc/src/images/masterdetail-example.png b/doc/src/images/masterdetail-example.png
new file mode 100644
index 0000000..bc282b7
--- /dev/null
+++ b/doc/src/images/masterdetail-example.png
Binary files differ
diff --git a/doc/src/images/mdi-cascade.png b/doc/src/images/mdi-cascade.png
new file mode 100644
index 0000000..ca55a5b
--- /dev/null
+++ b/doc/src/images/mdi-cascade.png
Binary files differ
diff --git a/doc/src/images/mdi-example.png b/doc/src/images/mdi-example.png
new file mode 100644
index 0000000..240f9e2
--- /dev/null
+++ b/doc/src/images/mdi-example.png
Binary files differ
diff --git a/doc/src/images/mdi-tile.png b/doc/src/images/mdi-tile.png
new file mode 100644
index 0000000..1486d96
--- /dev/null
+++ b/doc/src/images/mdi-tile.png
Binary files differ
diff --git a/doc/src/images/mediaplayer-demo.png b/doc/src/images/mediaplayer-demo.png
new file mode 100644
index 0000000..2c1f9b4
--- /dev/null
+++ b/doc/src/images/mediaplayer-demo.png
Binary files differ
diff --git a/doc/src/images/menus-example.png b/doc/src/images/menus-example.png
new file mode 100644
index 0000000..81e6e0d
--- /dev/null
+++ b/doc/src/images/menus-example.png
Binary files differ
diff --git a/doc/src/images/modelindex-no-parent.png b/doc/src/images/modelindex-no-parent.png
new file mode 100644
index 0000000..9c6258e
--- /dev/null
+++ b/doc/src/images/modelindex-no-parent.png
Binary files differ
diff --git a/doc/src/images/modelindex-parent.png b/doc/src/images/modelindex-parent.png
new file mode 100644
index 0000000..26d4158
--- /dev/null
+++ b/doc/src/images/modelindex-parent.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-append-columns.png b/doc/src/images/modelview-begin-append-columns.png
new file mode 100644
index 0000000..8d13b17
--- /dev/null
+++ b/doc/src/images/modelview-begin-append-columns.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-append-rows.png b/doc/src/images/modelview-begin-append-rows.png
new file mode 100644
index 0000000..50d04c3
--- /dev/null
+++ b/doc/src/images/modelview-begin-append-rows.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-insert-columns.png b/doc/src/images/modelview-begin-insert-columns.png
new file mode 100644
index 0000000..30eeb82
--- /dev/null
+++ b/doc/src/images/modelview-begin-insert-columns.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-insert-rows.png b/doc/src/images/modelview-begin-insert-rows.png
new file mode 100644
index 0000000..b4d6eda
--- /dev/null
+++ b/doc/src/images/modelview-begin-insert-rows.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-remove-columns.png b/doc/src/images/modelview-begin-remove-columns.png
new file mode 100644
index 0000000..aee60e0
--- /dev/null
+++ b/doc/src/images/modelview-begin-remove-columns.png
Binary files differ
diff --git a/doc/src/images/modelview-begin-remove-rows.png b/doc/src/images/modelview-begin-remove-rows.png
new file mode 100644
index 0000000..8e95187
--- /dev/null
+++ b/doc/src/images/modelview-begin-remove-rows.png
Binary files differ
diff --git a/doc/src/images/modelview-listmodel.png b/doc/src/images/modelview-listmodel.png
new file mode 100644
index 0000000..6be5e15
--- /dev/null
+++ b/doc/src/images/modelview-listmodel.png
Binary files differ
diff --git a/doc/src/images/modelview-models.png b/doc/src/images/modelview-models.png
new file mode 100644
index 0000000..183a7cf
--- /dev/null
+++ b/doc/src/images/modelview-models.png
Binary files differ
diff --git a/doc/src/images/modelview-overview.png b/doc/src/images/modelview-overview.png
new file mode 100644
index 0000000..41e3a68
--- /dev/null
+++ b/doc/src/images/modelview-overview.png
Binary files differ
diff --git a/doc/src/images/modelview-roles.png b/doc/src/images/modelview-roles.png
new file mode 100644
index 0000000..2a60ce7
--- /dev/null
+++ b/doc/src/images/modelview-roles.png
Binary files differ
diff --git a/doc/src/images/modelview-tablemodel.png b/doc/src/images/modelview-tablemodel.png
new file mode 100644
index 0000000..9a9ea2f
--- /dev/null
+++ b/doc/src/images/modelview-tablemodel.png
Binary files differ
diff --git a/doc/src/images/modelview-treemodel.png b/doc/src/images/modelview-treemodel.png
new file mode 100644
index 0000000..f7b02eb
--- /dev/null
+++ b/doc/src/images/modelview-treemodel.png
Binary files differ
diff --git a/doc/src/images/motif-calendarwidget.png b/doc/src/images/motif-calendarwidget.png
new file mode 100644
index 0000000..4ce6aeb
--- /dev/null
+++ b/doc/src/images/motif-calendarwidget.png
Binary files differ
diff --git a/doc/src/images/motif-checkbox.png b/doc/src/images/motif-checkbox.png
new file mode 100644
index 0000000..2a26327
--- /dev/null
+++ b/doc/src/images/motif-checkbox.png
Binary files differ
diff --git a/doc/src/images/motif-combobox.png b/doc/src/images/motif-combobox.png
new file mode 100644
index 0000000..2a288d9
--- /dev/null
+++ b/doc/src/images/motif-combobox.png
Binary files differ
diff --git a/doc/src/images/motif-dateedit.png b/doc/src/images/motif-dateedit.png
new file mode 100644
index 0000000..d00c45f
--- /dev/null
+++ b/doc/src/images/motif-dateedit.png
Binary files differ
diff --git a/doc/src/images/motif-datetimeedit.png b/doc/src/images/motif-datetimeedit.png
new file mode 100644
index 0000000..cc43ef8
--- /dev/null
+++ b/doc/src/images/motif-datetimeedit.png
Binary files differ
diff --git a/doc/src/images/motif-dial.png b/doc/src/images/motif-dial.png
new file mode 100644
index 0000000..36b3ff7
--- /dev/null
+++ b/doc/src/images/motif-dial.png
Binary files differ
diff --git a/doc/src/images/motif-doublespinbox.png b/doc/src/images/motif-doublespinbox.png
new file mode 100644
index 0000000..6092913
--- /dev/null
+++ b/doc/src/images/motif-doublespinbox.png
Binary files differ
diff --git a/doc/src/images/motif-fontcombobox.png b/doc/src/images/motif-fontcombobox.png
new file mode 100644
index 0000000..c07452d
--- /dev/null
+++ b/doc/src/images/motif-fontcombobox.png
Binary files differ
diff --git a/doc/src/images/motif-frame.png b/doc/src/images/motif-frame.png
new file mode 100644
index 0000000..55dcc32
--- /dev/null
+++ b/doc/src/images/motif-frame.png
Binary files differ
diff --git a/doc/src/images/motif-groupbox.png b/doc/src/images/motif-groupbox.png
new file mode 100644
index 0000000..13742b1
--- /dev/null
+++ b/doc/src/images/motif-groupbox.png
Binary files differ
diff --git a/doc/src/images/motif-horizontalscrollbar.png b/doc/src/images/motif-horizontalscrollbar.png
new file mode 100644
index 0000000..dab1d3f
--- /dev/null
+++ b/doc/src/images/motif-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/images/motif-label.png b/doc/src/images/motif-label.png
new file mode 100644
index 0000000..7ae6674
--- /dev/null
+++ b/doc/src/images/motif-label.png
Binary files differ
diff --git a/doc/src/images/motif-lcdnumber.png b/doc/src/images/motif-lcdnumber.png
new file mode 100644
index 0000000..e2cc9a8
--- /dev/null
+++ b/doc/src/images/motif-lcdnumber.png
Binary files differ
diff --git a/doc/src/images/motif-lineedit.png b/doc/src/images/motif-lineedit.png
new file mode 100644
index 0000000..a335c8c
--- /dev/null
+++ b/doc/src/images/motif-lineedit.png
Binary files differ
diff --git a/doc/src/images/motif-listview.png b/doc/src/images/motif-listview.png
new file mode 100644
index 0000000..47bd3ea
--- /dev/null
+++ b/doc/src/images/motif-listview.png
Binary files differ
diff --git a/doc/src/images/motif-menubar.png b/doc/src/images/motif-menubar.png
new file mode 100644
index 0000000..f1d9f4b
--- /dev/null
+++ b/doc/src/images/motif-menubar.png
Binary files differ
diff --git a/doc/src/images/motif-progressbar.png b/doc/src/images/motif-progressbar.png
new file mode 100644
index 0000000..f6d6979
--- /dev/null
+++ b/doc/src/images/motif-progressbar.png
Binary files differ
diff --git a/doc/src/images/motif-pushbutton.png b/doc/src/images/motif-pushbutton.png
new file mode 100644
index 0000000..9dc6a9d
--- /dev/null
+++ b/doc/src/images/motif-pushbutton.png
Binary files differ
diff --git a/doc/src/images/motif-radiobutton.png b/doc/src/images/motif-radiobutton.png
new file mode 100644
index 0000000..468e54c
--- /dev/null
+++ b/doc/src/images/motif-radiobutton.png
Binary files differ
diff --git a/doc/src/images/motif-slider.png b/doc/src/images/motif-slider.png
new file mode 100644
index 0000000..6301e2b
--- /dev/null
+++ b/doc/src/images/motif-slider.png
Binary files differ
diff --git a/doc/src/images/motif-spinbox.png b/doc/src/images/motif-spinbox.png
new file mode 100644
index 0000000..9acc282
--- /dev/null
+++ b/doc/src/images/motif-spinbox.png
Binary files differ
diff --git a/doc/src/images/motif-tableview.png b/doc/src/images/motif-tableview.png
new file mode 100644
index 0000000..a1d205a
--- /dev/null
+++ b/doc/src/images/motif-tableview.png
Binary files differ
diff --git a/doc/src/images/motif-tabwidget.png b/doc/src/images/motif-tabwidget.png
new file mode 100644
index 0000000..19da66a
--- /dev/null
+++ b/doc/src/images/motif-tabwidget.png
Binary files differ
diff --git a/doc/src/images/motif-textedit.png b/doc/src/images/motif-textedit.png
new file mode 100644
index 0000000..205bc19
--- /dev/null
+++ b/doc/src/images/motif-textedit.png
Binary files differ
diff --git a/doc/src/images/motif-timeedit.png b/doc/src/images/motif-timeedit.png
new file mode 100644
index 0000000..1ad459b
--- /dev/null
+++ b/doc/src/images/motif-timeedit.png
Binary files differ
diff --git a/doc/src/images/motif-todo.png b/doc/src/images/motif-todo.png
new file mode 100644
index 0000000..be39c48
--- /dev/null
+++ b/doc/src/images/motif-todo.png
Binary files differ
diff --git a/doc/src/images/motif-toolbox.png b/doc/src/images/motif-toolbox.png
new file mode 100644
index 0000000..4bc3c37
--- /dev/null
+++ b/doc/src/images/motif-toolbox.png
Binary files differ
diff --git a/doc/src/images/motif-toolbutton.png b/doc/src/images/motif-toolbutton.png
new file mode 100644
index 0000000..8ef51dd
--- /dev/null
+++ b/doc/src/images/motif-toolbutton.png
Binary files differ
diff --git a/doc/src/images/motif-treeview.png b/doc/src/images/motif-treeview.png
new file mode 100644
index 0000000..a7dd0f2
--- /dev/null
+++ b/doc/src/images/motif-treeview.png
Binary files differ
diff --git a/doc/src/images/movie-example.png b/doc/src/images/movie-example.png
new file mode 100644
index 0000000..713f563
--- /dev/null
+++ b/doc/src/images/movie-example.png
Binary files differ
diff --git a/doc/src/images/msgbox1.png b/doc/src/images/msgbox1.png
new file mode 100644
index 0000000..1380e20
--- /dev/null
+++ b/doc/src/images/msgbox1.png
Binary files differ
diff --git a/doc/src/images/msgbox2.png b/doc/src/images/msgbox2.png
new file mode 100644
index 0000000..e794699
--- /dev/null
+++ b/doc/src/images/msgbox2.png
Binary files differ
diff --git a/doc/src/images/msgbox3.png b/doc/src/images/msgbox3.png
new file mode 100644
index 0000000..bd81f4d
--- /dev/null
+++ b/doc/src/images/msgbox3.png
Binary files differ
diff --git a/doc/src/images/msgbox4.png b/doc/src/images/msgbox4.png
new file mode 100644
index 0000000..dbe6701
--- /dev/null
+++ b/doc/src/images/msgbox4.png
Binary files differ
diff --git a/doc/src/images/multipleinheritance-example.png b/doc/src/images/multipleinheritance-example.png
new file mode 100644
index 0000000..9e89292
--- /dev/null
+++ b/doc/src/images/multipleinheritance-example.png
Binary files differ
diff --git a/doc/src/images/musicplayer.png b/doc/src/images/musicplayer.png
new file mode 100644
index 0000000..4f3ebf7
--- /dev/null
+++ b/doc/src/images/musicplayer.png
Binary files differ
diff --git a/doc/src/images/network-chat-example.png b/doc/src/images/network-chat-example.png
new file mode 100644
index 0000000..949bb07
--- /dev/null
+++ b/doc/src/images/network-chat-example.png
Binary files differ
diff --git a/doc/src/images/network-examples.png b/doc/src/images/network-examples.png
new file mode 100644
index 0000000..15dfba8
--- /dev/null
+++ b/doc/src/images/network-examples.png
Binary files differ
diff --git a/doc/src/images/noforeignkeys.png b/doc/src/images/noforeignkeys.png
new file mode 100644
index 0000000..62a4452
--- /dev/null
+++ b/doc/src/images/noforeignkeys.png
Binary files differ
diff --git a/doc/src/images/opengl-examples.png b/doc/src/images/opengl-examples.png
new file mode 100644
index 0000000..8acdf8c
--- /dev/null
+++ b/doc/src/images/opengl-examples.png
Binary files differ
diff --git a/doc/src/images/orderform-example-detailsdialog.png b/doc/src/images/orderform-example-detailsdialog.png
new file mode 100644
index 0000000..8826369
--- /dev/null
+++ b/doc/src/images/orderform-example-detailsdialog.png
Binary files differ
diff --git a/doc/src/images/orderform-example.png b/doc/src/images/orderform-example.png
new file mode 100644
index 0000000..c8545ad
--- /dev/null
+++ b/doc/src/images/orderform-example.png
Binary files differ
diff --git a/doc/src/images/overpainting-example.png b/doc/src/images/overpainting-example.png
new file mode 100644
index 0000000..0368dca
--- /dev/null
+++ b/doc/src/images/overpainting-example.png
Binary files differ
diff --git a/doc/src/images/padnavigator-example.png b/doc/src/images/padnavigator-example.png
new file mode 100644
index 0000000..d766557
--- /dev/null
+++ b/doc/src/images/padnavigator-example.png
Binary files differ
diff --git a/doc/src/images/painterpaths-example.png b/doc/src/images/painterpaths-example.png
new file mode 100644
index 0000000..7e1220d
--- /dev/null
+++ b/doc/src/images/painterpaths-example.png
Binary files differ
diff --git a/doc/src/images/painting-examples.png b/doc/src/images/painting-examples.png
new file mode 100644
index 0000000..214004c
--- /dev/null
+++ b/doc/src/images/painting-examples.png
Binary files differ
diff --git a/doc/src/images/paintsystem-antialiasing.png b/doc/src/images/paintsystem-antialiasing.png
new file mode 100644
index 0000000..1275841
--- /dev/null
+++ b/doc/src/images/paintsystem-antialiasing.png
Binary files differ
diff --git a/doc/src/images/paintsystem-core.png b/doc/src/images/paintsystem-core.png
new file mode 100644
index 0000000..7d6a8e5
--- /dev/null
+++ b/doc/src/images/paintsystem-core.png
Binary files differ
diff --git a/doc/src/images/paintsystem-devices.png b/doc/src/images/paintsystem-devices.png
new file mode 100644
index 0000000..7b81b7c
--- /dev/null
+++ b/doc/src/images/paintsystem-devices.png
Binary files differ
diff --git a/doc/src/images/paintsystem-fancygradient.png b/doc/src/images/paintsystem-fancygradient.png
new file mode 100644
index 0000000..701df29
--- /dev/null
+++ b/doc/src/images/paintsystem-fancygradient.png
Binary files differ
diff --git a/doc/src/images/paintsystem-gradients.png b/doc/src/images/paintsystem-gradients.png
new file mode 100644
index 0000000..50b2ed3
--- /dev/null
+++ b/doc/src/images/paintsystem-gradients.png
Binary files differ
diff --git a/doc/src/images/paintsystem-icon.png b/doc/src/images/paintsystem-icon.png
new file mode 100644
index 0000000..4623db0
--- /dev/null
+++ b/doc/src/images/paintsystem-icon.png
Binary files differ
diff --git a/doc/src/images/paintsystem-movie.png b/doc/src/images/paintsystem-movie.png
new file mode 100644
index 0000000..992ea9e
--- /dev/null
+++ b/doc/src/images/paintsystem-movie.png
Binary files differ
diff --git a/doc/src/images/paintsystem-painterpath.png b/doc/src/images/paintsystem-painterpath.png
new file mode 100644
index 0000000..f8154f2
--- /dev/null
+++ b/doc/src/images/paintsystem-painterpath.png
Binary files differ
diff --git a/doc/src/images/paintsystem-stylepainter.png b/doc/src/images/paintsystem-stylepainter.png
new file mode 100644
index 0000000..a67c6c5
--- /dev/null
+++ b/doc/src/images/paintsystem-stylepainter.png
Binary files differ
diff --git a/doc/src/images/paintsystem-svg.png b/doc/src/images/paintsystem-svg.png
new file mode 100644
index 0000000..ecc8ef8
--- /dev/null
+++ b/doc/src/images/paintsystem-svg.png
Binary files differ
diff --git a/doc/src/images/palette.png b/doc/src/images/palette.png
new file mode 100644
index 0000000..832a5a5
--- /dev/null
+++ b/doc/src/images/palette.png
Binary files differ
diff --git a/doc/src/images/parent-child-widgets.png b/doc/src/images/parent-child-widgets.png
new file mode 100644
index 0000000..094e2e9
--- /dev/null
+++ b/doc/src/images/parent-child-widgets.png
Binary files differ
diff --git a/doc/src/images/pathexample.png b/doc/src/images/pathexample.png
new file mode 100644
index 0000000..7a07db3
--- /dev/null
+++ b/doc/src/images/pathexample.png
Binary files differ
diff --git a/doc/src/images/pathstroke-demo.png b/doc/src/images/pathstroke-demo.png
new file mode 100644
index 0000000..2df765f
--- /dev/null
+++ b/doc/src/images/pathstroke-demo.png
Binary files differ
diff --git a/doc/src/images/patternist-importFlow.png b/doc/src/images/patternist-importFlow.png
new file mode 100644
index 0000000..cca5fa0
--- /dev/null
+++ b/doc/src/images/patternist-importFlow.png
Binary files differ
diff --git a/doc/src/images/patternist-wordProcessor.png b/doc/src/images/patternist-wordProcessor.png
new file mode 100644
index 0000000..0901330
--- /dev/null
+++ b/doc/src/images/patternist-wordProcessor.png
Binary files differ
diff --git a/doc/src/images/pbuffers-example.png b/doc/src/images/pbuffers-example.png
new file mode 100644
index 0000000..bafb05a
--- /dev/null
+++ b/doc/src/images/pbuffers-example.png
Binary files differ
diff --git a/doc/src/images/pbuffers2-example.png b/doc/src/images/pbuffers2-example.png
new file mode 100644
index 0000000..4a9c717
--- /dev/null
+++ b/doc/src/images/pbuffers2-example.png
Binary files differ
diff --git a/doc/src/images/phonon-examples.png b/doc/src/images/phonon-examples.png
new file mode 100644
index 0000000..56b5137
--- /dev/null
+++ b/doc/src/images/phonon-examples.png
Binary files differ
diff --git a/doc/src/images/pixelator-example.png b/doc/src/images/pixelator-example.png
new file mode 100644
index 0000000..b6273c7
--- /dev/null
+++ b/doc/src/images/pixelator-example.png
Binary files differ
diff --git a/doc/src/images/pixmapfilter-example.png b/doc/src/images/pixmapfilter-example.png
new file mode 100644
index 0000000..29a6ddc
--- /dev/null
+++ b/doc/src/images/pixmapfilter-example.png
Binary files differ
diff --git a/doc/src/images/pixmapfilterexample-colorize.png b/doc/src/images/pixmapfilterexample-colorize.png
new file mode 100644
index 0000000..0e023a5
--- /dev/null
+++ b/doc/src/images/pixmapfilterexample-colorize.png
Binary files differ
diff --git a/doc/src/images/pixmapfilterexample-dropshadow.png b/doc/src/images/pixmapfilterexample-dropshadow.png
new file mode 100644
index 0000000..be43659
--- /dev/null
+++ b/doc/src/images/pixmapfilterexample-dropshadow.png
Binary files differ
diff --git a/doc/src/images/plaintext-layout.png b/doc/src/images/plaintext-layout.png
new file mode 100644
index 0000000..9172d7a
--- /dev/null
+++ b/doc/src/images/plaintext-layout.png
Binary files differ
diff --git a/doc/src/images/plastique-calendarwidget.png b/doc/src/images/plastique-calendarwidget.png
new file mode 100644
index 0000000..5e65945
--- /dev/null
+++ b/doc/src/images/plastique-calendarwidget.png
Binary files differ
diff --git a/doc/src/images/plastique-checkbox.png b/doc/src/images/plastique-checkbox.png
new file mode 100644
index 0000000..91a5109
--- /dev/null
+++ b/doc/src/images/plastique-checkbox.png
Binary files differ
diff --git a/doc/src/images/plastique-colordialog.png b/doc/src/images/plastique-colordialog.png
new file mode 100644
index 0000000..68bf4d0
--- /dev/null
+++ b/doc/src/images/plastique-colordialog.png
Binary files differ
diff --git a/doc/src/images/plastique-combobox.png b/doc/src/images/plastique-combobox.png
new file mode 100644
index 0000000..e3bf8a3
--- /dev/null
+++ b/doc/src/images/plastique-combobox.png
Binary files differ
diff --git a/doc/src/images/plastique-dateedit.png b/doc/src/images/plastique-dateedit.png
new file mode 100644
index 0000000..2e28a40
--- /dev/null
+++ b/doc/src/images/plastique-dateedit.png
Binary files differ
diff --git a/doc/src/images/plastique-datetimeedit.png b/doc/src/images/plastique-datetimeedit.png
new file mode 100644
index 0000000..810bf16
--- /dev/null
+++ b/doc/src/images/plastique-datetimeedit.png
Binary files differ
diff --git a/doc/src/images/plastique-dial.png b/doc/src/images/plastique-dial.png
new file mode 100644
index 0000000..b65e7c7
--- /dev/null
+++ b/doc/src/images/plastique-dial.png
Binary files differ
diff --git a/doc/src/images/plastique-dialogbuttonbox.png b/doc/src/images/plastique-dialogbuttonbox.png
new file mode 100644
index 0000000..823b352
--- /dev/null
+++ b/doc/src/images/plastique-dialogbuttonbox.png
Binary files differ
diff --git a/doc/src/images/plastique-doublespinbox.png b/doc/src/images/plastique-doublespinbox.png
new file mode 100644
index 0000000..627c4a2
--- /dev/null
+++ b/doc/src/images/plastique-doublespinbox.png
Binary files differ
diff --git a/doc/src/images/plastique-filedialog.png b/doc/src/images/plastique-filedialog.png
new file mode 100644
index 0000000..60f3c4b
--- /dev/null
+++ b/doc/src/images/plastique-filedialog.png
Binary files differ
diff --git a/doc/src/images/plastique-fontcombobox-open.png b/doc/src/images/plastique-fontcombobox-open.png
new file mode 100644
index 0000000..37816c4
--- /dev/null
+++ b/doc/src/images/plastique-fontcombobox-open.png
Binary files differ
diff --git a/doc/src/images/plastique-fontcombobox.png b/doc/src/images/plastique-fontcombobox.png
new file mode 100644
index 0000000..d382308
--- /dev/null
+++ b/doc/src/images/plastique-fontcombobox.png
Binary files differ
diff --git a/doc/src/images/plastique-fontdialog.png b/doc/src/images/plastique-fontdialog.png
new file mode 100644
index 0000000..7e799a8
--- /dev/null
+++ b/doc/src/images/plastique-fontdialog.png
Binary files differ
diff --git a/doc/src/images/plastique-frame.png b/doc/src/images/plastique-frame.png
new file mode 100644
index 0000000..9f81f6c
--- /dev/null
+++ b/doc/src/images/plastique-frame.png
Binary files differ
diff --git a/doc/src/images/plastique-groupbox.png b/doc/src/images/plastique-groupbox.png
new file mode 100644
index 0000000..d353c40
--- /dev/null
+++ b/doc/src/images/plastique-groupbox.png
Binary files differ
diff --git a/doc/src/images/plastique-horizontalscrollbar.png b/doc/src/images/plastique-horizontalscrollbar.png
new file mode 100644
index 0000000..d20300c
--- /dev/null
+++ b/doc/src/images/plastique-horizontalscrollbar.png
Binary files differ
diff --git a/doc/src/images/plastique-label.png b/doc/src/images/plastique-label.png
new file mode 100644
index 0000000..d2a55a8
--- /dev/null
+++ b/doc/src/images/plastique-label.png
Binary files differ
diff --git a/doc/src/images/plastique-lcdnumber.png b/doc/src/images/plastique-lcdnumber.png
new file mode 100644
index 0000000..74149ee
--- /dev/null
+++ b/doc/src/images/plastique-lcdnumber.png
Binary files differ
diff --git a/doc/src/images/plastique-lineedit.png b/doc/src/images/plastique-lineedit.png
new file mode 100644
index 0000000..f455383
--- /dev/null
+++ b/doc/src/images/plastique-lineedit.png
Binary files differ
diff --git a/doc/src/images/plastique-listview.png b/doc/src/images/plastique-listview.png
new file mode 100644
index 0000000..64bd00f
--- /dev/null
+++ b/doc/src/images/plastique-listview.png
Binary files differ
diff --git a/doc/src/images/plastique-menu.png b/doc/src/images/plastique-menu.png
new file mode 100644
index 0000000..88df249
--- /dev/null
+++ b/doc/src/images/plastique-menu.png
Binary files differ
diff --git a/doc/src/images/plastique-menubar.png b/doc/src/images/plastique-menubar.png
new file mode 100644
index 0000000..642f95d
--- /dev/null
+++ b/doc/src/images/plastique-menubar.png
Binary files differ
diff --git a/doc/src/images/plastique-messagebox.png b/doc/src/images/plastique-messagebox.png
new file mode 100644
index 0000000..89178fc
--- /dev/null
+++ b/doc/src/images/plastique-messagebox.png
Binary files differ
diff --git a/doc/src/images/plastique-printdialog-properties.png b/doc/src/images/plastique-printdialog-properties.png
new file mode 100644
index 0000000..38c1ae7
--- /dev/null
+++ b/doc/src/images/plastique-printdialog-properties.png
Binary files differ
diff --git a/doc/src/images/plastique-printdialog.png b/doc/src/images/plastique-printdialog.png
new file mode 100644
index 0000000..3f8af01
--- /dev/null
+++ b/doc/src/images/plastique-printdialog.png
Binary files differ
diff --git a/doc/src/images/plastique-progressbar.png b/doc/src/images/plastique-progressbar.png
new file mode 100644
index 0000000..fe8dd90
--- /dev/null
+++ b/doc/src/images/plastique-progressbar.png
Binary files differ
diff --git a/doc/src/images/plastique-progressdialog.png b/doc/src/images/plastique-progressdialog.png
new file mode 100644
index 0000000..4373bca
--- /dev/null
+++ b/doc/src/images/plastique-progressdialog.png
Binary files differ
diff --git a/doc/src/images/plastique-pushbutton-menu.png b/doc/src/images/plastique-pushbutton-menu.png
new file mode 100644
index 0000000..d090033
--- /dev/null
+++ b/doc/src/images/plastique-pushbutton-menu.png
Binary files differ
diff --git a/doc/src/images/plastique-pushbutton.png b/doc/src/images/plastique-pushbutton.png
new file mode 100644
index 0000000..83c44fd
--- /dev/null
+++ b/doc/src/images/plastique-pushbutton.png
Binary files differ
diff --git a/doc/src/images/plastique-radiobutton.png b/doc/src/images/plastique-radiobutton.png
new file mode 100644
index 0000000..a2c820d
--- /dev/null
+++ b/doc/src/images/plastique-radiobutton.png
Binary files differ
diff --git a/doc/src/images/plastique-sizegrip.png b/doc/src/images/plastique-sizegrip.png
new file mode 100644
index 0000000..09a551e
--- /dev/null
+++ b/doc/src/images/plastique-sizegrip.png
Binary files differ
diff --git a/doc/src/images/plastique-slider.png b/doc/src/images/plastique-slider.png
new file mode 100644
index 0000000..492f0fd
--- /dev/null
+++ b/doc/src/images/plastique-slider.png
Binary files differ
diff --git a/doc/src/images/plastique-spinbox.png b/doc/src/images/plastique-spinbox.png
new file mode 100644
index 0000000..af15db3
--- /dev/null
+++ b/doc/src/images/plastique-spinbox.png
Binary files differ
diff --git a/doc/src/images/plastique-statusbar.png b/doc/src/images/plastique-statusbar.png
new file mode 100644
index 0000000..c8f9792
--- /dev/null
+++ b/doc/src/images/plastique-statusbar.png
Binary files differ
diff --git a/doc/src/images/plastique-tabbar-truncated.png b/doc/src/images/plastique-tabbar-truncated.png
new file mode 100644
index 0000000..8e906d9
--- /dev/null
+++ b/doc/src/images/plastique-tabbar-truncated.png
Binary files differ
diff --git a/doc/src/images/plastique-tabbar.png b/doc/src/images/plastique-tabbar.png
new file mode 100644
index 0000000..3371dda
--- /dev/null
+++ b/doc/src/images/plastique-tabbar.png
Binary files differ
diff --git a/doc/src/images/plastique-tableview.png b/doc/src/images/plastique-tableview.png
new file mode 100644
index 0000000..b20c1cc
--- /dev/null
+++ b/doc/src/images/plastique-tableview.png
Binary files differ
diff --git a/doc/src/images/plastique-tabwidget.png b/doc/src/images/plastique-tabwidget.png
new file mode 100644
index 0000000..92ae398
--- /dev/null
+++ b/doc/src/images/plastique-tabwidget.png
Binary files differ
diff --git a/doc/src/images/plastique-textedit.png b/doc/src/images/plastique-textedit.png
new file mode 100644
index 0000000..a802d75
--- /dev/null
+++ b/doc/src/images/plastique-textedit.png
Binary files differ
diff --git a/doc/src/images/plastique-timeedit.png b/doc/src/images/plastique-timeedit.png
new file mode 100644
index 0000000..2d70b84
--- /dev/null
+++ b/doc/src/images/plastique-timeedit.png
Binary files differ
diff --git a/doc/src/images/plastique-toolbox.png b/doc/src/images/plastique-toolbox.png
new file mode 100644
index 0000000..10bcd7a
--- /dev/null
+++ b/doc/src/images/plastique-toolbox.png
Binary files differ
diff --git a/doc/src/images/plastique-toolbutton.png b/doc/src/images/plastique-toolbutton.png
new file mode 100644
index 0000000..4e51831
--- /dev/null
+++ b/doc/src/images/plastique-toolbutton.png
Binary files differ
diff --git a/doc/src/images/plastique-treeview.png b/doc/src/images/plastique-treeview.png
new file mode 100644
index 0000000..db0bc01
--- /dev/null
+++ b/doc/src/images/plastique-treeview.png
Binary files differ
diff --git a/doc/src/images/plugandpaint-plugindialog.png b/doc/src/images/plugandpaint-plugindialog.png
new file mode 100644
index 0000000..4b601bd
--- /dev/null
+++ b/doc/src/images/plugandpaint-plugindialog.png
Binary files differ
diff --git a/doc/src/images/plugandpaint.png b/doc/src/images/plugandpaint.png
new file mode 100644
index 0000000..bd5d001
--- /dev/null
+++ b/doc/src/images/plugandpaint.png
Binary files differ
diff --git a/doc/src/images/portedasteroids-example.png b/doc/src/images/portedasteroids-example.png
new file mode 100644
index 0000000..8dbe673
--- /dev/null
+++ b/doc/src/images/portedasteroids-example.png
Binary files differ
diff --git a/doc/src/images/portedcanvas-example.png b/doc/src/images/portedcanvas-example.png
new file mode 100644
index 0000000..b5fce51
--- /dev/null
+++ b/doc/src/images/portedcanvas-example.png
Binary files differ
diff --git a/doc/src/images/previewer-example.png b/doc/src/images/previewer-example.png
new file mode 100644
index 0000000..d930250
--- /dev/null
+++ b/doc/src/images/previewer-example.png
Binary files differ
diff --git a/doc/src/images/previewer-ui.png b/doc/src/images/previewer-ui.png
new file mode 100644
index 0000000..c92d136
--- /dev/null
+++ b/doc/src/images/previewer-ui.png
Binary files differ
diff --git a/doc/src/images/printer-rects.png b/doc/src/images/printer-rects.png
new file mode 100644
index 0000000..8ebea60
--- /dev/null
+++ b/doc/src/images/printer-rects.png
Binary files differ
diff --git a/doc/src/images/progressBar-stylesheet.png b/doc/src/images/progressBar-stylesheet.png
new file mode 100644
index 0000000..b4bf755
--- /dev/null
+++ b/doc/src/images/progressBar-stylesheet.png
Binary files differ
diff --git a/doc/src/images/progressBar2-stylesheet.png b/doc/src/images/progressBar2-stylesheet.png
new file mode 100644
index 0000000..8b5ecc0
--- /dev/null
+++ b/doc/src/images/progressBar2-stylesheet.png
Binary files differ
diff --git a/doc/src/images/propagation-custom.png b/doc/src/images/propagation-custom.png
new file mode 100644
index 0000000..866b44d
--- /dev/null
+++ b/doc/src/images/propagation-custom.png
Binary files differ
diff --git a/doc/src/images/propagation-standard.png b/doc/src/images/propagation-standard.png
new file mode 100644
index 0000000..b010fcc
--- /dev/null
+++ b/doc/src/images/propagation-standard.png
Binary files differ
diff --git a/doc/src/images/q3painter_rationale.png b/doc/src/images/q3painter_rationale.png
new file mode 100644
index 0000000..3c4835b
--- /dev/null
+++ b/doc/src/images/q3painter_rationale.png
Binary files differ
diff --git a/doc/src/images/qactiongroup-align.png b/doc/src/images/qactiongroup-align.png
new file mode 100644
index 0000000..65683e0
--- /dev/null
+++ b/doc/src/images/qactiongroup-align.png
Binary files differ
diff --git a/doc/src/images/qcalendarwidget-grid.png b/doc/src/images/qcalendarwidget-grid.png
new file mode 100644
index 0000000..3df4dd9
--- /dev/null
+++ b/doc/src/images/qcalendarwidget-grid.png
Binary files differ
diff --git a/doc/src/images/qcalendarwidget-maximum.png b/doc/src/images/qcalendarwidget-maximum.png
new file mode 100644
index 0000000..1e78d20
--- /dev/null
+++ b/doc/src/images/qcalendarwidget-maximum.png
Binary files differ
diff --git a/doc/src/images/qcalendarwidget-minimum.png b/doc/src/images/qcalendarwidget-minimum.png
new file mode 100644
index 0000000..f860429
--- /dev/null
+++ b/doc/src/images/qcalendarwidget-minimum.png
Binary files differ
diff --git a/doc/src/images/qcalendarwidget.png b/doc/src/images/qcalendarwidget.png
new file mode 100644
index 0000000..354a67a
--- /dev/null
+++ b/doc/src/images/qcalendarwidget.png
Binary files differ
diff --git a/doc/src/images/qcanvasellipse.png b/doc/src/images/qcanvasellipse.png
new file mode 100644
index 0000000..1fe82d0
--- /dev/null
+++ b/doc/src/images/qcanvasellipse.png
Binary files differ
diff --git a/doc/src/images/qcdestyle.png b/doc/src/images/qcdestyle.png
new file mode 100644
index 0000000..74fb332
--- /dev/null
+++ b/doc/src/images/qcdestyle.png
Binary files differ
diff --git a/doc/src/images/qcolor-cmyk.png b/doc/src/images/qcolor-cmyk.png
new file mode 100644
index 0000000..dfe8f67
--- /dev/null
+++ b/doc/src/images/qcolor-cmyk.png
Binary files differ
diff --git a/doc/src/images/qcolor-hsv.png b/doc/src/images/qcolor-hsv.png
new file mode 100644
index 0000000..49fdf77
--- /dev/null
+++ b/doc/src/images/qcolor-hsv.png
Binary files differ
diff --git a/doc/src/images/qcolor-hue.png b/doc/src/images/qcolor-hue.png
new file mode 100644
index 0000000..144b27c
--- /dev/null
+++ b/doc/src/images/qcolor-hue.png
Binary files differ
diff --git a/doc/src/images/qcolor-rgb.png b/doc/src/images/qcolor-rgb.png
new file mode 100644
index 0000000..fea4c63
--- /dev/null
+++ b/doc/src/images/qcolor-rgb.png
Binary files differ
diff --git a/doc/src/images/qcolor-saturation.png b/doc/src/images/qcolor-saturation.png
new file mode 100644
index 0000000..f28776a
--- /dev/null
+++ b/doc/src/images/qcolor-saturation.png
Binary files differ
diff --git a/doc/src/images/qcolor-value.png b/doc/src/images/qcolor-value.png
new file mode 100644
index 0000000..0e06912
--- /dev/null
+++ b/doc/src/images/qcolor-value.png
Binary files differ
diff --git a/doc/src/images/qcolumnview.png b/doc/src/images/qcolumnview.png
new file mode 100644
index 0000000..1d312bf
--- /dev/null
+++ b/doc/src/images/qcolumnview.png
Binary files differ
diff --git a/doc/src/images/qconicalgradient.png b/doc/src/images/qconicalgradient.png
new file mode 100644
index 0000000..8260306
--- /dev/null
+++ b/doc/src/images/qconicalgradient.png
Binary files differ
diff --git a/doc/src/images/qdatawidgetmapper-simple.png b/doc/src/images/qdatawidgetmapper-simple.png
new file mode 100644
index 0000000..784a433
--- /dev/null
+++ b/doc/src/images/qdatawidgetmapper-simple.png
Binary files differ
diff --git a/doc/src/images/qdesktopwidget.png b/doc/src/images/qdesktopwidget.png
new file mode 100644
index 0000000..02f8e8b
--- /dev/null
+++ b/doc/src/images/qdesktopwidget.png
Binary files differ
diff --git a/doc/src/images/qdockwindow.png b/doc/src/images/qdockwindow.png
new file mode 100644
index 0000000..98d2502
--- /dev/null
+++ b/doc/src/images/qdockwindow.png
Binary files differ
diff --git a/doc/src/images/qerrormessage.png b/doc/src/images/qerrormessage.png
new file mode 100644
index 0000000..b905f8a
--- /dev/null
+++ b/doc/src/images/qerrormessage.png
Binary files differ
diff --git a/doc/src/images/qfiledialog-expanded.png b/doc/src/images/qfiledialog-expanded.png
new file mode 100644
index 0000000..07d2606
--- /dev/null
+++ b/doc/src/images/qfiledialog-expanded.png
Binary files differ
diff --git a/doc/src/images/qfiledialog-small.png b/doc/src/images/qfiledialog-small.png
new file mode 100644
index 0000000..94d7aa5
--- /dev/null
+++ b/doc/src/images/qfiledialog-small.png
Binary files differ
diff --git a/doc/src/images/qformlayout-kde.png b/doc/src/images/qformlayout-kde.png
new file mode 100644
index 0000000..c32bb12
--- /dev/null
+++ b/doc/src/images/qformlayout-kde.png
Binary files differ
diff --git a/doc/src/images/qformlayout-mac.png b/doc/src/images/qformlayout-mac.png
new file mode 100644
index 0000000..0a0824e
--- /dev/null
+++ b/doc/src/images/qformlayout-mac.png
Binary files differ
diff --git a/doc/src/images/qformlayout-qpe.png b/doc/src/images/qformlayout-qpe.png
new file mode 100644
index 0000000..3abecc5
--- /dev/null
+++ b/doc/src/images/qformlayout-qpe.png
Binary files differ
diff --git a/doc/src/images/qformlayout-win.png b/doc/src/images/qformlayout-win.png
new file mode 100644
index 0000000..1ed44bd
--- /dev/null
+++ b/doc/src/images/qformlayout-win.png
Binary files differ
diff --git a/doc/src/images/qformlayout-with-6-children.png b/doc/src/images/qformlayout-with-6-children.png
new file mode 100644
index 0000000..f743599
--- /dev/null
+++ b/doc/src/images/qformlayout-with-6-children.png
Binary files differ
diff --git a/doc/src/images/qgradient-conical.png b/doc/src/images/qgradient-conical.png
new file mode 100644
index 0000000..cf06b70
--- /dev/null
+++ b/doc/src/images/qgradient-conical.png
Binary files differ
diff --git a/doc/src/images/qgradient-linear.png b/doc/src/images/qgradient-linear.png
new file mode 100644
index 0000000..5a5e880
--- /dev/null
+++ b/doc/src/images/qgradient-linear.png
Binary files differ
diff --git a/doc/src/images/qgradient-radial.png b/doc/src/images/qgradient-radial.png
new file mode 100644
index 0000000..95b9e9c
--- /dev/null
+++ b/doc/src/images/qgradient-radial.png
Binary files differ
diff --git a/doc/src/images/qgraphicsproxywidget-embed.png b/doc/src/images/qgraphicsproxywidget-embed.png
new file mode 100644
index 0000000..10d8f6f
--- /dev/null
+++ b/doc/src/images/qgraphicsproxywidget-embed.png
Binary files differ
diff --git a/doc/src/images/qgridlayout-with-5-children.png b/doc/src/images/qgridlayout-with-5-children.png
new file mode 100644
index 0000000..8d0c296
--- /dev/null
+++ b/doc/src/images/qgridlayout-with-5-children.png
Binary files differ
diff --git a/doc/src/images/qhbox-m.png b/doc/src/images/qhbox-m.png
new file mode 100644
index 0000000..4f0bc57
--- /dev/null
+++ b/doc/src/images/qhbox-m.png
Binary files differ
diff --git a/doc/src/images/qhboxlayout-with-5-children.png b/doc/src/images/qhboxlayout-with-5-children.png
new file mode 100644
index 0000000..9b48dc5
--- /dev/null
+++ b/doc/src/images/qhboxlayout-with-5-children.png
Binary files differ
diff --git a/doc/src/images/qimage-32bit.png b/doc/src/images/qimage-32bit.png
new file mode 100644
index 0000000..2a76d40
--- /dev/null
+++ b/doc/src/images/qimage-32bit.png
Binary files differ
diff --git a/doc/src/images/qimage-32bit_scaled.png b/doc/src/images/qimage-32bit_scaled.png
new file mode 100644
index 0000000..6932327
--- /dev/null
+++ b/doc/src/images/qimage-32bit_scaled.png
Binary files differ
diff --git a/doc/src/images/qimage-8bit.png b/doc/src/images/qimage-8bit.png
new file mode 100644
index 0000000..454e501
--- /dev/null
+++ b/doc/src/images/qimage-8bit.png
Binary files differ
diff --git a/doc/src/images/qimage-8bit_scaled.png b/doc/src/images/qimage-8bit_scaled.png
new file mode 100644
index 0000000..7cbf0f1
--- /dev/null
+++ b/doc/src/images/qimage-8bit_scaled.png
Binary files differ
diff --git a/doc/src/images/qimage-scaling.png b/doc/src/images/qimage-scaling.png
new file mode 100644
index 0000000..fcd7144
--- /dev/null
+++ b/doc/src/images/qimage-scaling.png
Binary files differ
diff --git a/doc/src/images/qline-coordinates.png b/doc/src/images/qline-coordinates.png
new file mode 100644
index 0000000..ac4fb98
--- /dev/null
+++ b/doc/src/images/qline-coordinates.png
Binary files differ
diff --git a/doc/src/images/qline-point.png b/doc/src/images/qline-point.png
new file mode 100644
index 0000000..3bc3664
--- /dev/null
+++ b/doc/src/images/qline-point.png
Binary files differ
diff --git a/doc/src/images/qlineargradient-pad.png b/doc/src/images/qlineargradient-pad.png
new file mode 100644
index 0000000..d77eb3d
--- /dev/null
+++ b/doc/src/images/qlineargradient-pad.png
Binary files differ
diff --git a/doc/src/images/qlineargradient-reflect.png b/doc/src/images/qlineargradient-reflect.png
new file mode 100644
index 0000000..dd12665
--- /dev/null
+++ b/doc/src/images/qlineargradient-reflect.png
Binary files differ
diff --git a/doc/src/images/qlineargradient-repeat.png b/doc/src/images/qlineargradient-repeat.png
new file mode 100644
index 0000000..e38203c
--- /dev/null
+++ b/doc/src/images/qlineargradient-repeat.png
Binary files differ
diff --git a/doc/src/images/qlinef-angle-identicaldirection.png b/doc/src/images/qlinef-angle-identicaldirection.png
new file mode 100644
index 0000000..18d6323
--- /dev/null
+++ b/doc/src/images/qlinef-angle-identicaldirection.png
Binary files differ
diff --git a/doc/src/images/qlinef-angle-oppositedirection.png b/doc/src/images/qlinef-angle-oppositedirection.png
new file mode 100644
index 0000000..bf52cfe
--- /dev/null
+++ b/doc/src/images/qlinef-angle-oppositedirection.png
Binary files differ
diff --git a/doc/src/images/qlinef-bounded.png b/doc/src/images/qlinef-bounded.png
new file mode 100644
index 0000000..136dd50
--- /dev/null
+++ b/doc/src/images/qlinef-bounded.png
Binary files differ
diff --git a/doc/src/images/qlinef-normalvector.png b/doc/src/images/qlinef-normalvector.png
new file mode 100644
index 0000000..b7d944f
--- /dev/null
+++ b/doc/src/images/qlinef-normalvector.png
Binary files differ
diff --git a/doc/src/images/qlinef-unbounded.png b/doc/src/images/qlinef-unbounded.png
new file mode 100644
index 0000000..75ead98
--- /dev/null
+++ b/doc/src/images/qlinef-unbounded.png
Binary files differ
diff --git a/doc/src/images/qlistbox-m.png b/doc/src/images/qlistbox-m.png
new file mode 100644
index 0000000..5b956bc
--- /dev/null
+++ b/doc/src/images/qlistbox-m.png
Binary files differ
diff --git a/doc/src/images/qlistbox-w.png b/doc/src/images/qlistbox-w.png
new file mode 100644
index 0000000..19798ea
--- /dev/null
+++ b/doc/src/images/qlistbox-w.png
Binary files differ
diff --git a/doc/src/images/qlistviewitems.png b/doc/src/images/qlistviewitems.png
new file mode 100644
index 0000000..fe862c7
--- /dev/null
+++ b/doc/src/images/qlistviewitems.png
Binary files differ
diff --git a/doc/src/images/qmacstyle.png b/doc/src/images/qmacstyle.png
new file mode 100644
index 0000000..dda3c35
--- /dev/null
+++ b/doc/src/images/qmacstyle.png
Binary files differ
diff --git a/doc/src/images/qmainwindow-qdockareas.png b/doc/src/images/qmainwindow-qdockareas.png
new file mode 100644
index 0000000..0eff42d
--- /dev/null
+++ b/doc/src/images/qmainwindow-qdockareas.png
Binary files differ
diff --git a/doc/src/images/qmatrix-combinedtransformation.png b/doc/src/images/qmatrix-combinedtransformation.png
new file mode 100644
index 0000000..f791bfa
--- /dev/null
+++ b/doc/src/images/qmatrix-combinedtransformation.png
Binary files differ
diff --git a/doc/src/images/qmatrix-representation.png b/doc/src/images/qmatrix-representation.png
new file mode 100644
index 0000000..2e3efd3
--- /dev/null
+++ b/doc/src/images/qmatrix-representation.png
Binary files differ
diff --git a/doc/src/images/qmatrix-simpletransformation.png b/doc/src/images/qmatrix-simpletransformation.png
new file mode 100644
index 0000000..dde8f4b
--- /dev/null
+++ b/doc/src/images/qmatrix-simpletransformation.png
Binary files differ
diff --git a/doc/src/images/qmdiarea-arrange.png b/doc/src/images/qmdiarea-arrange.png
new file mode 100644
index 0000000..14b0af5
--- /dev/null
+++ b/doc/src/images/qmdiarea-arrange.png
Binary files differ
diff --git a/doc/src/images/qmdisubwindowlayout.png b/doc/src/images/qmdisubwindowlayout.png
new file mode 100644
index 0000000..ffe5cc3
--- /dev/null
+++ b/doc/src/images/qmdisubwindowlayout.png
Binary files differ
diff --git a/doc/src/images/qmessagebox-crit.png b/doc/src/images/qmessagebox-crit.png
new file mode 100644
index 0000000..f30d3ee
--- /dev/null
+++ b/doc/src/images/qmessagebox-crit.png
Binary files differ
diff --git a/doc/src/images/qmessagebox-info.png b/doc/src/images/qmessagebox-info.png
new file mode 100644
index 0000000..1399406
--- /dev/null
+++ b/doc/src/images/qmessagebox-info.png
Binary files differ
diff --git a/doc/src/images/qmessagebox-quest.png b/doc/src/images/qmessagebox-quest.png
new file mode 100644
index 0000000..5943fdd
--- /dev/null
+++ b/doc/src/images/qmessagebox-quest.png
Binary files differ
diff --git a/doc/src/images/qmessagebox-warn.png b/doc/src/images/qmessagebox-warn.png
new file mode 100644
index 0000000..26a212e
--- /dev/null
+++ b/doc/src/images/qmessagebox-warn.png
Binary files differ
diff --git a/doc/src/images/qmotifstyle.png b/doc/src/images/qmotifstyle.png
new file mode 100644
index 0000000..b0a6d86
--- /dev/null
+++ b/doc/src/images/qmotifstyle.png
Binary files differ
diff --git a/doc/src/images/qobjectxmlmodel-example.png b/doc/src/images/qobjectxmlmodel-example.png
new file mode 100644
index 0000000..e40ba15
--- /dev/null
+++ b/doc/src/images/qobjectxmlmodel-example.png
Binary files differ
diff --git a/doc/src/images/qpainter-affinetransformations.png b/doc/src/images/qpainter-affinetransformations.png
new file mode 100644
index 0000000..fe2f9a0
--- /dev/null
+++ b/doc/src/images/qpainter-affinetransformations.png
Binary files differ
diff --git a/doc/src/images/qpainter-angles.png b/doc/src/images/qpainter-angles.png
new file mode 100644
index 0000000..00bd7d4
--- /dev/null
+++ b/doc/src/images/qpainter-angles.png
Binary files differ
diff --git a/doc/src/images/qpainter-arc.png b/doc/src/images/qpainter-arc.png
new file mode 100644
index 0000000..8cb9cec
--- /dev/null
+++ b/doc/src/images/qpainter-arc.png
Binary files differ
diff --git a/doc/src/images/qpainter-basicdrawing.png b/doc/src/images/qpainter-basicdrawing.png
new file mode 100644
index 0000000..3be48c8
--- /dev/null
+++ b/doc/src/images/qpainter-basicdrawing.png
Binary files differ
diff --git a/doc/src/images/qpainter-chord.png b/doc/src/images/qpainter-chord.png
new file mode 100644
index 0000000..a809086
--- /dev/null
+++ b/doc/src/images/qpainter-chord.png
Binary files differ
diff --git a/doc/src/images/qpainter-clock.png b/doc/src/images/qpainter-clock.png
new file mode 100644
index 0000000..3634754
--- /dev/null
+++ b/doc/src/images/qpainter-clock.png
Binary files differ
diff --git a/doc/src/images/qpainter-compositiondemo.png b/doc/src/images/qpainter-compositiondemo.png
new file mode 100644
index 0000000..40f62c7
--- /dev/null
+++ b/doc/src/images/qpainter-compositiondemo.png
Binary files differ
diff --git a/doc/src/images/qpainter-compositionmode.png b/doc/src/images/qpainter-compositionmode.png
new file mode 100644
index 0000000..1557720
--- /dev/null
+++ b/doc/src/images/qpainter-compositionmode.png
Binary files differ
diff --git a/doc/src/images/qpainter-compositionmode1.png b/doc/src/images/qpainter-compositionmode1.png
new file mode 100644
index 0000000..6753093
--- /dev/null
+++ b/doc/src/images/qpainter-compositionmode1.png
Binary files differ
diff --git a/doc/src/images/qpainter-compositionmode2.png b/doc/src/images/qpainter-compositionmode2.png
new file mode 100644
index 0000000..fc05afb
--- /dev/null
+++ b/doc/src/images/qpainter-compositionmode2.png
Binary files differ
diff --git a/doc/src/images/qpainter-concentriccircles.png b/doc/src/images/qpainter-concentriccircles.png
new file mode 100644
index 0000000..4889dcd
--- /dev/null
+++ b/doc/src/images/qpainter-concentriccircles.png
Binary files differ
diff --git a/doc/src/images/qpainter-ellipse.png b/doc/src/images/qpainter-ellipse.png
new file mode 100644
index 0000000..e7e78c3
--- /dev/null
+++ b/doc/src/images/qpainter-ellipse.png
Binary files differ
diff --git a/doc/src/images/qpainter-gradients.png b/doc/src/images/qpainter-gradients.png
new file mode 100644
index 0000000..b7bc6a3
--- /dev/null
+++ b/doc/src/images/qpainter-gradients.png
Binary files differ
diff --git a/doc/src/images/qpainter-line.png b/doc/src/images/qpainter-line.png
new file mode 100644
index 0000000..5f1cd97
--- /dev/null
+++ b/doc/src/images/qpainter-line.png
Binary files differ
diff --git a/doc/src/images/qpainter-painterpaths.png b/doc/src/images/qpainter-painterpaths.png
new file mode 100644
index 0000000..0762ca9
--- /dev/null
+++ b/doc/src/images/qpainter-painterpaths.png
Binary files differ
diff --git a/doc/src/images/qpainter-path.png b/doc/src/images/qpainter-path.png
new file mode 100644
index 0000000..3570b16
--- /dev/null
+++ b/doc/src/images/qpainter-path.png
Binary files differ
diff --git a/doc/src/images/qpainter-pathstroking.png b/doc/src/images/qpainter-pathstroking.png
new file mode 100644
index 0000000..ab73c6a
--- /dev/null
+++ b/doc/src/images/qpainter-pathstroking.png
Binary files differ
diff --git a/doc/src/images/qpainter-pie.png b/doc/src/images/qpainter-pie.png
new file mode 100644
index 0000000..7803901
--- /dev/null
+++ b/doc/src/images/qpainter-pie.png
Binary files differ
diff --git a/doc/src/images/qpainter-polygon.png b/doc/src/images/qpainter-polygon.png
new file mode 100644
index 0000000..3b6ea3c
--- /dev/null
+++ b/doc/src/images/qpainter-polygon.png
Binary files differ
diff --git a/doc/src/images/qpainter-rectangle.png b/doc/src/images/qpainter-rectangle.png
new file mode 100644
index 0000000..05fdc88
--- /dev/null
+++ b/doc/src/images/qpainter-rectangle.png
Binary files differ
diff --git a/doc/src/images/qpainter-rotation.png b/doc/src/images/qpainter-rotation.png
new file mode 100644
index 0000000..6e24a0e
--- /dev/null
+++ b/doc/src/images/qpainter-rotation.png
Binary files differ
diff --git a/doc/src/images/qpainter-roundrect.png b/doc/src/images/qpainter-roundrect.png
new file mode 100644
index 0000000..876a277
--- /dev/null
+++ b/doc/src/images/qpainter-roundrect.png
Binary files differ
diff --git a/doc/src/images/qpainter-scale.png b/doc/src/images/qpainter-scale.png
new file mode 100644
index 0000000..4fe582e
--- /dev/null
+++ b/doc/src/images/qpainter-scale.png
Binary files differ
diff --git a/doc/src/images/qpainter-text.png b/doc/src/images/qpainter-text.png
new file mode 100644
index 0000000..af7821c
--- /dev/null
+++ b/doc/src/images/qpainter-text.png
Binary files differ
diff --git a/doc/src/images/qpainter-translation.png b/doc/src/images/qpainter-translation.png
new file mode 100644
index 0000000..b3716ca
--- /dev/null
+++ b/doc/src/images/qpainter-translation.png
Binary files differ
diff --git a/doc/src/images/qpainter-vectordeformation.png b/doc/src/images/qpainter-vectordeformation.png
new file mode 100644
index 0000000..aff95f4
--- /dev/null
+++ b/doc/src/images/qpainter-vectordeformation.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-addellipse.png b/doc/src/images/qpainterpath-addellipse.png
new file mode 100644
index 0000000..98f8517
--- /dev/null
+++ b/doc/src/images/qpainterpath-addellipse.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-addpolygon.png b/doc/src/images/qpainterpath-addpolygon.png
new file mode 100644
index 0000000..d36bde8
--- /dev/null
+++ b/doc/src/images/qpainterpath-addpolygon.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-addrectangle.png b/doc/src/images/qpainterpath-addrectangle.png
new file mode 100644
index 0000000..be9283e
--- /dev/null
+++ b/doc/src/images/qpainterpath-addrectangle.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-addtext.png b/doc/src/images/qpainterpath-addtext.png
new file mode 100644
index 0000000..803a958
--- /dev/null
+++ b/doc/src/images/qpainterpath-addtext.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-arcto.png b/doc/src/images/qpainterpath-arcto.png
new file mode 100644
index 0000000..fe60b08
--- /dev/null
+++ b/doc/src/images/qpainterpath-arcto.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-construction.png b/doc/src/images/qpainterpath-construction.png
new file mode 100644
index 0000000..4beeba1
--- /dev/null
+++ b/doc/src/images/qpainterpath-construction.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-cubicto.png b/doc/src/images/qpainterpath-cubicto.png
new file mode 100644
index 0000000..465bfec
--- /dev/null
+++ b/doc/src/images/qpainterpath-cubicto.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-demo.png b/doc/src/images/qpainterpath-demo.png
new file mode 100644
index 0000000..ceeed2f
--- /dev/null
+++ b/doc/src/images/qpainterpath-demo.png
Binary files differ
diff --git a/doc/src/images/qpainterpath-example.png b/doc/src/images/qpainterpath-example.png
new file mode 100644
index 0000000..f2bd359
--- /dev/null
+++ b/doc/src/images/qpainterpath-example.png
Binary files differ
diff --git a/doc/src/images/qpen-bevel.png b/doc/src/images/qpen-bevel.png
new file mode 100644
index 0000000..8a30779
--- /dev/null
+++ b/doc/src/images/qpen-bevel.png
Binary files differ
diff --git a/doc/src/images/qpen-custom.png b/doc/src/images/qpen-custom.png
new file mode 100644
index 0000000..a2a038a
--- /dev/null
+++ b/doc/src/images/qpen-custom.png
Binary files differ
diff --git a/doc/src/images/qpen-dash.png b/doc/src/images/qpen-dash.png
new file mode 100644
index 0000000..67082c3
--- /dev/null
+++ b/doc/src/images/qpen-dash.png
Binary files differ
diff --git a/doc/src/images/qpen-dashdot.png b/doc/src/images/qpen-dashdot.png
new file mode 100644
index 0000000..64b3846
--- /dev/null
+++ b/doc/src/images/qpen-dashdot.png
Binary files differ
diff --git a/doc/src/images/qpen-dashdotdot.png b/doc/src/images/qpen-dashdotdot.png
new file mode 100644
index 0000000..ff1b2e6
--- /dev/null
+++ b/doc/src/images/qpen-dashdotdot.png
Binary files differ
diff --git a/doc/src/images/qpen-dashpattern.png b/doc/src/images/qpen-dashpattern.png
new file mode 100644
index 0000000..e33cf58
--- /dev/null
+++ b/doc/src/images/qpen-dashpattern.png
Binary files differ
diff --git a/doc/src/images/qpen-demo.png b/doc/src/images/qpen-demo.png
new file mode 100644
index 0000000..3ea5108
--- /dev/null
+++ b/doc/src/images/qpen-demo.png
Binary files differ
diff --git a/doc/src/images/qpen-dot.png b/doc/src/images/qpen-dot.png
new file mode 100644
index 0000000..54e81c9
--- /dev/null
+++ b/doc/src/images/qpen-dot.png
Binary files differ
diff --git a/doc/src/images/qpen-flat.png b/doc/src/images/qpen-flat.png
new file mode 100644
index 0000000..06e2195
--- /dev/null
+++ b/doc/src/images/qpen-flat.png
Binary files differ
diff --git a/doc/src/images/qpen-miter.png b/doc/src/images/qpen-miter.png
new file mode 100644
index 0000000..025e003
--- /dev/null
+++ b/doc/src/images/qpen-miter.png
Binary files differ
diff --git a/doc/src/images/qpen-miterlimit.png b/doc/src/images/qpen-miterlimit.png
new file mode 100644
index 0000000..17a9072
--- /dev/null
+++ b/doc/src/images/qpen-miterlimit.png
Binary files differ
diff --git a/doc/src/images/qpen-roundcap.png b/doc/src/images/qpen-roundcap.png
new file mode 100644
index 0000000..77b22b2
--- /dev/null
+++ b/doc/src/images/qpen-roundcap.png
Binary files differ
diff --git a/doc/src/images/qpen-roundjoin.png b/doc/src/images/qpen-roundjoin.png
new file mode 100644
index 0000000..155e2aa
--- /dev/null
+++ b/doc/src/images/qpen-roundjoin.png
Binary files differ
diff --git a/doc/src/images/qpen-solid.png b/doc/src/images/qpen-solid.png
new file mode 100644
index 0000000..e042b18
--- /dev/null
+++ b/doc/src/images/qpen-solid.png
Binary files differ
diff --git a/doc/src/images/qpen-square.png b/doc/src/images/qpen-square.png
new file mode 100644
index 0000000..ebc5d1e
--- /dev/null
+++ b/doc/src/images/qpen-square.png
Binary files differ
diff --git a/doc/src/images/qplastiquestyle.png b/doc/src/images/qplastiquestyle.png
new file mode 100644
index 0000000..519f01d
--- /dev/null
+++ b/doc/src/images/qplastiquestyle.png
Binary files differ
diff --git a/doc/src/images/qprintpreviewdialog.png b/doc/src/images/qprintpreviewdialog.png
new file mode 100644
index 0000000..a78a3f1
--- /dev/null
+++ b/doc/src/images/qprintpreviewdialog.png
Binary files differ
diff --git a/doc/src/images/qprogbar-m.png b/doc/src/images/qprogbar-m.png
new file mode 100644
index 0000000..dbe9b0a
--- /dev/null
+++ b/doc/src/images/qprogbar-m.png
Binary files differ
diff --git a/doc/src/images/qprogbar-w.png b/doc/src/images/qprogbar-w.png
new file mode 100644
index 0000000..3a85ffe
--- /dev/null
+++ b/doc/src/images/qprogbar-w.png
Binary files differ
diff --git a/doc/src/images/qprogdlg-m.png b/doc/src/images/qprogdlg-m.png
new file mode 100644
index 0000000..bc83ece
--- /dev/null
+++ b/doc/src/images/qprogdlg-m.png
Binary files differ
diff --git a/doc/src/images/qprogdlg-w.png b/doc/src/images/qprogdlg-w.png
new file mode 100644
index 0000000..eda1f5c
--- /dev/null
+++ b/doc/src/images/qprogdlg-w.png
Binary files differ
diff --git a/doc/src/images/qradialgradient-pad.png b/doc/src/images/qradialgradient-pad.png
new file mode 100644
index 0000000..6c1a6cb
--- /dev/null
+++ b/doc/src/images/qradialgradient-pad.png
Binary files differ
diff --git a/doc/src/images/qradialgradient-reflect.png b/doc/src/images/qradialgradient-reflect.png
new file mode 100644
index 0000000..5122b18
--- /dev/null
+++ b/doc/src/images/qradialgradient-reflect.png
Binary files differ
diff --git a/doc/src/images/qradialgradient-repeat.png b/doc/src/images/qradialgradient-repeat.png
new file mode 100644
index 0000000..aa639b7
--- /dev/null
+++ b/doc/src/images/qradialgradient-repeat.png
Binary files differ
diff --git a/doc/src/images/qrect-coordinates.png b/doc/src/images/qrect-coordinates.png
new file mode 100644
index 0000000..2a2dae2
--- /dev/null
+++ b/doc/src/images/qrect-coordinates.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-one.png b/doc/src/images/qrect-diagram-one.png
new file mode 100644
index 0000000..a893be2
--- /dev/null
+++ b/doc/src/images/qrect-diagram-one.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-three.png b/doc/src/images/qrect-diagram-three.png
new file mode 100644
index 0000000..84fb35b
--- /dev/null
+++ b/doc/src/images/qrect-diagram-three.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-two.png b/doc/src/images/qrect-diagram-two.png
new file mode 100644
index 0000000..e19caac
--- /dev/null
+++ b/doc/src/images/qrect-diagram-two.png
Binary files differ
diff --git a/doc/src/images/qrect-diagram-zero.png b/doc/src/images/qrect-diagram-zero.png
new file mode 100644
index 0000000..90e3db0
--- /dev/null
+++ b/doc/src/images/qrect-diagram-zero.png
Binary files differ
diff --git a/doc/src/images/qrect-intersect.png b/doc/src/images/qrect-intersect.png
new file mode 100644
index 0000000..db68cd5
--- /dev/null
+++ b/doc/src/images/qrect-intersect.png
Binary files differ
diff --git a/doc/src/images/qrect-unite.png b/doc/src/images/qrect-unite.png
new file mode 100644
index 0000000..3f6239f
--- /dev/null
+++ b/doc/src/images/qrect-unite.png
Binary files differ
diff --git a/doc/src/images/qrectf-coordinates.png b/doc/src/images/qrectf-coordinates.png
new file mode 100644
index 0000000..ccc6d82
--- /dev/null
+++ b/doc/src/images/qrectf-coordinates.png
Binary files differ
diff --git a/doc/src/images/qrectf-diagram-one.png b/doc/src/images/qrectf-diagram-one.png
new file mode 100644
index 0000000..842289c
--- /dev/null
+++ b/doc/src/images/qrectf-diagram-one.png
Binary files differ
diff --git a/doc/src/images/qrectf-diagram-three.png b/doc/src/images/qrectf-diagram-three.png
new file mode 100644
index 0000000..e05106a
--- /dev/null
+++ b/doc/src/images/qrectf-diagram-three.png
Binary files differ
diff --git a/doc/src/images/qrectf-diagram-two.png b/doc/src/images/qrectf-diagram-two.png
new file mode 100644
index 0000000..192d00d
--- /dev/null
+++ b/doc/src/images/qrectf-diagram-two.png
Binary files differ
diff --git a/doc/src/images/qscrollarea-noscrollbars.png b/doc/src/images/qscrollarea-noscrollbars.png
new file mode 100644
index 0000000..a1520f3
--- /dev/null
+++ b/doc/src/images/qscrollarea-noscrollbars.png
Binary files differ
diff --git a/doc/src/images/qscrollarea-onescrollbar.png b/doc/src/images/qscrollarea-onescrollbar.png
new file mode 100644
index 0000000..b4f7976
--- /dev/null
+++ b/doc/src/images/qscrollarea-onescrollbar.png
Binary files differ
diff --git a/doc/src/images/qscrollarea-twoscrollbars.png b/doc/src/images/qscrollarea-twoscrollbars.png
new file mode 100644
index 0000000..bf720e4
--- /dev/null
+++ b/doc/src/images/qscrollarea-twoscrollbars.png
Binary files differ
diff --git a/doc/src/images/qscrollbar-picture.png b/doc/src/images/qscrollbar-picture.png
new file mode 100644
index 0000000..898e014
--- /dev/null
+++ b/doc/src/images/qscrollbar-picture.png
Binary files differ
diff --git a/doc/src/images/qscrollbar-values.png b/doc/src/images/qscrollbar-values.png
new file mode 100644
index 0000000..cea744b
--- /dev/null
+++ b/doc/src/images/qscrollbar-values.png
Binary files differ
diff --git a/doc/src/images/qscrollview-cl.png b/doc/src/images/qscrollview-cl.png
new file mode 100644
index 0000000..a5cb0db
--- /dev/null
+++ b/doc/src/images/qscrollview-cl.png
Binary files differ
diff --git a/doc/src/images/qscrollview-vp.png b/doc/src/images/qscrollview-vp.png
new file mode 100644
index 0000000..fc8b022
--- /dev/null
+++ b/doc/src/images/qscrollview-vp.png
Binary files differ
diff --git a/doc/src/images/qscrollview-vp2.png b/doc/src/images/qscrollview-vp2.png
new file mode 100644
index 0000000..8d1c3a3
--- /dev/null
+++ b/doc/src/images/qscrollview-vp2.png
Binary files differ
diff --git a/doc/src/images/qsortfilterproxymodel-sorting.png b/doc/src/images/qsortfilterproxymodel-sorting.png
new file mode 100644
index 0000000..de99d41
--- /dev/null
+++ b/doc/src/images/qsortfilterproxymodel-sorting.png
Binary files differ
diff --git a/doc/src/images/qspinbox-plusminus.png b/doc/src/images/qspinbox-plusminus.png
new file mode 100644
index 0000000..3b35a40
--- /dev/null
+++ b/doc/src/images/qspinbox-plusminus.png
Binary files differ
diff --git a/doc/src/images/qspinbox-updown.png b/doc/src/images/qspinbox-updown.png
new file mode 100644
index 0000000..a6caa44
--- /dev/null
+++ b/doc/src/images/qspinbox-updown.png
Binary files differ
diff --git a/doc/src/images/qstatustipevent-action.png b/doc/src/images/qstatustipevent-action.png
new file mode 100644
index 0000000..c5dcfd2
--- /dev/null
+++ b/doc/src/images/qstatustipevent-action.png
Binary files differ
diff --git a/doc/src/images/qstatustipevent-widget.png b/doc/src/images/qstatustipevent-widget.png
new file mode 100644
index 0000000..3cc0a1f
--- /dev/null
+++ b/doc/src/images/qstatustipevent-widget.png
Binary files differ
diff --git a/doc/src/images/qstyle-comboboxes.png b/doc/src/images/qstyle-comboboxes.png
new file mode 100644
index 0000000..aecec91
--- /dev/null
+++ b/doc/src/images/qstyle-comboboxes.png
Binary files differ
diff --git a/doc/src/images/qstyleoptiontoolbar-position.png b/doc/src/images/qstyleoptiontoolbar-position.png
new file mode 100644
index 0000000..5eaae7e
--- /dev/null
+++ b/doc/src/images/qstyleoptiontoolbar-position.png
Binary files differ
diff --git a/doc/src/images/qt-colors.png b/doc/src/images/qt-colors.png
new file mode 100644
index 0000000..524123f
--- /dev/null
+++ b/doc/src/images/qt-colors.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-accelerateddriver.png b/doc/src/images/qt-embedded-accelerateddriver.png
new file mode 100644
index 0000000..c44d0b6
--- /dev/null
+++ b/doc/src/images/qt-embedded-accelerateddriver.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-architecture.png b/doc/src/images/qt-embedded-architecture.png
new file mode 100644
index 0000000..97a29d0
--- /dev/null
+++ b/doc/src/images/qt-embedded-architecture.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-architecture2.png b/doc/src/images/qt-embedded-architecture2.png
new file mode 100644
index 0000000..f8c7fb1
--- /dev/null
+++ b/doc/src/images/qt-embedded-architecture2.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-characterinputlayer.png b/doc/src/images/qt-embedded-characterinputlayer.png
new file mode 100644
index 0000000..bedc2b8
--- /dev/null
+++ b/doc/src/images/qt-embedded-characterinputlayer.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-clamshellphone-closed.png b/doc/src/images/qt-embedded-clamshellphone-closed.png
new file mode 100644
index 0000000..2070f88
--- /dev/null
+++ b/doc/src/images/qt-embedded-clamshellphone-closed.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-clamshellphone-pressed.png b/doc/src/images/qt-embedded-clamshellphone-pressed.png
new file mode 100644
index 0000000..e728bea
--- /dev/null
+++ b/doc/src/images/qt-embedded-clamshellphone-pressed.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-clamshellphone.png b/doc/src/images/qt-embedded-clamshellphone.png
new file mode 100644
index 0000000..dd3bd60
--- /dev/null
+++ b/doc/src/images/qt-embedded-clamshellphone.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-client.png b/doc/src/images/qt-embedded-client.png
new file mode 100644
index 0000000..da64203
--- /dev/null
+++ b/doc/src/images/qt-embedded-client.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-clientrendering.png b/doc/src/images/qt-embedded-clientrendering.png
new file mode 100644
index 0000000..49ae8f1
--- /dev/null
+++ b/doc/src/images/qt-embedded-clientrendering.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-clientservercommunication.png b/doc/src/images/qt-embedded-clientservercommunication.png
new file mode 100644
index 0000000..0bdcb60
--- /dev/null
+++ b/doc/src/images/qt-embedded-clientservercommunication.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-drawingonscreen.png b/doc/src/images/qt-embedded-drawingonscreen.png
new file mode 100644
index 0000000..fca1eba
--- /dev/null
+++ b/doc/src/images/qt-embedded-drawingonscreen.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-examples.png b/doc/src/images/qt-embedded-examples.png
new file mode 100644
index 0000000..7fc6965
--- /dev/null
+++ b/doc/src/images/qt-embedded-examples.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-fontfeatures.png b/doc/src/images/qt-embedded-fontfeatures.png
new file mode 100644
index 0000000..c339171
--- /dev/null
+++ b/doc/src/images/qt-embedded-fontfeatures.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-opengl1.png b/doc/src/images/qt-embedded-opengl1.png
new file mode 100644
index 0000000..28e2a5f
--- /dev/null
+++ b/doc/src/images/qt-embedded-opengl1.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-opengl2.png b/doc/src/images/qt-embedded-opengl2.png
new file mode 100644
index 0000000..3547cd7
--- /dev/null
+++ b/doc/src/images/qt-embedded-opengl2.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-opengl3.png b/doc/src/images/qt-embedded-opengl3.png
new file mode 100644
index 0000000..0316b71
--- /dev/null
+++ b/doc/src/images/qt-embedded-opengl3.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-pda.png b/doc/src/images/qt-embedded-pda.png
new file mode 100644
index 0000000..2bd9881
--- /dev/null
+++ b/doc/src/images/qt-embedded-pda.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-phone.png b/doc/src/images/qt-embedded-phone.png
new file mode 100644
index 0000000..29df579
--- /dev/null
+++ b/doc/src/images/qt-embedded-phone.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-pointerhandlinglayer.png b/doc/src/images/qt-embedded-pointerhandlinglayer.png
new file mode 100644
index 0000000..b82fb3b
--- /dev/null
+++ b/doc/src/images/qt-embedded-pointerhandlinglayer.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-qconfigtool.png b/doc/src/images/qt-embedded-qconfigtool.png
new file mode 100644
index 0000000..fbab4d6
--- /dev/null
+++ b/doc/src/images/qt-embedded-qconfigtool.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-qvfbfilemenu.png b/doc/src/images/qt-embedded-qvfbfilemenu.png
new file mode 100644
index 0000000..e82287b
--- /dev/null
+++ b/doc/src/images/qt-embedded-qvfbfilemenu.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-qvfbviewmenu.png b/doc/src/images/qt-embedded-qvfbviewmenu.png
new file mode 100644
index 0000000..403bc66
--- /dev/null
+++ b/doc/src/images/qt-embedded-qvfbviewmenu.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-reserveregion.png b/doc/src/images/qt-embedded-reserveregion.png
new file mode 100644
index 0000000..e20a748
--- /dev/null
+++ b/doc/src/images/qt-embedded-reserveregion.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-runningapplication.png b/doc/src/images/qt-embedded-runningapplication.png
new file mode 100644
index 0000000..d7f9a51
--- /dev/null
+++ b/doc/src/images/qt-embedded-runningapplication.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-setwindowattribute.png b/doc/src/images/qt-embedded-setwindowattribute.png
new file mode 100644
index 0000000..44daba9
--- /dev/null
+++ b/doc/src/images/qt-embedded-setwindowattribute.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-virtualframebuffer.png b/doc/src/images/qt-embedded-virtualframebuffer.png
new file mode 100644
index 0000000..d5a5221
--- /dev/null
+++ b/doc/src/images/qt-embedded-virtualframebuffer.png
Binary files differ
diff --git a/doc/src/images/qt-embedded-vnc-screen.png b/doc/src/images/qt-embedded-vnc-screen.png
new file mode 100644
index 0000000..da06387
--- /dev/null
+++ b/doc/src/images/qt-embedded-vnc-screen.png
Binary files differ
diff --git a/doc/src/images/qt-fillrule-oddeven.png b/doc/src/images/qt-fillrule-oddeven.png
new file mode 100644
index 0000000..f39d105
--- /dev/null
+++ b/doc/src/images/qt-fillrule-oddeven.png
Binary files differ
diff --git a/doc/src/images/qt-fillrule-winding.png b/doc/src/images/qt-fillrule-winding.png
new file mode 100644
index 0000000..8018248
--- /dev/null
+++ b/doc/src/images/qt-fillrule-winding.png
Binary files differ
diff --git a/doc/src/images/qt-for-wince-landscape.png b/doc/src/images/qt-for-wince-landscape.png
new file mode 100644
index 0000000..127f799
--- /dev/null
+++ b/doc/src/images/qt-for-wince-landscape.png
Binary files differ
diff --git a/doc/src/images/qt-logo.png b/doc/src/images/qt-logo.png
new file mode 100644
index 0000000..14ddf2a
--- /dev/null
+++ b/doc/src/images/qt-logo.png
Binary files differ
diff --git a/doc/src/images/qt.png b/doc/src/images/qt.png
new file mode 100644
index 0000000..cbed1a9
--- /dev/null
+++ b/doc/src/images/qt.png
Binary files differ
diff --git a/doc/src/images/qtableitems.png b/doc/src/images/qtableitems.png
new file mode 100644
index 0000000..c62813a
--- /dev/null
+++ b/doc/src/images/qtableitems.png
Binary files differ
diff --git a/doc/src/images/qtabletevent-tilt.png b/doc/src/images/qtabletevent-tilt.png
new file mode 100644
index 0000000..546d7da
--- /dev/null
+++ b/doc/src/images/qtabletevent-tilt.png
Binary files differ
diff --git a/doc/src/images/qtableview-resized.png b/doc/src/images/qtableview-resized.png
new file mode 100644
index 0000000..813256e
--- /dev/null
+++ b/doc/src/images/qtableview-resized.png
Binary files differ
diff --git a/doc/src/images/qtconcurrent-progressdialog.png b/doc/src/images/qtconcurrent-progressdialog.png
new file mode 100644
index 0000000..2e8b773
--- /dev/null
+++ b/doc/src/images/qtconcurrent-progressdialog.png
Binary files differ
diff --git a/doc/src/images/qtconfig-appearance.png b/doc/src/images/qtconfig-appearance.png
new file mode 100644
index 0000000..27f7f2f
--- /dev/null
+++ b/doc/src/images/qtconfig-appearance.png
Binary files differ
diff --git a/doc/src/images/qtdemo-small.png b/doc/src/images/qtdemo-small.png
new file mode 100644
index 0000000..d987ffa
--- /dev/null
+++ b/doc/src/images/qtdemo-small.png
Binary files differ
diff --git a/doc/src/images/qtdemo.png b/doc/src/images/qtdemo.png
new file mode 100644
index 0000000..e7267a9
--- /dev/null
+++ b/doc/src/images/qtdemo.png
Binary files differ
diff --git a/doc/src/images/qtdesignerextensions.png b/doc/src/images/qtdesignerextensions.png
new file mode 100644
index 0000000..d48701e
--- /dev/null
+++ b/doc/src/images/qtdesignerextensions.png
Binary files differ
diff --git a/doc/src/images/qtdesignerscreenshot.png b/doc/src/images/qtdesignerscreenshot.png
new file mode 100644
index 0000000..d71c986
--- /dev/null
+++ b/doc/src/images/qtdesignerscreenshot.png
Binary files differ
diff --git a/doc/src/images/qtextblock-fragments.png b/doc/src/images/qtextblock-fragments.png
new file mode 100644
index 0000000..777fba0
--- /dev/null
+++ b/doc/src/images/qtextblock-fragments.png
Binary files differ
diff --git a/doc/src/images/qtextblock-sequence.png b/doc/src/images/qtextblock-sequence.png
new file mode 100644
index 0000000..85f208e
--- /dev/null
+++ b/doc/src/images/qtextblock-sequence.png
Binary files differ
diff --git a/doc/src/images/qtextdocument-frames.png b/doc/src/images/qtextdocument-frames.png
new file mode 100644
index 0000000..96a2dbb
--- /dev/null
+++ b/doc/src/images/qtextdocument-frames.png
Binary files differ
diff --git a/doc/src/images/qtextfragment-split.png b/doc/src/images/qtextfragment-split.png
new file mode 100644
index 0000000..c232c40
--- /dev/null
+++ b/doc/src/images/qtextfragment-split.png
Binary files differ
diff --git a/doc/src/images/qtextframe-style.png b/doc/src/images/qtextframe-style.png
new file mode 100644
index 0000000..6151307
--- /dev/null
+++ b/doc/src/images/qtextframe-style.png
Binary files differ
diff --git a/doc/src/images/qtexttable-cells.png b/doc/src/images/qtexttable-cells.png
new file mode 100644
index 0000000..8460e60
--- /dev/null
+++ b/doc/src/images/qtexttable-cells.png
Binary files differ
diff --git a/doc/src/images/qtexttableformat-cell.png b/doc/src/images/qtexttableformat-cell.png
new file mode 100644
index 0000000..bbf85ff
--- /dev/null
+++ b/doc/src/images/qtexttableformat-cell.png
Binary files differ
diff --git a/doc/src/images/qtransform-combinedtransformation.png b/doc/src/images/qtransform-combinedtransformation.png
new file mode 100644
index 0000000..df1e226
--- /dev/null
+++ b/doc/src/images/qtransform-combinedtransformation.png
Binary files differ
diff --git a/doc/src/images/qtransform-combinedtransformation2.png b/doc/src/images/qtransform-combinedtransformation2.png
new file mode 100644
index 0000000..c037a0d
--- /dev/null
+++ b/doc/src/images/qtransform-combinedtransformation2.png
Binary files differ
diff --git a/doc/src/images/qtransform-representation.png b/doc/src/images/qtransform-representation.png
new file mode 100644
index 0000000..2608872
--- /dev/null
+++ b/doc/src/images/qtransform-representation.png
Binary files differ
diff --git a/doc/src/images/qtransform-simpletransformation.png b/doc/src/images/qtransform-simpletransformation.png
new file mode 100644
index 0000000..743e4e3
--- /dev/null
+++ b/doc/src/images/qtransform-simpletransformation.png
Binary files differ
diff --git a/doc/src/images/qtscript-calculator-example.png b/doc/src/images/qtscript-calculator-example.png
new file mode 100644
index 0000000..f2db906
--- /dev/null
+++ b/doc/src/images/qtscript-calculator-example.png
Binary files differ
diff --git a/doc/src/images/qtscript-calculator.png b/doc/src/images/qtscript-calculator.png
new file mode 100644
index 0000000..113c46b
--- /dev/null
+++ b/doc/src/images/qtscript-calculator.png
Binary files differ
diff --git a/doc/src/images/qtscript-context2d.png b/doc/src/images/qtscript-context2d.png
new file mode 100644
index 0000000..05eaf6e
--- /dev/null
+++ b/doc/src/images/qtscript-context2d.png
Binary files differ
diff --git a/doc/src/images/qtscript-debugger-small.png b/doc/src/images/qtscript-debugger-small.png
new file mode 100644
index 0000000..ffa60f4
--- /dev/null
+++ b/doc/src/images/qtscript-debugger-small.png
Binary files differ
diff --git a/doc/src/images/qtscript-debugger.png b/doc/src/images/qtscript-debugger.png
new file mode 100644
index 0000000..c417d0b
--- /dev/null
+++ b/doc/src/images/qtscript-debugger.png
Binary files differ
diff --git a/doc/src/images/qtscript-examples.png b/doc/src/images/qtscript-examples.png
new file mode 100644
index 0000000..d2e9179
--- /dev/null
+++ b/doc/src/images/qtscript-examples.png
Binary files differ
diff --git a/doc/src/images/qtscripttools-examples.png b/doc/src/images/qtscripttools-examples.png
new file mode 100644
index 0000000..369f32e
--- /dev/null
+++ b/doc/src/images/qtscripttools-examples.png
Binary files differ
diff --git a/doc/src/images/qtwizard-aero1.png b/doc/src/images/qtwizard-aero1.png
new file mode 100644
index 0000000..fe9e9bc
--- /dev/null
+++ b/doc/src/images/qtwizard-aero1.png
Binary files differ
diff --git a/doc/src/images/qtwizard-aero2.png b/doc/src/images/qtwizard-aero2.png
new file mode 100644
index 0000000..261c065
--- /dev/null
+++ b/doc/src/images/qtwizard-aero2.png
Binary files differ
diff --git a/doc/src/images/qtwizard-classic1.png b/doc/src/images/qtwizard-classic1.png
new file mode 100644
index 0000000..be3edbe
--- /dev/null
+++ b/doc/src/images/qtwizard-classic1.png
Binary files differ
diff --git a/doc/src/images/qtwizard-classic2.png b/doc/src/images/qtwizard-classic2.png
new file mode 100644
index 0000000..165f569
--- /dev/null
+++ b/doc/src/images/qtwizard-classic2.png
Binary files differ
diff --git a/doc/src/images/qtwizard-mac1.png b/doc/src/images/qtwizard-mac1.png
new file mode 100644
index 0000000..bc8cd9b
--- /dev/null
+++ b/doc/src/images/qtwizard-mac1.png
Binary files differ
diff --git a/doc/src/images/qtwizard-mac2.png b/doc/src/images/qtwizard-mac2.png
new file mode 100644
index 0000000..850f6b8
--- /dev/null
+++ b/doc/src/images/qtwizard-mac2.png
Binary files differ
diff --git a/doc/src/images/qtwizard-macpage.png b/doc/src/images/qtwizard-macpage.png
new file mode 100644
index 0000000..1ba3122
--- /dev/null
+++ b/doc/src/images/qtwizard-macpage.png
Binary files differ
diff --git a/doc/src/images/qtwizard-modern1.png b/doc/src/images/qtwizard-modern1.png
new file mode 100644
index 0000000..223e3dd
--- /dev/null
+++ b/doc/src/images/qtwizard-modern1.png
Binary files differ
diff --git a/doc/src/images/qtwizard-modern2.png b/doc/src/images/qtwizard-modern2.png
new file mode 100644
index 0000000..d66c374
--- /dev/null
+++ b/doc/src/images/qtwizard-modern2.png
Binary files differ
diff --git a/doc/src/images/qtwizard-nonmacpage.png b/doc/src/images/qtwizard-nonmacpage.png
new file mode 100644
index 0000000..cbe464d
--- /dev/null
+++ b/doc/src/images/qtwizard-nonmacpage.png
Binary files differ
diff --git a/doc/src/images/querymodel-example.png b/doc/src/images/querymodel-example.png
new file mode 100644
index 0000000..908d500
--- /dev/null
+++ b/doc/src/images/querymodel-example.png
Binary files differ
diff --git a/doc/src/images/queuedcustomtype-example.png b/doc/src/images/queuedcustomtype-example.png
new file mode 100644
index 0000000..4399b63
--- /dev/null
+++ b/doc/src/images/queuedcustomtype-example.png
Binary files differ
diff --git a/doc/src/images/qundoview.png b/doc/src/images/qundoview.png
new file mode 100644
index 0000000..3bdb1cf
--- /dev/null
+++ b/doc/src/images/qundoview.png
Binary files differ
diff --git a/doc/src/images/qurl-authority.png b/doc/src/images/qurl-authority.png
new file mode 100644
index 0000000..54de2a7
--- /dev/null
+++ b/doc/src/images/qurl-authority.png
Binary files differ
diff --git a/doc/src/images/qurl-authority2.png b/doc/src/images/qurl-authority2.png
new file mode 100644
index 0000000..fe8d4d8
--- /dev/null
+++ b/doc/src/images/qurl-authority2.png
Binary files differ
diff --git a/doc/src/images/qurl-authority3.png b/doc/src/images/qurl-authority3.png
new file mode 100644
index 0000000..242063e
--- /dev/null
+++ b/doc/src/images/qurl-authority3.png
Binary files differ
diff --git a/doc/src/images/qurl-fragment.png b/doc/src/images/qurl-fragment.png
new file mode 100644
index 0000000..e93a252
--- /dev/null
+++ b/doc/src/images/qurl-fragment.png
Binary files differ
diff --git a/doc/src/images/qurl-ftppath.png b/doc/src/images/qurl-ftppath.png
new file mode 100644
index 0000000..d88df49
--- /dev/null
+++ b/doc/src/images/qurl-ftppath.png
Binary files differ
diff --git a/doc/src/images/qurl-mailtopath.png b/doc/src/images/qurl-mailtopath.png
new file mode 100644
index 0000000..34ec153
--- /dev/null
+++ b/doc/src/images/qurl-mailtopath.png
Binary files differ
diff --git a/doc/src/images/qurl-querystring.png b/doc/src/images/qurl-querystring.png
new file mode 100644
index 0000000..7c3309a
--- /dev/null
+++ b/doc/src/images/qurl-querystring.png
Binary files differ
diff --git a/doc/src/images/qvbox-m.png b/doc/src/images/qvbox-m.png
new file mode 100644
index 0000000..2a2a595
--- /dev/null
+++ b/doc/src/images/qvbox-m.png
Binary files differ
diff --git a/doc/src/images/qvboxlayout-with-5-children.png b/doc/src/images/qvboxlayout-with-5-children.png
new file mode 100644
index 0000000..57c37d7
--- /dev/null
+++ b/doc/src/images/qvboxlayout-with-5-children.png
Binary files differ
diff --git a/doc/src/images/qwebview-diagram.png b/doc/src/images/qwebview-diagram.png
new file mode 100644
index 0000000..ada865e
--- /dev/null
+++ b/doc/src/images/qwebview-diagram.png
Binary files differ
diff --git a/doc/src/images/qwebview-url.png b/doc/src/images/qwebview-url.png
new file mode 100644
index 0000000..3c40080
--- /dev/null
+++ b/doc/src/images/qwebview-url.png
Binary files differ
diff --git a/doc/src/images/qwindowsstyle.png b/doc/src/images/qwindowsstyle.png
new file mode 100644
index 0000000..6b387a7
--- /dev/null
+++ b/doc/src/images/qwindowsstyle.png
Binary files differ
diff --git a/doc/src/images/qwindowsxpstyle.png b/doc/src/images/qwindowsxpstyle.png
new file mode 100644
index 0000000..b24bdeb
--- /dev/null
+++ b/doc/src/images/qwindowsxpstyle.png
Binary files differ
diff --git a/doc/src/images/qwsserver_keyboardfilter.png b/doc/src/images/qwsserver_keyboardfilter.png
new file mode 100644
index 0000000..9efc080
--- /dev/null
+++ b/doc/src/images/qwsserver_keyboardfilter.png
Binary files differ
diff --git a/doc/src/images/radialGradient.png b/doc/src/images/radialGradient.png
new file mode 100644
index 0000000..b6ab6c8
--- /dev/null
+++ b/doc/src/images/radialGradient.png
Binary files differ
diff --git a/doc/src/images/recentfiles-example.png b/doc/src/images/recentfiles-example.png
new file mode 100644
index 0000000..8a1f2e5
--- /dev/null
+++ b/doc/src/images/recentfiles-example.png
Binary files differ
diff --git a/doc/src/images/recipes-example.png b/doc/src/images/recipes-example.png
new file mode 100644
index 0000000..21ebc9b
--- /dev/null
+++ b/doc/src/images/recipes-example.png
Binary files differ
diff --git a/doc/src/images/regexp-example.png b/doc/src/images/regexp-example.png
new file mode 100644
index 0000000..0f31a2f
--- /dev/null
+++ b/doc/src/images/regexp-example.png
Binary files differ
diff --git a/doc/src/images/relationaltable.png b/doc/src/images/relationaltable.png
new file mode 100644
index 0000000..bdfd40f
--- /dev/null
+++ b/doc/src/images/relationaltable.png
Binary files differ
diff --git a/doc/src/images/relationaltablemodel-example.png b/doc/src/images/relationaltablemodel-example.png
new file mode 100644
index 0000000..44fc858
--- /dev/null
+++ b/doc/src/images/relationaltablemodel-example.png
Binary files differ
diff --git a/doc/src/images/remotecontrolledcar-car-example.png b/doc/src/images/remotecontrolledcar-car-example.png
new file mode 100644
index 0000000..7e08340
--- /dev/null
+++ b/doc/src/images/remotecontrolledcar-car-example.png
Binary files differ
diff --git a/doc/src/images/remotecontrolledcar-controller-example.png b/doc/src/images/remotecontrolledcar-controller-example.png
new file mode 100644
index 0000000..cae1ab8
--- /dev/null
+++ b/doc/src/images/remotecontrolledcar-controller-example.png
Binary files differ
diff --git a/doc/src/images/resources.png b/doc/src/images/resources.png
new file mode 100644
index 0000000..eb7af96
--- /dev/null
+++ b/doc/src/images/resources.png
Binary files differ
diff --git a/doc/src/images/richtext-document.png b/doc/src/images/richtext-document.png
new file mode 100644
index 0000000..4ae5d16
--- /dev/null
+++ b/doc/src/images/richtext-document.png
Binary files differ
diff --git a/doc/src/images/richtext-examples.png b/doc/src/images/richtext-examples.png
new file mode 100644
index 0000000..1091c20
--- /dev/null
+++ b/doc/src/images/richtext-examples.png
Binary files differ
diff --git a/doc/src/images/rintersect.png b/doc/src/images/rintersect.png
new file mode 100644
index 0000000..025ea93
--- /dev/null
+++ b/doc/src/images/rintersect.png
Binary files differ
diff --git a/doc/src/images/rsslistingexample.png b/doc/src/images/rsslistingexample.png
new file mode 100644
index 0000000..6bac295
--- /dev/null
+++ b/doc/src/images/rsslistingexample.png
Binary files differ
diff --git a/doc/src/images/rsubtract.png b/doc/src/images/rsubtract.png
new file mode 100644
index 0000000..add6405
--- /dev/null
+++ b/doc/src/images/rsubtract.png
Binary files differ
diff --git a/doc/src/images/runion.png b/doc/src/images/runion.png
new file mode 100644
index 0000000..5b11e8c
--- /dev/null
+++ b/doc/src/images/runion.png
Binary files differ
diff --git a/doc/src/images/rxor.png b/doc/src/images/rxor.png
new file mode 100644
index 0000000..f86e6d6
--- /dev/null
+++ b/doc/src/images/rxor.png
Binary files differ
diff --git a/doc/src/images/samplebuffers-example.png b/doc/src/images/samplebuffers-example.png
new file mode 100644
index 0000000..b751c14
--- /dev/null
+++ b/doc/src/images/samplebuffers-example.png
Binary files differ
diff --git a/doc/src/images/saxbookmarks-example.png b/doc/src/images/saxbookmarks-example.png
new file mode 100644
index 0000000..54d793b
--- /dev/null
+++ b/doc/src/images/saxbookmarks-example.png
Binary files differ
diff --git a/doc/src/images/screenshot-example.png b/doc/src/images/screenshot-example.png
new file mode 100644
index 0000000..8689486
--- /dev/null
+++ b/doc/src/images/screenshot-example.png
Binary files differ
diff --git a/doc/src/images/scribble-example.png b/doc/src/images/scribble-example.png
new file mode 100644
index 0000000..a2cb1de
--- /dev/null
+++ b/doc/src/images/scribble-example.png
Binary files differ
diff --git a/doc/src/images/sdi-example.png b/doc/src/images/sdi-example.png
new file mode 100644
index 0000000..8cd7aa0
--- /dev/null
+++ b/doc/src/images/sdi-example.png
Binary files differ
diff --git a/doc/src/images/securesocketclient.png b/doc/src/images/securesocketclient.png
new file mode 100644
index 0000000..8736cbc
--- /dev/null
+++ b/doc/src/images/securesocketclient.png
Binary files differ
diff --git a/doc/src/images/securesocketclient2.png b/doc/src/images/securesocketclient2.png
new file mode 100644
index 0000000..23db851
--- /dev/null
+++ b/doc/src/images/securesocketclient2.png
Binary files differ
diff --git a/doc/src/images/selected-items1.png b/doc/src/images/selected-items1.png
new file mode 100644
index 0000000..12b572d
--- /dev/null
+++ b/doc/src/images/selected-items1.png
Binary files differ
diff --git a/doc/src/images/selected-items2.png b/doc/src/images/selected-items2.png
new file mode 100644
index 0000000..ad247d9
--- /dev/null
+++ b/doc/src/images/selected-items2.png
Binary files differ
diff --git a/doc/src/images/selected-items3.png b/doc/src/images/selected-items3.png
new file mode 100644
index 0000000..d7aa7be
--- /dev/null
+++ b/doc/src/images/selected-items3.png
Binary files differ
diff --git a/doc/src/images/selection-extended.png b/doc/src/images/selection-extended.png
new file mode 100644
index 0000000..8ca488d
--- /dev/null
+++ b/doc/src/images/selection-extended.png
Binary files differ
diff --git a/doc/src/images/selection-multi.png b/doc/src/images/selection-multi.png
new file mode 100644
index 0000000..766e4a1
--- /dev/null
+++ b/doc/src/images/selection-multi.png
Binary files differ
diff --git a/doc/src/images/selection-single.png b/doc/src/images/selection-single.png
new file mode 100644
index 0000000..d9d0655
--- /dev/null
+++ b/doc/src/images/selection-single.png
Binary files differ
diff --git a/doc/src/images/session.png b/doc/src/images/session.png
new file mode 100644
index 0000000..b9159ae
--- /dev/null
+++ b/doc/src/images/session.png
Binary files differ
diff --git a/doc/src/images/settingseditor-example.png b/doc/src/images/settingseditor-example.png
new file mode 100644
index 0000000..7a5be05
--- /dev/null
+++ b/doc/src/images/settingseditor-example.png
Binary files differ
diff --git a/doc/src/images/shapedclock-dragging.png b/doc/src/images/shapedclock-dragging.png
new file mode 100644
index 0000000..1b25afb
--- /dev/null
+++ b/doc/src/images/shapedclock-dragging.png
Binary files differ
diff --git a/doc/src/images/shapedclock-example.png b/doc/src/images/shapedclock-example.png
new file mode 100644
index 0000000..31ceeca
--- /dev/null
+++ b/doc/src/images/shapedclock-example.png
Binary files differ
diff --git a/doc/src/images/shareddirmodel.png b/doc/src/images/shareddirmodel.png
new file mode 100644
index 0000000..6daa9d3
--- /dev/null
+++ b/doc/src/images/shareddirmodel.png
Binary files differ
diff --git a/doc/src/images/sharedmemory-example_1.png b/doc/src/images/sharedmemory-example_1.png
new file mode 100644
index 0000000..53244d3
--- /dev/null
+++ b/doc/src/images/sharedmemory-example_1.png
Binary files differ
diff --git a/doc/src/images/sharedmemory-example_2.png b/doc/src/images/sharedmemory-example_2.png
new file mode 100644
index 0000000..fc71aed
--- /dev/null
+++ b/doc/src/images/sharedmemory-example_2.png
Binary files differ
diff --git a/doc/src/images/sharedmodel-tableviews.png b/doc/src/images/sharedmodel-tableviews.png
new file mode 100644
index 0000000..d241e4c
--- /dev/null
+++ b/doc/src/images/sharedmodel-tableviews.png
Binary files differ
diff --git a/doc/src/images/sharedselection-tableviews.png b/doc/src/images/sharedselection-tableviews.png
new file mode 100644
index 0000000..ccbda25
--- /dev/null
+++ b/doc/src/images/sharedselection-tableviews.png
Binary files differ
diff --git a/doc/src/images/signals-n-slots-aw-nat.png b/doc/src/images/signals-n-slots-aw-nat.png
new file mode 100644
index 0000000..8ab545b
--- /dev/null
+++ b/doc/src/images/signals-n-slots-aw-nat.png
Binary files differ
diff --git a/doc/src/images/simpledommodel-example.png b/doc/src/images/simpledommodel-example.png
new file mode 100644
index 0000000..b8e3f92
--- /dev/null
+++ b/doc/src/images/simpledommodel-example.png
Binary files differ
diff --git a/doc/src/images/simpletextviewer-example.png b/doc/src/images/simpletextviewer-example.png
new file mode 100644
index 0000000..95d2905
--- /dev/null
+++ b/doc/src/images/simpletextviewer-example.png
Binary files differ
diff --git a/doc/src/images/simpletextviewer-findfiledialog.png b/doc/src/images/simpletextviewer-findfiledialog.png
new file mode 100644
index 0000000..f6e55f0
--- /dev/null
+++ b/doc/src/images/simpletextviewer-findfiledialog.png
Binary files differ
diff --git a/doc/src/images/simpletextviewer-mainwindow.png b/doc/src/images/simpletextviewer-mainwindow.png
new file mode 100644
index 0000000..98c1c61
--- /dev/null
+++ b/doc/src/images/simpletextviewer-mainwindow.png
Binary files differ
diff --git a/doc/src/images/simpletreemodel-example.png b/doc/src/images/simpletreemodel-example.png
new file mode 100644
index 0000000..9655d10
--- /dev/null
+++ b/doc/src/images/simpletreemodel-example.png
Binary files differ
diff --git a/doc/src/images/simplewidgetmapper-example.png b/doc/src/images/simplewidgetmapper-example.png
new file mode 100644
index 0000000..f85ad0e
--- /dev/null
+++ b/doc/src/images/simplewidgetmapper-example.png
Binary files differ
diff --git a/doc/src/images/simplewizard-page1.png b/doc/src/images/simplewizard-page1.png
new file mode 100644
index 0000000..d6f701a
--- /dev/null
+++ b/doc/src/images/simplewizard-page1.png
Binary files differ
diff --git a/doc/src/images/simplewizard-page2.png b/doc/src/images/simplewizard-page2.png
new file mode 100644
index 0000000..f065d85
--- /dev/null
+++ b/doc/src/images/simplewizard-page2.png
Binary files differ
diff --git a/doc/src/images/simplewizard-page3.png b/doc/src/images/simplewizard-page3.png
new file mode 100644
index 0000000..e200808
--- /dev/null
+++ b/doc/src/images/simplewizard-page3.png
Binary files differ
diff --git a/doc/src/images/simplewizard.png b/doc/src/images/simplewizard.png
new file mode 100644
index 0000000..5a7f0c7
--- /dev/null
+++ b/doc/src/images/simplewizard.png
Binary files differ
diff --git a/doc/src/images/sipdialog-closed.png b/doc/src/images/sipdialog-closed.png
new file mode 100644
index 0000000..50408ed
--- /dev/null
+++ b/doc/src/images/sipdialog-closed.png
Binary files differ
diff --git a/doc/src/images/sipdialog-opened.png b/doc/src/images/sipdialog-opened.png
new file mode 100644
index 0000000..981587d
--- /dev/null
+++ b/doc/src/images/sipdialog-opened.png
Binary files differ
diff --git a/doc/src/images/sliders-example.png b/doc/src/images/sliders-example.png
new file mode 100644
index 0000000..a67ce1d
--- /dev/null
+++ b/doc/src/images/sliders-example.png
Binary files differ
diff --git a/doc/src/images/smooth.png b/doc/src/images/smooth.png
new file mode 100644
index 0000000..0d53e55
--- /dev/null
+++ b/doc/src/images/smooth.png
Binary files differ
diff --git a/doc/src/images/sortingmodel-example.png b/doc/src/images/sortingmodel-example.png
new file mode 100644
index 0000000..a23febe
--- /dev/null
+++ b/doc/src/images/sortingmodel-example.png
Binary files differ
diff --git a/doc/src/images/spinboxdelegate-example.png b/doc/src/images/spinboxdelegate-example.png
new file mode 100644
index 0000000..5e57a9c
--- /dev/null
+++ b/doc/src/images/spinboxdelegate-example.png
Binary files differ
diff --git a/doc/src/images/spinboxes-example.png b/doc/src/images/spinboxes-example.png
new file mode 100644
index 0000000..14c42d2
--- /dev/null
+++ b/doc/src/images/spinboxes-example.png
Binary files differ
diff --git a/doc/src/images/spreadsheet-demo.png b/doc/src/images/spreadsheet-demo.png
new file mode 100644
index 0000000..ae7dde2
--- /dev/null
+++ b/doc/src/images/spreadsheet-demo.png
Binary files differ
diff --git a/doc/src/images/sql-examples.png b/doc/src/images/sql-examples.png
new file mode 100644
index 0000000..e8d2b35
--- /dev/null
+++ b/doc/src/images/sql-examples.png
Binary files differ
diff --git a/doc/src/images/sql-widget-mapper.png b/doc/src/images/sql-widget-mapper.png
new file mode 100644
index 0000000..dfa64ab
--- /dev/null
+++ b/doc/src/images/sql-widget-mapper.png
Binary files differ
diff --git a/doc/src/images/sqlbrowser-demo.png b/doc/src/images/sqlbrowser-demo.png
new file mode 100644
index 0000000..101ec5a
--- /dev/null
+++ b/doc/src/images/sqlbrowser-demo.png
Binary files differ
diff --git a/doc/src/images/standard-views.png b/doc/src/images/standard-views.png
new file mode 100644
index 0000000..836ae36
--- /dev/null
+++ b/doc/src/images/standard-views.png
Binary files differ
diff --git a/doc/src/images/standarddialogs-example.png b/doc/src/images/standarddialogs-example.png
new file mode 100644
index 0000000..b6b8a07
--- /dev/null
+++ b/doc/src/images/standarddialogs-example.png
Binary files differ
diff --git a/doc/src/images/stardelegate.png b/doc/src/images/stardelegate.png
new file mode 100644
index 0000000..24fa9fb
--- /dev/null
+++ b/doc/src/images/stardelegate.png
Binary files differ
diff --git a/doc/src/images/stliterators1.png b/doc/src/images/stliterators1.png
new file mode 100644
index 0000000..6d71e47
--- /dev/null
+++ b/doc/src/images/stliterators1.png
Binary files differ
diff --git a/doc/src/images/stringlistmodel.png b/doc/src/images/stringlistmodel.png
new file mode 100644
index 0000000..eedbff3
--- /dev/null
+++ b/doc/src/images/stringlistmodel.png
Binary files differ
diff --git a/doc/src/images/stylepluginexample.png b/doc/src/images/stylepluginexample.png
new file mode 100644
index 0000000..05d8c6b
--- /dev/null
+++ b/doc/src/images/stylepluginexample.png
Binary files differ
diff --git a/doc/src/images/styles-3d.png b/doc/src/images/styles-3d.png
new file mode 100644
index 0000000..8344b4c
--- /dev/null
+++ b/doc/src/images/styles-3d.png
Binary files differ
diff --git a/doc/src/images/styles-aliasing.png b/doc/src/images/styles-aliasing.png
new file mode 100644
index 0000000..c351446
--- /dev/null
+++ b/doc/src/images/styles-aliasing.png
Binary files differ
diff --git a/doc/src/images/styles-disabledwood.png b/doc/src/images/styles-disabledwood.png
new file mode 100644
index 0000000..261bbae
--- /dev/null
+++ b/doc/src/images/styles-disabledwood.png
Binary files differ
diff --git a/doc/src/images/styles-enabledwood.png b/doc/src/images/styles-enabledwood.png
new file mode 100644
index 0000000..168c1d2
--- /dev/null
+++ b/doc/src/images/styles-enabledwood.png
Binary files differ
diff --git a/doc/src/images/styles-woodbuttons.png b/doc/src/images/styles-woodbuttons.png
new file mode 100644
index 0000000..176d7df
--- /dev/null
+++ b/doc/src/images/styles-woodbuttons.png
Binary files differ
diff --git a/doc/src/images/stylesheet-border-image-normal.png b/doc/src/images/stylesheet-border-image-normal.png
new file mode 100644
index 0000000..8afe3c9
--- /dev/null
+++ b/doc/src/images/stylesheet-border-image-normal.png
Binary files differ
diff --git a/doc/src/images/stylesheet-border-image-stretched.png b/doc/src/images/stylesheet-border-image-stretched.png
new file mode 100644
index 0000000..3f9ca92
--- /dev/null
+++ b/doc/src/images/stylesheet-border-image-stretched.png
Binary files differ
diff --git a/doc/src/images/stylesheet-border-image-wrong.png b/doc/src/images/stylesheet-border-image-wrong.png
new file mode 100644
index 0000000..19d6e44
--- /dev/null
+++ b/doc/src/images/stylesheet-border-image-wrong.png
Binary files differ
diff --git a/doc/src/images/stylesheet-boxmodel.png b/doc/src/images/stylesheet-boxmodel.png
new file mode 100644
index 0000000..a0249d7
--- /dev/null
+++ b/doc/src/images/stylesheet-boxmodel.png
Binary files differ
diff --git a/doc/src/images/stylesheet-branch-closed.png b/doc/src/images/stylesheet-branch-closed.png
new file mode 100644
index 0000000..213ffdd
--- /dev/null
+++ b/doc/src/images/stylesheet-branch-closed.png
Binary files differ
diff --git a/doc/src/images/stylesheet-branch-end.png b/doc/src/images/stylesheet-branch-end.png
new file mode 100644
index 0000000..54915b3
--- /dev/null
+++ b/doc/src/images/stylesheet-branch-end.png
Binary files differ
diff --git a/doc/src/images/stylesheet-branch-more.png b/doc/src/images/stylesheet-branch-more.png
new file mode 100644
index 0000000..664ad44
--- /dev/null
+++ b/doc/src/images/stylesheet-branch-more.png
Binary files differ
diff --git a/doc/src/images/stylesheet-branch-open.png b/doc/src/images/stylesheet-branch-open.png
new file mode 100644
index 0000000..e8cad95
--- /dev/null
+++ b/doc/src/images/stylesheet-branch-open.png
Binary files differ
diff --git a/doc/src/images/stylesheet-coffee-cleanlooks.png b/doc/src/images/stylesheet-coffee-cleanlooks.png
new file mode 100644
index 0000000..e75df0d
--- /dev/null
+++ b/doc/src/images/stylesheet-coffee-cleanlooks.png
Binary files differ
diff --git a/doc/src/images/stylesheet-coffee-plastique.png b/doc/src/images/stylesheet-coffee-plastique.png
new file mode 100644
index 0000000..d3bbe27
--- /dev/null
+++ b/doc/src/images/stylesheet-coffee-plastique.png
Binary files differ
diff --git a/doc/src/images/stylesheet-coffee-xp.png b/doc/src/images/stylesheet-coffee-xp.png
new file mode 100644
index 0000000..8bedd80
--- /dev/null
+++ b/doc/src/images/stylesheet-coffee-xp.png
Binary files differ
diff --git a/doc/src/images/stylesheet-designer-options.png b/doc/src/images/stylesheet-designer-options.png
new file mode 100644
index 0000000..446ce10
--- /dev/null
+++ b/doc/src/images/stylesheet-designer-options.png
Binary files differ
diff --git a/doc/src/images/stylesheet-pagefold-mac.png b/doc/src/images/stylesheet-pagefold-mac.png
new file mode 100644
index 0000000..5c061b9
--- /dev/null
+++ b/doc/src/images/stylesheet-pagefold-mac.png
Binary files differ
diff --git a/doc/src/images/stylesheet-pagefold.png b/doc/src/images/stylesheet-pagefold.png
new file mode 100644
index 0000000..5ccb4ed
--- /dev/null
+++ b/doc/src/images/stylesheet-pagefold.png
Binary files differ
diff --git a/doc/src/images/stylesheet-redbutton1.png b/doc/src/images/stylesheet-redbutton1.png
new file mode 100644
index 0000000..cb03375
--- /dev/null
+++ b/doc/src/images/stylesheet-redbutton1.png
Binary files differ
diff --git a/doc/src/images/stylesheet-redbutton2.png b/doc/src/images/stylesheet-redbutton2.png
new file mode 100644
index 0000000..5325708
--- /dev/null
+++ b/doc/src/images/stylesheet-redbutton2.png
Binary files differ
diff --git a/doc/src/images/stylesheet-redbutton3.png b/doc/src/images/stylesheet-redbutton3.png
new file mode 100644
index 0000000..dd976f0
--- /dev/null
+++ b/doc/src/images/stylesheet-redbutton3.png
Binary files differ
diff --git a/doc/src/images/stylesheet-scrollbar1.png b/doc/src/images/stylesheet-scrollbar1.png
new file mode 100644
index 0000000..666ff11
--- /dev/null
+++ b/doc/src/images/stylesheet-scrollbar1.png
Binary files differ
diff --git a/doc/src/images/stylesheet-scrollbar2.png b/doc/src/images/stylesheet-scrollbar2.png
new file mode 100644
index 0000000..439cf80
--- /dev/null
+++ b/doc/src/images/stylesheet-scrollbar2.png
Binary files differ
diff --git a/doc/src/images/stylesheet-treeview.png b/doc/src/images/stylesheet-treeview.png
new file mode 100644
index 0000000..883d190
--- /dev/null
+++ b/doc/src/images/stylesheet-treeview.png
Binary files differ
diff --git a/doc/src/images/stylesheet-vline.png b/doc/src/images/stylesheet-vline.png
new file mode 100644
index 0000000..8f0c336
--- /dev/null
+++ b/doc/src/images/stylesheet-vline.png
Binary files differ
diff --git a/doc/src/images/svg-image.png b/doc/src/images/svg-image.png
new file mode 100644
index 0000000..5a71ea7
--- /dev/null
+++ b/doc/src/images/svg-image.png
Binary files differ
diff --git a/doc/src/images/svgviewer-example.png b/doc/src/images/svgviewer-example.png
new file mode 100644
index 0000000..14f1377
--- /dev/null
+++ b/doc/src/images/svgviewer-example.png
Binary files differ
diff --git a/doc/src/images/syntaxhighlighter-example.png b/doc/src/images/syntaxhighlighter-example.png
new file mode 100644
index 0000000..d0e7f12
--- /dev/null
+++ b/doc/src/images/syntaxhighlighter-example.png
Binary files differ
diff --git a/doc/src/images/system-tray.png b/doc/src/images/system-tray.png
new file mode 100644
index 0000000..298b193
--- /dev/null
+++ b/doc/src/images/system-tray.png
Binary files differ
diff --git a/doc/src/images/systemtray-editor.png b/doc/src/images/systemtray-editor.png
new file mode 100644
index 0000000..fb15dea
--- /dev/null
+++ b/doc/src/images/systemtray-editor.png
Binary files differ
diff --git a/doc/src/images/systemtray-example.png b/doc/src/images/systemtray-example.png
new file mode 100644
index 0000000..98b5c81
--- /dev/null
+++ b/doc/src/images/systemtray-example.png
Binary files differ
diff --git a/doc/src/images/t1.png b/doc/src/images/t1.png
new file mode 100644
index 0000000..744721f
--- /dev/null
+++ b/doc/src/images/t1.png
Binary files differ
diff --git a/doc/src/images/t10.png b/doc/src/images/t10.png
new file mode 100644
index 0000000..54aa587
--- /dev/null
+++ b/doc/src/images/t10.png
Binary files differ
diff --git a/doc/src/images/t11.png b/doc/src/images/t11.png
new file mode 100644
index 0000000..64b25fa
--- /dev/null
+++ b/doc/src/images/t11.png
Binary files differ
diff --git a/doc/src/images/t12.png b/doc/src/images/t12.png
new file mode 100644
index 0000000..7a23230
--- /dev/null
+++ b/doc/src/images/t12.png
Binary files differ
diff --git a/doc/src/images/t13.png b/doc/src/images/t13.png
new file mode 100644
index 0000000..8734249
--- /dev/null
+++ b/doc/src/images/t13.png
Binary files differ
diff --git a/doc/src/images/t14.png b/doc/src/images/t14.png
new file mode 100644
index 0000000..f947dbe
--- /dev/null
+++ b/doc/src/images/t14.png
Binary files differ
diff --git a/doc/src/images/t2.png b/doc/src/images/t2.png
new file mode 100644
index 0000000..4b24119
--- /dev/null
+++ b/doc/src/images/t2.png
Binary files differ
diff --git a/doc/src/images/t3.png b/doc/src/images/t3.png
new file mode 100644
index 0000000..79c6413
--- /dev/null
+++ b/doc/src/images/t3.png
Binary files differ
diff --git a/doc/src/images/t4.png b/doc/src/images/t4.png
new file mode 100644
index 0000000..34c6c75
--- /dev/null
+++ b/doc/src/images/t4.png
Binary files differ
diff --git a/doc/src/images/t5.png b/doc/src/images/t5.png
new file mode 100644
index 0000000..46b3d75
--- /dev/null
+++ b/doc/src/images/t5.png
Binary files differ
diff --git a/doc/src/images/t6.png b/doc/src/images/t6.png
new file mode 100644
index 0000000..75c2c7e
--- /dev/null
+++ b/doc/src/images/t6.png
Binary files differ
diff --git a/doc/src/images/t7.png b/doc/src/images/t7.png
new file mode 100644
index 0000000..b0518df
--- /dev/null
+++ b/doc/src/images/t7.png
Binary files differ
diff --git a/doc/src/images/t8.png b/doc/src/images/t8.png
new file mode 100644
index 0000000..13b1b00
--- /dev/null
+++ b/doc/src/images/t8.png
Binary files differ
diff --git a/doc/src/images/t9.png b/doc/src/images/t9.png
new file mode 100644
index 0000000..54c3941
--- /dev/null
+++ b/doc/src/images/t9.png
Binary files differ
diff --git a/doc/src/images/t9_1.png b/doc/src/images/t9_1.png
new file mode 100644
index 0000000..bdcc640
--- /dev/null
+++ b/doc/src/images/t9_1.png
Binary files differ
diff --git a/doc/src/images/t9_2.png b/doc/src/images/t9_2.png
new file mode 100644
index 0000000..c1e23ca
--- /dev/null
+++ b/doc/src/images/t9_2.png
Binary files differ
diff --git a/doc/src/images/tabWidget-stylesheet1.png b/doc/src/images/tabWidget-stylesheet1.png
new file mode 100644
index 0000000..fc8fc19
--- /dev/null
+++ b/doc/src/images/tabWidget-stylesheet1.png
Binary files differ
diff --git a/doc/src/images/tabWidget-stylesheet2.png b/doc/src/images/tabWidget-stylesheet2.png
new file mode 100644
index 0000000..2cbf2bf
--- /dev/null
+++ b/doc/src/images/tabWidget-stylesheet2.png
Binary files differ
diff --git a/doc/src/images/tabWidget-stylesheet3.png b/doc/src/images/tabWidget-stylesheet3.png
new file mode 100644
index 0000000..f57a9c9
--- /dev/null
+++ b/doc/src/images/tabWidget-stylesheet3.png
Binary files differ
diff --git a/doc/src/images/tabdialog-example.png b/doc/src/images/tabdialog-example.png
new file mode 100644
index 0000000..219a85f
--- /dev/null
+++ b/doc/src/images/tabdialog-example.png
Binary files differ
diff --git a/doc/src/images/tableWidget-stylesheet.png b/doc/src/images/tableWidget-stylesheet.png
new file mode 100644
index 0000000..e99e7a9
--- /dev/null
+++ b/doc/src/images/tableWidget-stylesheet.png
Binary files differ
diff --git a/doc/src/images/tablemodel-example.png b/doc/src/images/tablemodel-example.png
new file mode 100644
index 0000000..3ae2a8c
--- /dev/null
+++ b/doc/src/images/tablemodel-example.png
Binary files differ
diff --git a/doc/src/images/tabletexample.png b/doc/src/images/tabletexample.png
new file mode 100644
index 0000000..a9b098d
--- /dev/null
+++ b/doc/src/images/tabletexample.png
Binary files differ
diff --git a/doc/src/images/taskmenuextension-dialog.png b/doc/src/images/taskmenuextension-dialog.png
new file mode 100644
index 0000000..7ad6d40
--- /dev/null
+++ b/doc/src/images/taskmenuextension-dialog.png
Binary files differ
diff --git a/doc/src/images/taskmenuextension-example-faded.png b/doc/src/images/taskmenuextension-example-faded.png
new file mode 100644
index 0000000..7e96f3a
--- /dev/null
+++ b/doc/src/images/taskmenuextension-example-faded.png
Binary files differ
diff --git a/doc/src/images/taskmenuextension-example.png b/doc/src/images/taskmenuextension-example.png
new file mode 100644
index 0000000..f1d46d2
--- /dev/null
+++ b/doc/src/images/taskmenuextension-example.png
Binary files differ
diff --git a/doc/src/images/taskmenuextension-menu.png b/doc/src/images/taskmenuextension-menu.png
new file mode 100644
index 0000000..d626c81
--- /dev/null
+++ b/doc/src/images/taskmenuextension-menu.png
Binary files differ
diff --git a/doc/src/images/tcpstream.png b/doc/src/images/tcpstream.png
new file mode 100644
index 0000000..7975376
--- /dev/null
+++ b/doc/src/images/tcpstream.png
Binary files differ
diff --git a/doc/src/images/tetrix-example.png b/doc/src/images/tetrix-example.png
new file mode 100644
index 0000000..c9764dc
--- /dev/null
+++ b/doc/src/images/tetrix-example.png
Binary files differ
diff --git a/doc/src/images/textedit-demo.png b/doc/src/images/textedit-demo.png
new file mode 100644
index 0000000..3cf2883
--- /dev/null
+++ b/doc/src/images/textedit-demo.png
Binary files differ
diff --git a/doc/src/images/textfinder-example-find.png b/doc/src/images/textfinder-example-find.png
new file mode 100644
index 0000000..886bbc1
--- /dev/null
+++ b/doc/src/images/textfinder-example-find.png
Binary files differ
diff --git a/doc/src/images/textfinder-example-find2.png b/doc/src/images/textfinder-example-find2.png
new file mode 100644
index 0000000..908f114
--- /dev/null
+++ b/doc/src/images/textfinder-example-find2.png
Binary files differ
diff --git a/doc/src/images/textfinder-example-userinterface.png b/doc/src/images/textfinder-example-userinterface.png
new file mode 100644
index 0000000..2bebe2e
--- /dev/null
+++ b/doc/src/images/textfinder-example-userinterface.png
Binary files differ
diff --git a/doc/src/images/textfinder-example.png b/doc/src/images/textfinder-example.png
new file mode 100644
index 0000000..87322df
--- /dev/null
+++ b/doc/src/images/textfinder-example.png
Binary files differ
diff --git a/doc/src/images/textobject-example.png b/doc/src/images/textobject-example.png
new file mode 100644
index 0000000..626c102
--- /dev/null
+++ b/doc/src/images/textobject-example.png
Binary files differ
diff --git a/doc/src/images/texttable-merge.png b/doc/src/images/texttable-merge.png
new file mode 100644
index 0000000..3b32239
--- /dev/null
+++ b/doc/src/images/texttable-merge.png
Binary files differ
diff --git a/doc/src/images/texttable-split.png b/doc/src/images/texttable-split.png
new file mode 100644
index 0000000..2fa17b8
--- /dev/null
+++ b/doc/src/images/texttable-split.png
Binary files differ
diff --git a/doc/src/images/textures-example.png b/doc/src/images/textures-example.png
new file mode 100644
index 0000000..b583ede
--- /dev/null
+++ b/doc/src/images/textures-example.png
Binary files differ
diff --git a/doc/src/images/thread-examples.png b/doc/src/images/thread-examples.png
new file mode 100644
index 0000000..4f4dbac
--- /dev/null
+++ b/doc/src/images/thread-examples.png
Binary files differ
diff --git a/doc/src/images/threadedfortuneserver-example.png b/doc/src/images/threadedfortuneserver-example.png
new file mode 100644
index 0000000..57c66a5
--- /dev/null
+++ b/doc/src/images/threadedfortuneserver-example.png
Binary files differ
diff --git a/doc/src/images/threadsandobjects.png b/doc/src/images/threadsandobjects.png
new file mode 100644
index 0000000..8357d25
--- /dev/null
+++ b/doc/src/images/threadsandobjects.png
Binary files differ
diff --git a/doc/src/images/tool-examples.png b/doc/src/images/tool-examples.png
new file mode 100644
index 0000000..592602a
--- /dev/null
+++ b/doc/src/images/tool-examples.png
Binary files differ
diff --git a/doc/src/images/tooltips-example.png b/doc/src/images/tooltips-example.png
new file mode 100644
index 0000000..f2236b4
--- /dev/null
+++ b/doc/src/images/tooltips-example.png
Binary files differ
diff --git a/doc/src/images/torrent-example.png b/doc/src/images/torrent-example.png
new file mode 100644
index 0000000..1032716
--- /dev/null
+++ b/doc/src/images/torrent-example.png
Binary files differ
diff --git a/doc/src/images/trafficinfo-example.png b/doc/src/images/trafficinfo-example.png
new file mode 100644
index 0000000..1717e40
--- /dev/null
+++ b/doc/src/images/trafficinfo-example.png
Binary files differ
diff --git a/doc/src/images/transformations-example.png b/doc/src/images/transformations-example.png
new file mode 100644
index 0000000..0fa185b
--- /dev/null
+++ b/doc/src/images/transformations-example.png
Binary files differ
diff --git a/doc/src/images/treemodel-structure.png b/doc/src/images/treemodel-structure.png
new file mode 100644
index 0000000..778841b
--- /dev/null
+++ b/doc/src/images/treemodel-structure.png
Binary files differ
diff --git a/doc/src/images/treemodelcompleter-example.png b/doc/src/images/treemodelcompleter-example.png
new file mode 100644
index 0000000..000405f
--- /dev/null
+++ b/doc/src/images/treemodelcompleter-example.png
Binary files differ
diff --git a/doc/src/images/trivialwizard-example-conclusion.png b/doc/src/images/trivialwizard-example-conclusion.png
new file mode 100644
index 0000000..c625ae4
--- /dev/null
+++ b/doc/src/images/trivialwizard-example-conclusion.png
Binary files differ
diff --git a/doc/src/images/trivialwizard-example-flow.png b/doc/src/images/trivialwizard-example-flow.png
new file mode 100644
index 0000000..79b6fce
--- /dev/null
+++ b/doc/src/images/trivialwizard-example-flow.png
Binary files differ
diff --git a/doc/src/images/trivialwizard-example-introduction.png b/doc/src/images/trivialwizard-example-introduction.png
new file mode 100644
index 0000000..0bbceed
--- /dev/null
+++ b/doc/src/images/trivialwizard-example-introduction.png
Binary files differ
diff --git a/doc/src/images/trivialwizard-example-registration.png b/doc/src/images/trivialwizard-example-registration.png
new file mode 100644
index 0000000..30b985e
--- /dev/null
+++ b/doc/src/images/trivialwizard-example-registration.png
Binary files differ
diff --git a/doc/src/images/trolltech-logo.png b/doc/src/images/trolltech-logo.png
new file mode 100644
index 0000000..19e3789
--- /dev/null
+++ b/doc/src/images/trolltech-logo.png
Binary files differ
diff --git a/doc/src/images/tutorial8-layout.png b/doc/src/images/tutorial8-layout.png
new file mode 100644
index 0000000..190a9f8
--- /dev/null
+++ b/doc/src/images/tutorial8-layout.png
Binary files differ
diff --git a/doc/src/images/tutorial8-reallayout.png b/doc/src/images/tutorial8-reallayout.png
new file mode 100644
index 0000000..4f6eb60
--- /dev/null
+++ b/doc/src/images/tutorial8-reallayout.png
Binary files differ
diff --git a/doc/src/images/udppackets.png b/doc/src/images/udppackets.png
new file mode 100644
index 0000000..bd66c3f
--- /dev/null
+++ b/doc/src/images/udppackets.png
Binary files differ
diff --git a/doc/src/images/uitools-examples.png b/doc/src/images/uitools-examples.png
new file mode 100644
index 0000000..8c85cdb
--- /dev/null
+++ b/doc/src/images/uitools-examples.png
Binary files differ
diff --git a/doc/src/images/undodemo.png b/doc/src/images/undodemo.png
new file mode 100644
index 0000000..85c3622
--- /dev/null
+++ b/doc/src/images/undodemo.png
Binary files differ
diff --git a/doc/src/images/undoframeworkexample.png b/doc/src/images/undoframeworkexample.png
new file mode 100644
index 0000000..7e0a1df
--- /dev/null
+++ b/doc/src/images/undoframeworkexample.png
Binary files differ
diff --git a/doc/src/images/unsmooth.png b/doc/src/images/unsmooth.png
new file mode 100644
index 0000000..2e1bdbe
--- /dev/null
+++ b/doc/src/images/unsmooth.png
Binary files differ
diff --git a/doc/src/images/wVista-Cert-border-small.png b/doc/src/images/wVista-Cert-border-small.png
new file mode 100644
index 0000000..ea78525
--- /dev/null
+++ b/doc/src/images/wVista-Cert-border-small.png
Binary files differ
diff --git a/doc/src/images/webkit-examples.png b/doc/src/images/webkit-examples.png
new file mode 100644
index 0000000..55bbd92
--- /dev/null
+++ b/doc/src/images/webkit-examples.png
Binary files differ
diff --git a/doc/src/images/webkit-netscape-plugin.png b/doc/src/images/webkit-netscape-plugin.png
new file mode 100644
index 0000000..df15123
--- /dev/null
+++ b/doc/src/images/webkit-netscape-plugin.png
Binary files differ
diff --git a/doc/src/images/whatsthis.png b/doc/src/images/whatsthis.png
new file mode 100644
index 0000000..2267c3d
--- /dev/null
+++ b/doc/src/images/whatsthis.png
Binary files differ
diff --git a/doc/src/images/widget-examples.png b/doc/src/images/widget-examples.png
new file mode 100644
index 0000000..1e4e97c
--- /dev/null
+++ b/doc/src/images/widget-examples.png
Binary files differ
diff --git a/doc/src/images/widgetdelegate.png b/doc/src/images/widgetdelegate.png
new file mode 100644
index 0000000..3df4c4b
--- /dev/null
+++ b/doc/src/images/widgetdelegate.png
Binary files differ
diff --git a/doc/src/images/widgetmapper-combo-mapping.png b/doc/src/images/widgetmapper-combo-mapping.png
new file mode 100644
index 0000000..f87cfaf
--- /dev/null
+++ b/doc/src/images/widgetmapper-combo-mapping.png
Binary files differ
diff --git a/doc/src/images/widgetmapper-simple-mapping.png b/doc/src/images/widgetmapper-simple-mapping.png
new file mode 100644
index 0000000..3ef3f29
--- /dev/null
+++ b/doc/src/images/widgetmapper-simple-mapping.png
Binary files differ
diff --git a/doc/src/images/widgetmapper-sql-mapping-table.png b/doc/src/images/widgetmapper-sql-mapping-table.png
new file mode 100644
index 0000000..98734b3
--- /dev/null
+++ b/doc/src/images/widgetmapper-sql-mapping-table.png
Binary files differ
diff --git a/doc/src/images/widgetmapper-sql-mapping.png b/doc/src/images/widgetmapper-sql-mapping.png
new file mode 100644
index 0000000..88718c6
--- /dev/null
+++ b/doc/src/images/widgetmapper-sql-mapping.png
Binary files differ
diff --git a/doc/src/images/widgets-examples.png b/doc/src/images/widgets-examples.png
new file mode 100644
index 0000000..2b314d1
--- /dev/null
+++ b/doc/src/images/widgets-examples.png
Binary files differ
diff --git a/doc/src/images/widgets-tutorial-childwidget.png b/doc/src/images/widgets-tutorial-childwidget.png
new file mode 100644
index 0000000..0d42d70
--- /dev/null
+++ b/doc/src/images/widgets-tutorial-childwidget.png
Binary files differ
diff --git a/doc/src/images/widgets-tutorial-nestedlayouts.png b/doc/src/images/widgets-tutorial-nestedlayouts.png
new file mode 100644
index 0000000..1e2a9f4
--- /dev/null
+++ b/doc/src/images/widgets-tutorial-nestedlayouts.png
Binary files differ
diff --git a/doc/src/images/widgets-tutorial-toplevel.png b/doc/src/images/widgets-tutorial-toplevel.png
new file mode 100644
index 0000000..a80d13c
--- /dev/null
+++ b/doc/src/images/widgets-tutorial-toplevel.png
Binary files differ
diff --git a/doc/src/images/widgets-tutorial-windowlayout.png b/doc/src/images/widgets-tutorial-windowlayout.png
new file mode 100644
index 0000000..fce52cd
--- /dev/null
+++ b/doc/src/images/widgets-tutorial-windowlayout.png
Binary files differ
diff --git a/doc/src/images/wiggly-example.png b/doc/src/images/wiggly-example.png
new file mode 100644