From beeb0840b745a29895ee4e9aeac0b07f63998c69 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn <frederik.gladhorn@digia.com> Date: Mon, 25 Feb 2013 19:00:54 +0100 Subject: [PATCH] Add a text editor example. Basic formatting is supported. It uses actions in menus and toolbar. Change-Id: I0c79e2a78f749c8a067492302bf3676505c6f3b6 Reviewed-by: Caroline Chao <caroline.chao@digia.com> --- .gitignore | 4 + examples/examples.pro | 1 + examples/text/example.html | 79 +++++++ examples/text/qml/images/editcopy.png | Bin 0 -> 1468 bytes examples/text/qml/images/editcut.png | Bin 0 -> 1512 bytes examples/text/qml/images/editpaste.png | Bin 0 -> 1906 bytes examples/text/qml/images/editredo.png | Bin 0 -> 1752 bytes examples/text/qml/images/editundo.png | Bin 0 -> 1746 bytes examples/text/qml/images/exportpdf.png | Bin 0 -> 1215 bytes examples/text/qml/images/filenew.png | Bin 0 -> 1172 bytes examples/text/qml/images/fileopen.png | Bin 0 -> 2168 bytes examples/text/qml/images/fileprint.png | Bin 0 -> 2087 bytes examples/text/qml/images/filesave.png | Bin 0 -> 1206 bytes examples/text/qml/images/logo32.png | Bin 0 -> 1410 bytes examples/text/qml/images/textbold.png | Bin 0 -> 1611 bytes examples/text/qml/images/textcenter.png | Bin 0 -> 1404 bytes examples/text/qml/images/textitalic.png | Bin 0 -> 1164 bytes examples/text/qml/images/textjustify.png | Bin 0 -> 1257 bytes examples/text/qml/images/textleft.png | Bin 0 -> 1235 bytes examples/text/qml/images/textright.png | Bin 0 -> 1406 bytes examples/text/qml/images/textunder.png | Bin 0 -> 1183 bytes examples/text/qml/images/zoomin.png | Bin 0 -> 1696 bytes examples/text/qml/images/zoomout.png | Bin 0 -> 1662 bytes examples/text/qml/main.qml | 243 +++++++++++++++++++++ examples/text/resources.qrc | 26 +++ examples/text/src/documenthandler.cpp | 261 +++++++++++++++++++++++ examples/text/src/documenthandler.h | 159 ++++++++++++++ examples/text/src/main.cpp | 72 +++++++ examples/text/src/src.pri | 9 + examples/text/text.pro | 16 ++ 30 files changed, 870 insertions(+) create mode 100644 examples/text/example.html create mode 100644 examples/text/qml/images/editcopy.png create mode 100644 examples/text/qml/images/editcut.png create mode 100644 examples/text/qml/images/editpaste.png create mode 100644 examples/text/qml/images/editredo.png create mode 100644 examples/text/qml/images/editundo.png create mode 100644 examples/text/qml/images/exportpdf.png create mode 100644 examples/text/qml/images/filenew.png create mode 100644 examples/text/qml/images/fileopen.png create mode 100644 examples/text/qml/images/fileprint.png create mode 100644 examples/text/qml/images/filesave.png create mode 100644 examples/text/qml/images/logo32.png create mode 100644 examples/text/qml/images/textbold.png create mode 100644 examples/text/qml/images/textcenter.png create mode 100644 examples/text/qml/images/textitalic.png create mode 100644 examples/text/qml/images/textjustify.png create mode 100644 examples/text/qml/images/textleft.png create mode 100644 examples/text/qml/images/textright.png create mode 100644 examples/text/qml/images/textunder.png create mode 100644 examples/text/qml/images/zoomin.png create mode 100644 examples/text/qml/images/zoomout.png create mode 100644 examples/text/qml/main.qml create mode 100644 examples/text/resources.qrc create mode 100644 examples/text/src/documenthandler.cpp create mode 100644 examples/text/src/documenthandler.h create mode 100644 examples/text/src/main.cpp create mode 100644 examples/text/src/src.pri create mode 100644 examples/text/text.pro diff --git a/.gitignore b/.gitignore index 39f08cf84..1ec36178f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ # This file is used to ignore files which are generated in the Qt build system # ---------------------------------------------------------------------------- +examples/ApplicationTemplate/application +examples/text/text +tests/auto/controls/tst_controls +tests/auto/qtdesktop/tst_qtdesktop callgrind.out.* pcviewer.cfg diff --git a/examples/examples.pro b/examples/examples.pro index ed556c2c3..772bc8b7c 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -5,4 +5,5 @@ SUBDIRS += \ gallery \ splitters \ tableview \ + text \ touch diff --git a/examples/text/example.html b/examples/text/example.html new file mode 100644 index 000000000..0560897b6 --- /dev/null +++ b/examples/text/example.html @@ -0,0 +1,79 @@ +<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>QTextEdit Example</title><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"> +<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt; font-weight:600;">QTextEdit</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">The QTextEdit widget is an advanced editor that supports formatted rich text. It can be used to display HTML and other rich document formats. Internally, QTextEdit uses the QTextDocument class to describe both the high-level structure of each document and the low-level formatting of paragraphs.</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">If you are viewing this document in the <span style=" font-style:italic;">textedit</span> example, you can edit this document to explore Qt's rich text editing features. We have included some comments in each of the following sections to encourage you to experiment. </p> +<p style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:18pt; font-weight:600;"><span style=" font-size:16pt;">Font and Paragraph Styles</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">QTextEdit supports </span><span style=" font-size:11pt; font-weight:600;">bold</span><span style=" font-size:11pt;">, </span><span style=" font-size:11pt; font-style:italic;">italic</span><span style=" font-size:11pt;">, and </span><span style=" font-size:11pt; text-decoration: underline;">underlined</span><span style=" font-size:11pt;"> font styles, and can display </span><span style=" font-size:11pt; font-weight:600; color:#00007f;">multicolored</span><span style=" font-size:11pt;"> </span><span style=" font-size:11pt; font-weight:600; color:#aa0000;">text</span><span style=" font-size:11pt;">. Font families such as </span><span style=" font-family:'Times'; font-size:11pt; font-weight:600;">Times New Roman</span><span style=" font-size:11pt;"> and </span><span style=" font-family:'Courier'; font-size:11pt; font-weight:600;">Courier</span><span style=" font-size:11pt;"> can also be used directly. </span><span style=" font-size:11pt; font-style:italic;">If you place the cursor in a region of styled text, the controls in the tool bars will change to reflect the current style.</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Paragraphs can be formatted so that the text is left-aligned, right-aligned, centered, or fully justified.</p> +<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-style:italic;">Try changing the alignment of some text and resize the editor to see how the text layout changes.</span> </p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Lists</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">Different kinds of lists can be included in rich text documents. Standard bullet lists can be nested, using different symbols for each level of the list: </span></p> +<ul style="-qt-list-indent: 1;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Disc symbols are typically used for top-level list items. </li></ul> +<ul type=circle style="-qt-list-indent: 2;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Circle symbols can be used to distinguish between items in lower-level lists.</li></ul> +<ul type=square style="-qt-list-indent: 3;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Square symbols provide a reasonable alternative to discs and circles. </li></ul> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Ordered lists can be created that can be used for tables of contents. Different characters can be used to enumerate items, and we can use both Roman and Arabic numerals in the same list structure: </p> +<ol style="-qt-list-indent: 1;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Introduction</li> +<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Tools </li></ol> +<ol type=a style="-qt-list-indent: 2;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Assistant</li> +<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Designer</li> +<ol type=A style="-qt-list-indent: 3;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Form Editor</li> +<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Component Architecture</li></ol> +<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Linguist</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">The list will automatically be renumbered if you add or remove items. <span style=" font-style:italic;">Try adding new sections to the above list or removing existing item to see the numbers change.</span> </p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p> +<p style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Images</span></p> +<p style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">Inline images are treated like ordinary ranges of characters in the text editor, so they flow with the surrounding text. Images can also be selected in the same way as text, making it easy to cut, copy, and paste them. </span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><img src="qrc:qml/images/logo32.png" /><span style=" font-style:italic;"> Try to select this image by clicking and dragging over it with the mouse, or use the text cursor to select it by holding down Shift and using the arrow keys. You can then cut or copy it, and paste it into different parts of this document.</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Tables</span></p> +<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">QTextEdit can arrange and format tables, supporting features such as row and column spans, text formatting within cells, and size constraints for columns. </span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p> +<table border="1" align="center" width="90%" cellspacing="0" cellpadding="4"> +<tr> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Development Tools </span></p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Programming Techniques </span></p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Graphical User Interfaces </span></p></td></tr> +<tr> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">9:00 - 11:00 </span></p></td> +<td colspan="3"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Introduction to <span style=" font-style:italic;">Qt </span></p></td></tr> +<tr> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">11:00 - 13:00 </span></p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using <span style=" font-style:italic;">qmake</span> </p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Object-oriented Programming </p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Layouts in <span style=" font-style:italic;">Qt</span> </p></td></tr> +<tr> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">13:00 - 15:00 </span></p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Qt Designer</span> Tutorial </p></td> +<td rowspan="2"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Extreme Programming </p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Writing Custom Styles </p></td></tr> +<tr> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">15:00 - 17:00 </span></p></td> +<td> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Qt Linguist</span> and Internationalization </p></td> +<td></td></tr></table> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; font-style:italic;">Try adding text to the cells in the table and experiment with the alignment of the paragraphs.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Hyperlinks</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">QTextEdit is designed to support hyperlinks between documents, and this feature is used extensively in </span><span style=" font-size:11pt; font-style:italic;">Qt Assistant</span><span style=" font-size:11pt;">. Hyperlinks are automatically created when an HTML file is imported into an editor. Since the rich text framework supports hyperlinks natively, they can also be created programatically.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Undo and Redo</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Full support for undo and redo operations is built into QTextEdit and the underlying rich text framework. Operations on a document can be packaged together to make editing a more comfortable experience for the user.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-style:italic;">Try making changes to this document and press Ctrl+Z to undo them. You can always recover the original contents of the document.</span> </p></body></html> diff --git a/examples/text/qml/images/editcopy.png b/examples/text/qml/images/editcopy.png new file mode 100644 index 0000000000000000000000000000000000000000..f551364464a7f4500a2660fd3aa450e79010b0cb GIT binary patch literal 1468 zcmV;t1w;CYP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000GpNkl<ZcwV(v zOKeotAO7y0JC9pv=}?9`*hsYmN_dD0A=F1)C`3a7#07~P7P^s;xN+qpJ`y)1uH3lN zu+WtW|Kz_Q1S=|Nl}ezrOzD%BPCL`itMj<ebMGDJcXCfM$z+O?jKAc|c}(Vf-|umL zXGW@4t7yfZJN@ZP01g2N<MB2I;P##WeO^ElQ(7bs$G1mc{r;;9AF2^W1pr9`H-A7t z282(e<MTJpe|G5$06(FL$!N{CA2~R%!$m-~9l&IO>j91nuo^rMU``FpK}lmcH2BoZ zAH4JCyEWmjwMzgT#=uOCdmd7JuO$v)s8lK_84mKr3f?+?`0VR1?tg<)*HQ}J{^;_d zx+S0Y_4P-WQtN}){+tE#xOPNB3Z5T~<LM`(5LPUeU`rk7>fVOJdJdnQKmA@NUp8wZ z?$zp{)J%XNrjyRSus42A?Cl?jb<@afrs%r1WnkxaM7vZ3<SK0D;m4m7I5D&v`<{t` zj4=kwGeKqtwm{c)_3X)^!*?ea_XGIjaS=Fm?&QJuPaGTQ#|CCu7K+6p`g(hC=9PYo z++RjdR|LI1osc96reT0A5KxfKR*=bL<bPcQnx=6tHZsR?=+GKL0K0bfVo%>@+)At< zl`TV!sF<I+gRd`sj7#5KL~?POYDe0j23iO855xCTQ4~D8Cyv0}8g5Un;P}yg9636K z!M*$7Rb_N`c4D=%P;ILKAwt-uO`C9FS1;~NO<*}^;)&iq#A=}1V%rR%P|9no09lrK z8it35sTTOUqoV_+t_WeA+_0%$s8_V94+w-pA;jZxo`!O{Of|z(;Z!B)CSW@pFc?63 zm<zNu0#tk?fbvU`ptWt=m`Eq#R(Xen>2PwGTtu5AKvyjs4rA-qt%${9h(@D41&{(T zn8XDH>P|Q8whCx0La*w<^E@zO22eD33b<_!Q`>H{03sKo>$;F2@wvzODg1sK81Se7 zXg2VlTtfnRF4nRvL9>8>%_G3Q_jpaTF#^JSA{Ha<@i)NsIHARWyv9?(=O$}&1Ssr8 zEDDn5bPZisMnMBy1?bt#Jx4g$#%n0TPNX!_qa+0JbW~kLf<U|*+|os$Gel9U(ia*9 zv>J9nCPGg4pF{+ML3+gaHLO^`>>3d5AaWOXXLDedCV3tU)P&1)oPTCjX*K5}0@QqH zO(G~76n^TCB#t^`Ik$*k#>bF(lmH~zwB+suqqLR=5F{VyIR3p>h-svrPjk~WiIfCT zL!y!I&5m8e$d!l4mh?p>q)stJ7Fjj8$jsFE%#H5~03raG4_Dc!$cT(g<Xp5|>i@c~ zLseB0#6L51ows7<IK}0P`hVN9$E|#NLCY_t3dxDA?{y~t3xFYfRGN7%L<q0xaFJ^g zLeFohR1#vzdm5=Vuba1iyZ-Rr^%(%3k1hZX09(|ZFUXP6XhbS<%uy&5h=4q%U%Vuc z_Ne!h_au&^TrPnz({-5@@<Xlqh}3~T3;IH2p{A(_@|q$LiA1Q%$#dG{k54k0<a={- za~K;NgC{BWYDTgvh1CKYtc5-xh%M7ZFchj6#0eAk6PSE3iTU|?q%uXr@<L@R5Y3wo zR?7L6oB8xy%D-x!fJlK4=C8db5s)a{Jg1B?9`ZyYfzi=XPMXe@H8&W`y5aab3-6dU zw8B(s_U_31*l-fU8U?sSEQ)YL0lKbXX=w=y3k#fhdU_i9GOKuMd=(uB@`#5YSmoTW z%Ts^-ofx^C1t9y7>ID$$1^8eBO$E%%%;5Jcm#~)CE0Jxx)4}dz+2FRW35VI&O1b5c ztKVJ_qymyagMj8jXkHb6&l~<30XPL<7Qj^iH-Gr@Oj@d$Ao7XPguGq^8idrf;(q`V WtAfH(WC6_p0000<MNUMnLSTZhJhJ@& literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/editcut.png b/examples/text/qml/images/editcut.png new file mode 100644 index 0000000000000000000000000000000000000000..a784fd5709d5f882f8cc20f7e961bc82e8af5408 GIT binary patch literal 1512 zcmV<E1sD2>P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%dPzh<R9M5s zmJLkQbr{DVE&;K?I2><*VVWcuS0Ev&yc^UgmMxPuCq=o+h)UUDGbvC<fV{Y{KtN88 zSBc<oiZXJMfzvr)mmmf#C54F=FU{S#;OTkJ-+%k-OpXY;?K6(w|9}7I`@H`F5#j&D zw3`4Ni3nmN5k$DonE?8@JqfTU3E=D=fZk64T7m%%2r=$+As{LlK$lOq%3(2!0Cv)K z%h?vNoei=G{?0}@8hrK^Kpma=%(j4y?Cl2tC+Pe0Tn{WlCMs&y1aOX50qn~IxRvVU z)Xs${&NqMM;xfd-Sm105FnZ74YW)24BIn!<n+v?WuFr)4cdmG@e6^>iz9KZ#z>#2T zH*7#DEhZZSSjH(6t!!&*4Y=|TLKTXy*{F8wRwLg<N1I#&^zjV~3rjrT*!YWnbo8&G z?(RSNnI;b+@sKc%M6sP69&&QRgBBLZwL#|}KFDxLNJ!#2t+rpU*CR7FG=wLUlCDX@ zrz60YYaj>UrhFc}3~-1;E4$B<4F?4UCH_=X(?2pYg3Kt<)7W_X9hIt7q`_@k0wj;P zCfM+)m>3-G@5iiwfL76-3y8I0zP_2K%FFu)2M1B&N>2}dn~=~air9DByWrkbv=$cr zW-u6#IhUKu`P>}h<DGdTKmTf9Z!h-BI9pYvk6F2ry$+KKZ>9olgM)(;$H&K!xq0;} zmZYZMsIIQY*49?+?Cdmh{`6@qiHp0);s~!9ZNqy7us5e`YOW0r52ISG#^mH=tgWrZ z;^Jb|YPER0Aph2D9v%mU*9&I6j%Do_vBJS&_ko0j>t$tS#t{4a`=gDG4Gs(p;PHkA zOo@)}p3bJ6%BYPfuy?umb~`)&d?Yt_vZA5_v$L}?FE0-(D=V?Sz8)`Kx@6?CPG<;E zsnQ=5_9+F>$CJI__W+)D`vJy`ZD(eN1y)w5NlU}S`T3K(Vq<%g<Kl)&)6;*aoKJRi zbf8YB!#{?HC)2iVtLLsTS%B0=JXkgXRPF`nXQST$Oz>ZN12L2=UTp0B0!K&mQ7SXV z{VX<UwS&XHhMb(yw$?UmYiq-6R|c?2qq#U$9Z1H#xJTJrGNhM=41Z4mXrf`Wh0{>v z>S`#owl-dS9bgBYJtX4^;?<o|QQtRdwUf=w&Dhn|h23Y)jEM#2_z%$rcQ&2{a9uK- z3o!B#K%p-Qqw8kG`u71&Rs{xPfw?*E0;m-eZ~lD<S#EEiR+f@7cJ$~`Y-wr1UoTuR ztnu*3plho83E220z<@EdHa554qx~<brH_&br;@HNb$7=yl?uNAXr{A;#G|4ml`?F_ z`P0OvPs781s6MQotgEZT%RN04(UFm42G-prfD4U{m;3nOivW9N#-AdhKL+?w?dFC@ zA|jBIKEPfOkBPQ?oM*ZW{(mvyLO2tzEVZ-C%8QS`q0wki*WQlFv9S&E76s|`idQYa z>#e#IfgL1l?{0uT_METfDHM8dfVYJ(58)+?c}9jxoO5BWAeIx)5pQns^E+0Ukuh;h ztv1mAZ^%=ymh-Ri^1_<PNMwV&Y8lSCWSr&zZDV*=Ja9F!hQmn&$XF-N{RuyQVHJYN zA9!i0QkfCu=~>23+|>mnbq&=)SAjx-yzfh#osAUHgyWqb0uWC>@)i$fL!<{nxj2az zWULo$M?Zl;A;wokgwx|B(xbTVAc`Ty+W|iR44{biW-+;(vhGgE-Txy2O3^8bsV1R< zm`6NJ*b_@c-e-~mXEE9>Oc7uvhRb}>at@-pm;H+(Tq2CyifPM^nN7Kjgot@UgtZ8t zy~v}fZOFnG2`AXNx!ikGwxJ|~!)7H?Vr{}8S}4N(h%js^o}-X^&-@MJSdp!hcmgc| O0000<MNUMnLSTZWcGPPC literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/editpaste.png b/examples/text/qml/images/editpaste.png new file mode 100644 index 0000000000000000000000000000000000000000..64c0b2d6ab88a7edf7b4087622fdb3e58c57ce61 GIT binary patch literal 1906 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 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/editredo.png b/examples/text/qml/images/editredo.png new file mode 100644 index 0000000000000000000000000000000000000000..8875bf246c5ec3fb50ba3e8b809152aa421227fc GIT binary patch literal 1752 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 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/editundo.png b/examples/text/qml/images/editundo.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bd5e0bf214adf2b0c780fd2f7de652395d555a GIT binary patch literal 1746 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 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/exportpdf.png b/examples/text/qml/images/exportpdf.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb44e6b8829fd968aa7cca386f21577f5635711 GIT binary patch literal 1215 zcmV;w1VH<VP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000DrNkl<ZcwX(7 zOK4nG9L9g=KIYDyOxtv(QDPr4wLYp=6m3hzphaAWLf1t^U6@T*(z+8wT!^L8MM)P? zTHLu2ieeWPbU-CyY^WsZ%RFpMThm9<$z(dOd++h&+?fnAnQKc2UFZit&fGJ9zVqF4 z&VBKpm!PWN-rkpht^6|@?C<aY3c#YSt(|K(yt{E@H>PQF`lm8y1`8}?eeOibRVJIa zx;(rshVT1KOiXh5;?#RULjb<{HpB4f8B(b=T)ANJ#=d80g^u=r&y}Lbzz-Qx=?*qO zun~ZU0Jde*-ku`8rUTb>iO1u#LS6UWLt<4ypO_j0VEF(sCywhTNF<UtW*g_uje})@ z9RtTfB?48W+nA$>h5vgVl*@_|6pK(&=(YrvGON=oF&&e~9)F7QvGdIX7^b1H6ej9` z?c1Nk+O-S0b}dMW$mIxj>>${)r{3@TI-I|EFLZUO{@r0eg#8B(a^l1p?HPKD<^cjf zQ26+sBJlJQ`0edjM~)(p$hlekH+ymR?ZZ?3_R%9qK%N}J{OAD2$DinWTh&Ve0sx7p zyiDaAXk<hHDe(h8#Pb;$`HfB2X34+uD#8#1D$w<}-sWat&@BX$$(3MR@a%JR@88d) zG}v?_Oa8UjAqdEA+riumFKaKX&^M3~0c0QvGy#DO=;?Waxw|{)JpLs$-AkxB!=T49 zK}sq^Cn<Dy)3bUdbLkYFUmT+@7#*HM1cCOJK|}zMAu_~q9E1>I3rGYAi9kR$%lz)$ zy3R<aNqx8<vsxc_;z%JuqHAk@pot0~LPW^Pktt-~r%X@$0Wllp434dc!O$tNZG{P* zkF0ozVi}GdXZl(W)Nfg?Aj;m7A848f5Tb@4*>1D*=|{OGnPwO&nP54c8XTfn6gB_m z0T2SAF<8I81KYM~fwb4ySWf#QB4<Eg7^Xsya9w^rb(&QxlKTE|`wB1XY;Hk&8HS+| zQ2`7g5Qfl&7cb3l^?J4%43Hq9;aG%wOiR!x36x4jOv4DhqXL8lI;q0cPsLWqR9-@% zyjA<ROJL}MFHDXxJv~LCkmpY1x^1jmw}EuWUAM9XMi@X5NXZB9zr+0eJo$W{N~N+C z(6X#0Y}?kY3a!Hf`bJhRmzVhL^W)l6p~t8TjK&!d2vxW`m8PbFfdTsZ`Z#>}FozBu z(#N+U?WH^w`YMYGP~U{E>r&Im$Ox%aigY@y86F-cN>WPdLVMLtOhjLXwPg@USuac^ z68gzlonqZas9}(>UQ+Fim;tH@7emxd>YFDtzx}I2f<zHM<f86`AgX|%Rq_K*zYCPh zB~8;A@VqjmQi)QrsCRbDBq6tuV`k<uH|A!W&%n)vo6KjkI8K}u$+i{-@VPKP#@P9@ zv?bgOFt}`hLaD&jt221MrvqfZ`;lZa$<F6rY<P}OP0!F=0*S;|KC`noP~QQJj{ZVC zW@jFH@csipX4wFjrhn(xv#0f@``WVfhPx9<8NOZlo<~<#S7ytWNA%$8t0@0(e3}i` d2e0dY{Rxfz)QZ*_NIw7o002ovPDHLkV1mE{M~DCb literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/filenew.png b/examples/text/qml/images/filenew.png new file mode 100644 index 0000000000000000000000000000000000000000..d3882c7b3fe5f85d9d4799013c97d4cab0328b01 GIT binary patch literal 1172 zcmV;F1Z(?=P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$CP_p=R9J<@ zmTgQ^R~W}T#i?^nA;v{zzQp*#$i###LkM&;YV?D1%M?tEiOGz~q9$gE8Cg)=r^SSQ zGsc(rVO#Wr6Z~L|K{wP9ryzoepoOiawLn`+X?t5*DDv$2_nfnPA&OP5k>r<i?&-bf z|9hT$dy9pLEN_xG8lJMiXWNhD8rU<2a^|F@g2^*gfHy2HJ$lxrIDh$ew~?E5ZT{AF zSGe8ojx@J9!e8t@+QiqaH&dX2M;aL+QlpxyzgR3z9*>uXhli=TwIgaRK75L=%Qj6w zg+32Wi%?6;!=y|ik)Y}u4FPM(;UlR?q$Ke4DRFf=V~>MDjq2;~{@;;EBtq9}8<P^I z2@EBkPoQ6;+jr_m-Iho+N`+g0Xf#D2F+4hOaA-8aP?T=|^*3F;`UhR8tfZ={i}YvB zb=tV2?4iYCd27M~2pxzEVuJz%W5k*kP0%BogDNjxqSI%7p|j_Hr`lV0DF4fY_e~Lq zOMysS7cmlzjZj}GPOff0b-Fy{=CO}&3qJ$*Oc982wV?rSbyP?g=NN$&6YCh0VtkGK z3QznQhz^R4Rgf_d^FTyj!yN07GfhB~RrhHk0F0fhPN;QAn<fzE%6h|MV~oC#2=WB= zK&;_djkv}%fgo4k)31kP1jay!;GEYY5a8Cj`-r*%A_M_S25SIoYVPv$?HDjw0GlEl zID5r0q%i*D)#ng^7_Ko@0HN3%V~0nGAkfjPcL#GN=hsXW@P@_42tc(EFbWwvf;C%@ z$pT$Ly*j&(=yA6YK`3OD7(T-s0zDxifH&cIZ^M)XPz^#6*48D$aI8?r5KtX*_d}o@ zui`088Z+rxGARl4vOud_U<_9>09E5ybpajV--0F%e3yBLnQ9bCNdPCJ3fuw&B1DC^ zJP|?&RpCzA{`*dT7WkT?;zP~6$NS72W|kB|M<%^cK(=eLwWPce?QH5Kdf*a42!;T_ zF+Tg3yWr%9u)`~=cY1<D1z(re@E*&VCCq##T}q^>E{rFDR;59};n%Bfu<Pw_c8ZoG zG%4Bcji0|#7x?D;<Bo!_4%X&;zVk=kBbWJzStcdkW8PL>c#*&q+{Y*Vdb``X#dUTO ziuHRoZ~WM=)xMIw6^^{k2WnQY-F0IA(%fBq?OMjl6fmDK*~}s)gPHbH0;uj0SKY~- zaPjxN5uv|T`-=Bg*b$nYzwM`tdCRu*`5Tz^%sR6KlD8nlKdlWmU+nm~Ydt0Ve(uQM z@?G^R>yATnGPAbuIfYD-fkGL&hWT_Nw;=ft7HumlLl^iz+^UZ^eY-z%MIJU@$$Tg` z&S6#?$dT))IO~-kLW4w_Y}riNzPZdiW&!hoZ0lkJI9|wP%FtK)8a_h;ZJW-_kTTeC mwyY|{K)PI?CEGpji|9XLKHy<*PLD7E0000<MNUMnLSTZy^CgS` literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/fileopen.png b/examples/text/qml/images/fileopen.png new file mode 100644 index 0000000000000000000000000000000000000000..fc06c5ec63e50ead55295f6a4b812a4f72b4987a GIT binary patch literal 2168 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 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/fileprint.png b/examples/text/qml/images/fileprint.png new file mode 100644 index 0000000000000000000000000000000000000000..10ca56c82ae0174fff10650b1f26ac72bbaddf89 GIT binary patch literal 2087 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 RY-0cb002ovPDHLkV1oVh`pp0U literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/filesave.png b/examples/text/qml/images/filesave.png new file mode 100644 index 0000000000000000000000000000000000000000..b41ecf5319863b3c5319579e19116f346802563b GIT binary patch literal 1206 zcmV;n1WEgeP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$NJ&INR9M61 zSI=)7MHK#KckT6Vwj{9|B%p0X5I+hOfuJ-(<WLYuh`)kU{sE3isN%qde;{1Aa^VPv zB7r49Ap}s7oun;JOHA6zjR<uT*Y<kX!+SHko76wk*3bhZz07Rp`Mqzx_vX!vkW%77 zHUkg1S@B?ge*RtRPX9-KmlqZmzPtkfJAdS{6CcjZJPy+|vHFvbwdFeYs^NWk^2SY^ zJni7wSJMc?5Ld2T#f@v_b2QZj0N;F@M`2|R+3Zo=+_3Q8`>&5=xu1RdJ#IDvEdG#3 zHaCTnPtA0PfLqE+VPYbS+|emGrh`l-GZFyPPdo~Dysj3;K6>T=x3rys<G65L54Jgm zOPAJ3gH%#!z_tMfL^`TZ(|0<p=Ys(7eUc{7XaLPd)YEs%$7Jpyn6`-*UVH`XrOW*R z7^XpDk(m5}GiP2NvbInQTe0Xju1f>AOY8jkHDy!V7X1OV!!}8XFd%6MIs~jQ1$9!5 zC684vb<aQKDK)0KsH~70v@3~#Y?)-Ytwat0Kt{uMsD(fji+^Z}ZHk*sbUP#&I}#eF zQ=B+NGl!r>lv5b$90roQufLluWeb+J+m-_W$hJgV2{9qtn45cPc!se-reB4C7@O=? zSt*nu*e2O#AAJF6LZvoJVsqj}O+|wL3Pm)M5-y^j?GN-k$3p6HY%j6jAAryzwER*m zLs|wz+R}70^>H|C-W?nQS~*cHDGZ{aDOW;cNnsIwkl0J?_X8jj-vZu53TIz?{%{+e zcMXH`+@8}HmVc#PDfV&nWk3k!TnGclk5AD8QzI!vY^zk-RdzcObTA-b(Ec|J0oQTx z^MzH6AMsRuxR=J;y1KikY#D~3L<|C8@aher6t7*cVC%1H5*o<;^f~w~q8vk4bobM` zNtMxL=WKf*14_Y&(3<L097Qw9mSARu1~DWAhH|`dwS>*hGV1l(eK~iWF&sN~0=cP& z4-*2tdZvpj*2f=xfSsKk)M_=fTCD`2Mb$ADPE_t0G|#EnQ_=D1aEj&gFTPSXS=h%A z1~?B4OlEV*{}&e*v9z?L9B=`eot>pBId^Cl*p`TLppyZk6F{7V4rOlKip3(G<#bQT z<&+c(g(1~hc7(x67AC}yLZrhW)TtLYmyTIJ8Dom$zF+HFrP7x@cgdX$AVSC>4j4I@ zJlx;)?ufRmj1IX0mGD5>?uqx_8s9DWF5uIRiKQ<CLEux-Xwr?Up)z}9jh4T=w~I>U z25$Ym-5<d1z1!HSR+W+=M)+cqAvV@aC|$lthpCn4cR|k()SGo|ZB^)W4RFL8L;kxT z;dvg;zWGkqIbPnZ3`#@NrrQ<S+1|dz?*Oc<{6?3kRQ{Q#pZtUr@;w1u-~1E5UtCp5 z_ceu}Gn?;v;ZonOLb^3iPfzDhoqA3=r&m#}7l7rr-+JTRzxf>NbgsDi-@lIk0gSG! UB0_&5sQ>@~07*qoM6N<$f^ZKn4*&oF literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/logo32.png b/examples/text/qml/images/logo32.png new file mode 100644 index 0000000000000000000000000000000000000000..5f91e9873b7852876a84f0853a092868618a3fb1 GIT binary patch literal 1410 zcmV-|1%3L7P)<h;3K|Lk000e1NJLTq002M$001Be0{{R3l|zoU0002MP)t-saf}Y7 zrKAiE2LJ#7mzS5K$_(u6?ECxtjEsxQ%F1|nchuC>v$L~SY6-f!x;i>HR#sK=^78fd z^~J@-XlZ9jN=O9;1SKaT932@F6bwK?KiJsVG&M1Ca&Vl(4EXr?&(F{A@9*K^;VmvI z-rnBl=jZ_e0ssI1<mBWzMGItn3XQP}n7#~xf`KbF2;1A+U0zv7SO}`s3?C*5nZFFb zzrTH(4q;(nlC}$mrVg9G6qUIS*xJ#?$iHG^SklzXGwz};000DiNkl<ZcwUW_<+39; z6of}G%*>2t_Js|+|6Aoqv%b5VR3+&@t{S^PwGNDh`@iek**Q>Z7>0!uElblri*S-) zlJ-U4<0&Hl4JZ|bBEwL1ODpWS=y8&TSrKCbn#kV(d!}CjC8Y@bk6c<FR^ty3god&6 zX<!#gM5gIyKvjuc)z3%;S$>m`uDc9_<kq$9wS#_YtkO}kX(B%WdvL!C=EdAT-$n8M z%JGRF`YG?EvCD_nb(!DwTDfkmx3?Gqd;#{N_}ttg0*Y>z53$;R2mG#|hWxbXhLH~z zLaN^k`Zz-jib?<w;pN|7FnMW8w=crypWQM_%c83mb&@Db;y!Z@iemXnm`yyv>farw z)%*S9@@*x2{x(VwS{hU>AtVk;P1AyNR@ez<P2d22{*l@6#@uerW5mAMKn4!zBzIBK zIUzVh(#++KCrhyj`ASfU7k2RRDT1z|aAX8iT(8hP=(&gDWQGi0naT6UP7l)Q3m^)t zdYk*Tf@W0J^&88BpCSVUVa!WwkMmsD;0DI1($Yx)KvqC?-!OkA?)MPJygje)H?Uj) zP`z_E<cq29y3#UwwPb|}h9}b(K>Wajq&soXhG9DqAZ)>Rd$0BY;B}4SG_ns5RUeEX zOx8ND1c8;%1RfNP`!NARRUN_f6am1S8{s&PQxc5zeBfsM>edRl0B<Yu{FwdRtk@$0 zkJc+>N*ZO9D#)8>ZL%}Pjz|$tX^|4b0h{$W@Ux%et$1fQAtnc~_IYJydCNSu^IT>_ zH(P~c1SCZEF97iKTv+%SFlE-_Tk5ckvMd202&K7G4O*m`hBETw3c~dc=f4P|`TYvJ z>@<5`*SW4d*TW*aPWWiO<#BKh)S~^Xh+w>2pAoMtAAu_iB|uqrho$xEnW>i4P96%I z>TT`0b#7QCCTkm?yp8Mzk;$)dGgIEid$s#R9VOS3<yvlsW~@&(4)mp!Wmi?Sa9RP- zG(I<16Y94Xf>Aai1K23f2S9jkr#FkM+LL2+k~BONJB-N+SW6a}qWFBZ5|qLy10YuX z<}|`Wx`XfMl97;}s*OQ|&@Q4EpsF@}g?HC0EEBsw058{y0}ht21EBR9%W5Q)BndSR zh3$krJLt8}yBqVQ7vU*vHz|KDqykTnYKGMeW81dAWt`+DOHu{(sqHv1RA2@0I^NdN zj3NMW@h((5{Dur)A4X3?2Su;*f)JY)k0vPiMsdKJVFS*W@R2Rk2U{lWAmh;tiz{n5 zJ)<`^t3hybRT{^y8gPl#_K4RM_$WXxZo74zGXVH{w@5h+`jn+iG|gCYUn_g^>ubGw znwQPyvi-P=Vr9Z|a6qgegeXv8el<*@)P6gZrLI1j?!W;*REeMp%oR@reg?pf5;%&{ zEZx!|hyAaGp<^q)mCNX#e{Ecx2KE&&#cu&>TW?%sZyAkq*!OXtBnL&&OP=801ONzK z&<1Aj)XF-Hl<&kz3Q7uFDPuzZ2Y}#!8WbUQXw)WGl0rLAQxYYCfs};&1uTQy^!f3= Q0RR9107*qoM6N<$g5cAf`2YX_ literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textbold.png b/examples/text/qml/images/textbold.png new file mode 100644 index 0000000000000000000000000000000000000000..38400bd1f69dd4b49ffc29bb2f0eddd14ca39a34 GIT binary patch literal 1611 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 JPDHLkV1n^3?`{A9 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textcenter.png b/examples/text/qml/images/textcenter.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef5b2ee6f3c08ed3aaf385a491b34a98c21f5e4 GIT binary patch literal 1404 zcmV-?1%vvDP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%4oO5oR9M5c zSKV(FRS>7NTBt%uB@{G}!UHzGR2~cu1T_%-8_J*HlZj6S4Y`dN6QT`)1QRiu@<w8S zXj5$|lzwuhy|=x++xyk_ezmu>Kx>Qm(%U`bZ_durb=}<-#fM+!?3|f7zddJm=Ij<C z+OiSeKNYF~whAf(VB1t|CN5)rk)}{HFye!V53&JsezBVU2#gHP5_Kd@YEP`u`5vO~ zDeL)*E|YFg6ZI8{zU(IYHKpihqf8%Nj?t}2*rZHq=`f$^&vmhlseL&P`~GCC(&hUm z@jAW)20@@JL)4om>dYv*n}cI~Rm%>L>d6uoSk*R+)*r{UUH6o!$=<<yXIfGFM4390 zmX5);{LJx#2sHa_c@!80#so27Tu^X~V-A~9@$)(o?;~&}TNUs!Py_4)YJoanKX3>* z3^V{Ai##m){bE-uel-%O$}c&+7Ow=$Pvs4qZ_jTT2Ml0BFzXl_GC%Ixg{Y3V{*_d0 zM4*bdtZj^_2j_Pi=X;^o8h573bg3WbigUk}UZYR0j8o6FHFr_#P3laR>8m?R>wA$C zZDWe`5%}za7lD_Ub!46cE9%RM%qr^7@gi$9P*7TT=|-IHPAjcrJ3XH+>*v7&`>hej z(YwHL{RsSR`}xe8LZ3Od-cCAu>ytoAP;!iuj-zlU<*1Hl5%|Y3coR4k+Ac}78+bz! z>@DC3a1=NWya$9t9vA%)u{$JwyCu$ci5ozmDRkQB)3cM0-!9?Ufiy5D(%ylD*m)(R z9s9H&fsv7tN%v7K2C^nyjS!8@5#7t1^!+_+94;#QcF@$i=mVm&R}JdVuF-Ibv`x53 z+W!h{SRY0nd^e=@e7I=R&6HJ${0Kyni&!vcYOvD~O9a#bka#=}=anAE7KpyN8PjvN zE$aucaNpFbwi}*R^jp!2$#ceIvcHIR0&@OL;EZGYqaF$9-u{dnLB``4+=&=<9K#uV zO?MJjN~Utc>;PT^_5lZ_+Py7__AYP|_z*ZJ@}%gGid}>F?UOh=B(D7>czy-`1e!vv zt{up@b|B;0fz}sIz(_q-6h~2MPY{ij6h)D+=dT$Uo0ND&bR(u{6ywPyea^-UCs24o z6rCwk42w)40U2$-7?gOZFt*4gL1g;(|A#>9b0*=}|CPY2(o**V^}w4zqoWF*06qXd z7kR=_4I9P2Ui@n%-lhm}$J(YHnnEoBeIRHD-2I?M2yB!1l|jA0Ch!WE(3wAoayZjI zwALvUk<>h{WoX6ehbCnnp&MS0Q+mPFbG>NEY2-tG8C`JFvS)u?iaFjofvp=6sMa?b zI2KnF0x8NZk(P`}ESz1m<h5>tG9bhA*+tUCSXy=_6;_l@phn_WZMGXSfsmsb#(k>c zoKF>uJE~yFaW(VqhC;%t9dic1E(z5j3HA<fOp@-b$YY{!6uWx)0&2b5vEQxO-Hz>+ z91Cd4rGQo(bKMJ{wPWA^f`vbcN+>u*B;GK(*X#-sX&F@yU9bpQSW;R)vur*8&@rKP zMLe@je#zASVRS#+J~FeeHx`2b3p4?1Q6_=F2#{Zd^NP|$I7sP<q6beQVRyY}!m<PS z*&3UA%(fhd<IOHx<N2r0|6>yMxEtCD$tXI;agV!T^xyuN*j2GwzF|8d>*TI?Koaes z$OEFU6T6+_SM7Hh^&}8LqDJcZE?HoYEVftV9?|a-yPC}`&iD%zhU4w>^GNIf0000< KMNUMnLSTZ+RFne% literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textitalic.png b/examples/text/qml/images/textitalic.png new file mode 100644 index 0000000000000000000000000000000000000000..0170ee26a6fc568e9b6490e4a45e04f4ff55a19e GIT binary patch literal 1164 zcmV;71atd|P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000D2Nkl<ZcwWVp zU1%It6vxlZ?9OCnKa!Z{V?Soi)<v^cBw|UbHAsX+Y^_m@g(B*kk3!!{`yf6PG~kO5 zzU4&_L4ps`KG>8>eW)l!AzGVM8<Wi@yK6&Rvb(dhGkbSDmpQP5giV`v;(;HRyX-yp zKj-7#D>#k=|EC4uK5YENM=>0xku0=q3%Tx@Cy=CPKKK1sA6|N30mSsXZy!Ca>jN5} z@ZcGS$#QE2LlE2rz5BYAo}Mll$j*K|%ZG;~fQZL?LqSQAOdFul0MPYJH;4ctijdG_ z5a~b(`Hfo!07M>23W&KczB~`e8_x_6C8wrdNy$o7u}}z)Kro07?K(Su>4*Gx7p`nl zYUZGg?Wzc=9^N~4?4`4#hsF{$6F`yxG!<igaeno}{FNEZ`{!^ECc^G5t0!X`*Utd~ zKn?)l=9{g}{S`2hO6gIX0WcIGp{IO4&pYC01bh=f;m>9=sR6)3<oR!+00BJ}ibaF+ z?#nsgC7VtsHH*5y5!?<~UEOF2@HquTu|zCXw*YKLjwFDEg(d$}K#V5!RK(;08m^a0 zWvgDP7&$D!E#Fc=`A_r@?AtG^QKfu`=id!~E|)6<z)!y31w?i*t!wo<fMxNi+W{N- zLKP>Adm<o_jB7mn7ITkX5xI8lMk@k7*T6_ze>7^=0c_h{z*wD?ikr7E|LeX9p!`Qe zVeP4KSFcvH+yh7q@bIs-s^8}b3=O7Jp<2z&ze5H1Pq9G#@4tX-A{Eza)PCFo0f43J zf9+WWM&o)q!f!u|`adWGtSsjY%>SN5V5F-z$qNt|<L$@8PZyA1Z$bf$k7LuPpWOd= zMl(zR-hvF=*U$RRzspXOUB$n7qv;^vpzT@!ZA^fO(?gFvk%@8vmPJpmAV7X~y=Ixl zpMcZW<}SFVxsw>N&E^sblsUNiKxfZ@+X4Irqzh>Aw?C>se*5X~I8~7jLZNj*@*{BD zUO@ZJ6-0e@^8J@X;qYXrI~6f%?iI`!&wr`Ln7#Z+EHeNAQF?%ekr1Mh7@7R-EPzys zNMQ8U4<=rC^VDZ!Z=E?eG<<O8=<ySSbxV<$<G%m6so{QgY+~~8fy2k=o_p=&42}~3 z&`Cr{h(eJN$$#4#5I9f2_>P`TXFfSHJ*D@>`qd^VQnd=ezrG9QHJSSY3ZUEJ=g0fT zkBs-_mRAPPef`bB&Gp5TrIm#Z0I)p%8PY(gCfXOF5Rm204owR<;0UEc(d27P!)zAv z>vbwKP*hdwkH?iQ{H1)`U1(GcsNO9#DD)!I^av5}xeI=opS|HYaAtXF@pWvmAUI8_ z(XdUkdS?wBM?e9h6p%GVjie}d4j*n8Z(gq4Eg27b4mb$=_2TSh9Iqm(H;;%!qwt?K zO%DykBJ5W9ckTj*U`QP?kP1>pw(f&6t*at6Z~ogxz(J$Kqk#Y|vgv>H<;eCC@J4|V ewuk0+hta>;sLepRg`ge)0000<MNUMnLSTaGPA78! literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textjustify.png b/examples/text/qml/images/textjustify.png new file mode 100644 index 0000000000000000000000000000000000000000..39cd6c1a9d75f1d5e571f70e3287224a4c86aef3 GIT binary patch literal 1257 zcmV<F1Qz>=P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000EANkl<ZcwV)a zL5p2A6vuxj$$jrl>qhXCOuvAB1>1$~LJ*45g^Hl43wge}u?lK;3c7G(7uL^E5Eoro zL90--YNtA5+o_%DOxu}v?@f*&Sp>rMPN^99b8>IaBe^-hcTOUz%0ca^6AJ+Zpx8kv zWP9O@xpHtrR5ed>eDMZwjNv9D?{#!B!#aQA-27btM`_2-d@w(<b00zg?*jqF_kqKQ z9NsI=8APJBLfe5VbX@>oGBLD$fDmHeVGMDMWL2|_QD!rE>$TGWX#s}PlC!gbz@_VO zXlCQ&mP>1bh_Gw}-~6m;@(`47*RpTpO!R@^eOm0-S2}th@F66hw(D4#!o^>eiIwpX z48&QA%JXpi(W<Z2col-eKn<J8!WGc~lWcK-DGU&R9_WBJTlykGQh{?6!kYH7sG;2$ z{_0TeK(S*Get33%WNTOHde37kj%DWolc4LoBIMXNj_3noB*lF?aj3%nvS&7R$;XHM zTWg{m_#P$=(HCBQWibe0g3K9-GF-gsnKqV{nQ(a>8Y}d@=f@49>lJH+@2+_S0fis_ z1ZNGiY3#2HjdKw^!%u&Kk&poYKKfXr)DY&_D>a0*Ol5~443(_~pu-^$&H(QLHmN{2 z&0>}<lcWM_$fC_+3G8PZRiN}lRcsUnP+qTgVDQT;Q3E)>6J-a08bXeKbauYFzYj>x zgiT{m1<(kOu)WjatWEDBXTixtl8*+#H5t<2g=O0@om%=nXGsy*-Cgp;<5OOGc^E>m z0;tlq9anC^-d>9Um#+u*9s~}rH2iVbpgyPQtD8dTm5Gz+uXM|RApEka2}s{7Yug5A z!5aAOjsq$PpFIAy0HC}H90dfR+H&&<AqdqoWp=(qI1`hSmVZH={R(We3c@HFz?MXW z2f6|t`^9EB>#UeEVhv&0fe{Exzi#1R2+Ix(LipLo^VOaE0f5Hl^4d6q06r+j2;M6q zBq(?9b<AcB0<=D0MN$>a+0tSy1QkLE7!iztm8o#@)Ix_Kr0oLJ#$bT!TX1M<P!0Tk zoA_Q3lxw#Yktkqe$Kk!l7+BvjSR-))%X$PA0w7%5RA!CA8fEQo2uf+y4t#a$#diSY z|H}iV7y%4r!uRt#>>z|$lMx8p1l}-&zADX(K}ZeVNJ(b&>r0=5Abk4sPv)y3z;fwv z&Jt7;JRt!Hh@=eZoJ0#66l3$aH3o!KF-0W78-c`#A!r6y12hdhck1*ogaUY<Y2Vn+ zlY?^eUdAE#!0r164S*^ecS%0h7;f(51&IhZb_7*YSzq7QRLW7fbq}l=f$-TE7S$=} zzlUI?7*$8I6AJ@KRgRldf*-jY_jNgrSui|IIi?2h;UTR10L8}h=ir&}=($hlt6iVt z<P%sz+lEw5`(Ck5QVF&>kU7H{K>!d$NI)j&kTeFMkoic*J>|snr}<Y1QB7rZ>p=#` zT8V&ZBHsvX?;8X~Ltt|!gQ^O*VqZ1uP6X8$a{oaFPf>2&Rb&Lh^Us`IP={bdb<+`1 zY{`Tp7nAC8QlNC@xw@E?Ojn?*E+zHFqz(ajus&4KXBEP;*efdOx2pZ4lLPz%BE0P^ TcPZ9h00000NkvXXu0mjf)&4_P literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textleft.png b/examples/text/qml/images/textleft.png new file mode 100644 index 0000000000000000000000000000000000000000..83a66d553556318edf017cbb0575eb767401d708 GIT binary patch literal 1235 zcmV;^1T6cBP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000D<Nkl<ZcwViS zO>Z1U5Qg9C?isHQ7moNJguein{0qo|6CVP}oIv6dtu{dl;Q%rxkl?_DT!7q=5Qj)8 zND+`rf<iz+3I=~*M~S_TWADs#6}>erwbYuKRTN5k-R+*5?%J(qt7b?<u*goInGk>= zHA24$;&|oDv0$-51Bi!w55Y5iego?=6iko4x^ij!J^(l*d+y?g<JIXAzzlfLU<iD} zcxuJLdx3KXL}9dqss==Wx@Nt(EDfrL_2#m4FlK%YI*PP1Mlc!yXWuyo02+WnGIe$q z00GxGfR&LAhg)3#i$Fw}Rg9~Dh#t-?VZHS&oY6UZkEcVhKisa-Gz`y-U&4A-*BC7U z*Zvd~mKLTU&od>Z|9kQ;*<7;ggDJQQ!nwG)iE>FOg335L^+^nHP!m)KRdH;Rz^V++ zJb)J<__>32iZWf_M$f0_G{<F-=9?nyNI_%}ezZPby?-cZnvlz7hgt3QT<0jPNxLHp z3J25;U<|=~kEPNnWGAyG<k~48p65JRy!*BS_d!QWkVB}D6^7u9!L>VK<HBNjM7a46 zlziWK{JKS`8-X>1>vuf}q}$$5AEU6{*d&zBh5HEu+$0ENp~)f4WzyISA@`)<A^@M( z6AL+n=K)w%f^I2l6vr~kL~&FVH48e?u~n6EgCPii(%JAQPf8}4z6D{u=RWBR;M976 z@c2aCv=SDDfvCG^J`WCSSZj41XscjZlKKb}T!G*RtgTHLz{g#|4nasp;}cX>jo){G z<Ks&2yt%<)&RAJ4@b`g%__jpf*&}cxC>`PUj-Z~g`VW0$c`!}^Z0*+CTa)eRfNTTv zm?`)!^U0f+f<Fh*&Huz8egxsYRQXUwjWP&>6i}NsRKn{79%3SMCF}YXJP*OOg+ISE z&y71Op^llp2H`?yCH(x8@w3w-)`h}qd(}>-yR*c~Cm;frO2Xm88q1>s0MyqS(k{p% zD4d1001JVcVTiCYBE0(M1OP5{L5Qm6K(W!qjR(NWl7R^0?mcK#BS@GFh=KrYO&uEV zwT*A?8x3H2WU+Y=%L52^_XMM2eocb^a2>ey#@cy>@X71Ia0)sD$RM=c5UR=n2&<qI zRf4gK@~JgP>xWRyEUt#p7JvG0K(QkZq~O#SpN?0Vf!WN%Ijb-kq6i=WBCU|l%}40E zwbYJt2ZFY8B2su8&lr^kFTXzF*piV4Ve%^BeM|e+z8<dryAN9&*fZ`O8Hi?9uzi5J zj~@Q-6c83Yd}m4!Y1{Mekt9wq4B>Af(w(ds{a-1#tYcpaVm0h&$0}{XPtcB=pgOOD zi`#MDR30C~G*?UG>6a#*PsOJ$eKuaL8^9XCD_Df8VtwhT8$sbni<PypIx;IS6k{b) zFcn?`>9zLc$cH}e3C_IM^J1dzBKiRO;1TJa)=~gW57z_sPmFFU%-B0rP!+h{X?w5) z-4CD|gLeK%KTr$vfq=|FC4BLf$#$NC0p%ur>UuHB-i)%h;QZwzLFuAw{$i3UovO|% xU-mGX%w%-tFmc*65gv7%l*(`PYlaU`_8+QxueyjM5HSD%002ovPDHLkV1fu7LRJ6( literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textright.png b/examples/text/qml/images/textright.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c04645cf4db5caf5558a356d6969eeefb5c17c GIT binary patch literal 1406 zcmV-^1%djBP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU%5J^NqR9M5U zm&=b7RTPK6b8c17FbpG4aR32Hd|(C$5Z$<uh3<^;kr>#K_=t~%38<ifre&iG6Bk5d zz=bgx-S{V%F)n-}M&pYZK|lwIzyKMbyQ=OzE~*A<daApDSjow)s=nR*tKa$RoO{L0 z=yhz`(hxw3OX)Io>c?zswBGxN0hto8X>(%-@OY<rUG7^CF;(B17#poW&@SNM-Zyt| z{PgF*hUJ0TvtqtG4kL>Ls&MeQvTjL6967!|V%)O|VyAq5IN{!vN*p=9|4X><c1Sb$ z>W{$sWl*arhfcuVi#>`kcSw2lrN;Q!XnpAn0gX3yZEPlr_kqYMs=44K4TKPgBS#zy zApit?5Yp6Biz5J9Ny^|r%;lzMV3y;;WXjNBOe;0|YeFl5*#q!e2La_2NSn>=3`hsd zt?k?@Q&N?JHrTX?s1z|!E5@k!e2RepWIzfe#h8^M6k%hdb=$P1Q6C$vH>Nvq_0Mww z#tz_-Y4@t#sCw#9;mFmo62j?E?=ZgHx?}hHl|w=>ICRVy8TL4*{CY|m8O~>adn9B1 zazRA-^^|bOqKsM;@x$M+W@$iC4jnf}mUx^hLxal8+o~A2D!>&2zIf~H`uYo#o?7g< z-11;XUoFCbB=tm2$+CcRN*qJ873hl{W`+;ooZ!9ToX~7#%o&Vu%1i-m_PZhluXIR( zc7ZTdq`+pRqdf%`0$d5Yz9RaIu~x(ss8fI?MYMosF}6xj`XUV2JvLh3GgE-E6L_=@ zHthhRRJ?-L!-*aa7~j6Qr@rBqfjqB295Y6i3aR(}c2ZckLJ1yz8HY8?q1p5tKBa89 zO=z|PKm84BZxy0Q`0*I59uCAc<(F|-H9t_RDJp^O+xJ#7pcvom+gIN(dC{<7s8du8 zpFxsks49_DLNMZ5UM4SHN|-xT<8sr$z(oakk$^#(<|48r05Eq*dG>`8g!gaWGiBw} zyZ_jg>*;B@-V}tk>vA193p_YBTDR#AOs{@Zu=Te=*jE7RN`=T5ptaf{Y?k0GSH)db z5Ox#LkMS(<K*^EzBU}T7R~)E<u$O>O_P<kKJ$X6s=V{^2B|?$}j-D1)EHG4rzs?IQ z=0oNKzn?Ph8g{f=DaR%pE9QIRC}LK>@XQO14iNSb@cz5?)oBK)2NgpE($t8e+>k5_ z_z)PJ9g(I6NIoYEI8_YjtHIOH-<W`M3U0IxTyqLs2MGI1Ex8K9qyVo9LVqm~$}|Uz zZNNiasv%ukao5+dQ!kkAfbrRf`|E34EjTd&w=IHJV*GPKSUMNH51g1VmM>7ujPY~A z@K7L%9OLKV*7;xtNB<2hn<qFGoHMpQ_j<=}sHJ99!}#oj_ja#K5<^5#71AsaJG}yz zs$d3A!3U7S7pH;`xdD+=k~E(?&@XIxs&_limtc7c9{wLv(7hQI3lgnp$8o6z-)K9| zD%$a`nQOw$jhz*%VyWl}*Xls|oZb#>ZXEphKz-whGscp6d9Ke~R2I%QMB(Iwv21~o zW`VPpl!b#}!8m<USTx5Fgn!N(H_ri4I6WyW8qC=_dCpjTli(C02TwfNVPo>qf%-=8 z4Kv9fPjZS?bNxO9KuUmtYCcyTgpgOi5DXPavs{1(`3S^uX8}7pq@YuD+L&}+3tq>@ zq^dH;r6T1jHYUE*a?`fTcZG}gU9+@r&pU{46(J=7R-(KdUH=^5KeRqG?paFC4*&oF M07*qoM6N<$g4^GUS^xk5 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/textunder.png b/examples/text/qml/images/textunder.png new file mode 100644 index 0000000000000000000000000000000000000000..968bac5e90e3bc101959e8acc0f06fdaa79bbc73 GIT binary patch literal 1183 zcmV;Q1YrA#P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007q5 z)K6G40000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$F-b&0R9M5s zmu*Z_R~W}D>f&a`GGn%E-KNVXQ8%L@nVL-sQ<iKxCqo2{AB=NZHb7nyO-2<kzDJk6 zGOWq~hfz^CK$C$Op)FuXp)Xi@M}Zax6pd8Vge4@8{|D|hwU*M}`@s*t+<VVC&pE&I zoO63m6-1<XmOSwgwQ<i(@I7c0C<3`&h;@9w(kng;sD=76uedUyoa@6T64>%vvA(bS zArVvC?sQjL9Igtp!*vB*wK`m49p7`uUh(R4*K9*vZ??NexQz%ub2-;@JHHv&l%8Wd zoL||aYjL`p28c`!BFh~j>z$F&Um^HSW`2vm42bbHZBBQ`eWDsngrB+GZw5R%Qi50x zXzU}ZyG2yrOLQ==vIpgfV1d7N72{d7>j9B4a4eVm-2*;4YBXWyHC^KZ>4(pCploTN z8;s*ST||5hXcPMCpb-K(2pAxcCPAQmSf+pxOHkE;W#}PFl_1b6SHOS`c(sj4e;Wda zf){AMFH@ivGcRu@s_rC8ksx5ZCsRO&nP0Xc3s{Ej2ZI-|-jykE4I8l3N>tG*O~5=P zQ{W0_e!+w+U>TAn2sAil3jEVfbhd%01j~?gAb5fLL74)VTZoGOCAx@ZNR%LOeL$u_ zDN<i>9Ul=h(RUIAYWrmh{B@J)L@m*2bn&eO0o{Kx1^&hoX!OW}0pEfj%Wk18I>5n| zaj7}B@~)9l+*e5z$UR==aA|6gg*u|_0(~E!83GiDPJ?h^-P7lWU<9`8Db)AnVfHy% zNNAmIJ|zVxp#JHSZHVLjNl(^E=<01pEPt9tMt{dL<Qs|Br;L5u*G&?)j@wn(AGcRZ z5)e8|%tGo<;VsbMZ8(N3K+39$-yN$^D5iQ4!bB!y#f(WCo$dq04gGw=3iwd^M1?{z zg*y!Y<m=GLgv?$0&l(3#-yk|=Av#$%=uZBj^mb%IwpkUQb)3P#ny8K0rtK&%tRHkU zyj&3*cD>Gh1tlO1J`Fqvo?oQe{7yt%Mt0KClI|kQ@c$R_>sW$g+NEw}Mcey8qqUF0 z&&=L4#(_`2I?{xgIH8}Ai6s0DJ_Ec6W`S40YagsmPKk(9S8m#QqBA3}y8q|$_Tk*> z-iHj|b6HH%FRdTO?A$*u{ImBE^AdOgOlOHn1%$z;3WIa-tKcp0E|?D%f<<%R|M<%# ztF~q>Ta!|-{EPJS%h#qAFZ(?8kMQViYURA8QD_qe-Ugihmj#JwzOvvg5F#|3`BBV{ zeX0$+ZCJybm~{)%*~+X~pV2lEVw>^y>Sm5t#b-8Qe^_`Q`O1PX0Zvya2a10}I)|kr z_Q4xAXaNJhWQ-2yLal(#KK`r|@9iFSeDx^ft6^}QU<97&5(Kmf!D6t)gT+EQ@B9Ul xH{oQjAy9%h!5lExgE@le8^WM0K0A=t@DY&122E81RKNfL002ovPDHLkV1kBi8^r(s literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/zoomin.png b/examples/text/qml/images/zoomin.png new file mode 100644 index 0000000000000000000000000000000000000000..d46f5aff0d9810d21bc98be02776e843b2db7ee9 GIT binary patch literal 1696 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 literal 0 HcmV?d00001 diff --git a/examples/text/qml/images/zoomout.png b/examples/text/qml/images/zoomout.png new file mode 100644 index 0000000000000000000000000000000000000000..46326566d11ebdda9a7b753b45da7a5803a36412 GIT binary patch literal 1662 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 IM6N<$f`v>W)&Kwi literal 0 HcmV?d00001 diff --git a/examples/text/qml/main.qml b/examples/text/qml/main.qml new file mode 100644 index 000000000..73aadadb9 --- /dev/null +++ b/examples/text/qml/main.qml @@ -0,0 +1,243 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * 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. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT +** OWNER 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Controls 1.0 +import QtQuick.Layouts 1.0 +import QtQuick.Dialogs 1.0 +import org.qtproject.example 1.0 + +ApplicationWindow { + width: 640 + height: 480 + minimumWidth: 400 + minimumHeight: 300 + + Action { + id: cut + text: "Cut" + shortcut: "ctrl+x" + iconSource: "images/editcut.png" + iconName: "edit-cut" + } + + Action { + id: copy + text: "Copy" + shortcut: "Ctrl+C" + iconSource: "images/editcopy.png" + iconName: "edit-copy" + onTriggered: console.log("Ctrl C pressed - in action...") + } + + Action { + id: paste + text: "Paste" + shortcut: "ctrl+v" + iconSource: "qrc:images/editpaste.png" + iconName: "edit-paste" + } + + Action { + id: alignLeft + text: "&Left" + iconSource: "images/textleft.png" + iconName: "format-justify-left" + shortcut: "ctrl+l" + onTriggered: document.alignment = Qt.AlignLeft + checkable: true + checked: document.alignment == Qt.AlignLeft + } + Action { + id: alignCenter + text: "C&enter" + iconSource: "images/textcenter.png" + iconName: "format-justify-center" + onTriggered: document.alignment = Qt.AlignCenter + checkable: true + checked: document.alignment == Qt.AlignCenter + } + Action { + id: alignRight + text: "&Right" + iconSource: "images/textright.png" + iconName: "format-justify-right" + onTriggered: document.alignment = Qt.AlignRight + checkable: true + checked: document.alignment == Qt.AlignRight + } + Action { + id: alignJustify + text: "&Justify" + iconSource: "images/textjustify.png" + iconName: "format-justify-fill" + onTriggered: document.alignment = Qt.AlignJustify + checkable: true + checked: document.alignment == Qt.AlignJustify + } + + Action { + id: bold + text: "&Bold" + iconSource: "images/textbold.png" + iconName: "format-text-bold" + onTriggered: document.bold = !document.bold + checkable: true + checked: document.bold + } + Action { + id: italic + text: "&Italic" + iconSource: "images/textitalic.png" + iconName: "format-text-italic" + onTriggered: document.italic = !document.italic + checkable: true + checked: document.italic + } + Action { + id: underline + text: "&Underline" + iconSource: "images/textunder.png" + iconName: "format-text-underline" + onTriggered: document.underline = !document.underline + checkable: true + checked: document.underline + } + Action { + id: color + text: "&Color ..." + iconSource: "images/textcolor.png" + iconName: "format-text-color" + } + + FileDialog { + id: file + nameFilters: ["Text files (*.txt)", "HTML files (*.html)"] + onAccepted: document.fileUrl = fileUrl + } + + menuBar: MenuBar { + Menu { + title: "&File" + MenuItem { text: "Open"; onTriggered: file.open() } + MenuItem { text: "Quit"; onTriggered: Qt.quit() } + } + Menu { + title: "&Edit" + MenuItem { action: copy } + MenuItem { action: cut } + MenuItem { action: paste } + } + Menu { + title: "F&ormat" + MenuItem { action: bold } + MenuItem { action: italic } + MenuItem { action: underline } + MenuSeparator {} + MenuItem { action: alignLeft } + MenuItem { action: alignCenter } + MenuItem { action: alignRight } + MenuItem { action: alignJustify } + MenuSeparator {} + MenuItem { action: color } + } + Menu { + title: "&Help" + MenuItem { text: "About..." } + MenuItem { text: "About Qt" } + } + } + + toolBar: ToolBar { + id: mainToolBar + width: parent.width + RowLayout { + ToolButton { action: copy } + ToolButton { action: cut } + ToolButton { action: paste } + + ToolButton { action: bold } + ToolButton { action: italic } + ToolButton { action: underline } + + ToolButton { action: alignLeft } + ToolButton { action: alignCenter } + ToolButton { action: alignRight } + ToolButton { action: alignJustify } + } + } + ToolBar { + id: secondaryToolBar + width: parent.width + + RowLayout { + anchors.fill: parent + ComboBox { + model: document.defaultFontSizes + onCurrentTextChanged: document.fontSize = currentText + currentIndex: document.defaultFontSizes.indexOf(document.fontSize + "") + } + TextField { id: fontEdit; enabled: false } + Item { Layout.horizontalSizePolicy: Layout.Expanding } + } + } + + TextArea { + Accessible.name: "document" + id: textArea + width: parent.width + anchors.top: secondaryToolBar.bottom + anchors.bottom: parent.bottom + text: document.text + textFormat: Qt.RichText + Component.onCompleted: forceActiveFocus() + } + + DocumentHandler { + id: document + target: textArea + cursorPosition: textArea.cursorPosition + selectionStart: textArea.selectionStart + selectionEnd: textArea.selectionEnd + onCurrentFontChanged: { + fontEdit.text = currentFont.family + } + } +} diff --git a/examples/text/resources.qrc b/examples/text/resources.qrc new file mode 100644 index 000000000..e67fac6ad --- /dev/null +++ b/examples/text/resources.qrc @@ -0,0 +1,26 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource prefix="/"> + <file>qml/main.qml</file> + <file>qml/images/logo32.png</file> + <file>qml/images/editcopy.png</file> + <file>qml/images/editcut.png</file> + <file>qml/images/editpaste.png</file> + <file>qml/images/editredo.png</file> + <file>qml/images/editundo.png</file> + <file>qml/images/exportpdf.png</file> + <file>qml/images/filenew.png</file> + <file>qml/images/fileopen.png</file> + <file>qml/images/fileprint.png</file> + <file>qml/images/filesave.png</file> + <file>qml/images/textbold.png</file> + <file>qml/images/textcenter.png</file> + <file>qml/images/textitalic.png</file> + <file>qml/images/textjustify.png</file> + <file>qml/images/textleft.png</file> + <file>qml/images/textright.png</file> + <file>qml/images/textunder.png</file> + <file>qml/images/zoomin.png</file> + <file>qml/images/zoomout.png</file> + <file>example.html</file> +</qresource> +</RCC> diff --git a/examples/text/src/documenthandler.cpp b/examples/text/src/documenthandler.cpp new file mode 100644 index 000000000..b382e6f03 --- /dev/null +++ b/examples/text/src/documenthandler.cpp @@ -0,0 +1,261 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * 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. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT +** OWNER 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "documenthandler.h" + +#include <QtGui/QTextDocument> +#include <QtGui/QTextCursor> +#include <QtGui/QFontDatabase> + +DocumentHandler::DocumentHandler() + : m_target(0) + , m_doc(0) + , m_cursorPosition(-1) + , m_selectionStart(0) + , m_selectionEnd(0) +{ + setFileUrl(QUrl("qrc:/example.html")); +} + +void DocumentHandler::setTarget(QQuickItem *target) +{ + m_doc = 0; + m_target = target; + if (!m_target) + return; + + QVariant doc = m_target->property("textDocument"); + if (doc.canConvert<QQuickTextDocument*>()) { + QQuickTextDocument *qqdoc = doc.value<QQuickTextDocument*>(); + if (qqdoc) + m_doc = qqdoc->textDocument(); + } + emit targetChanged(); +} + +void DocumentHandler::setFileUrl(const QUrl &arg) +{ + if (m_fileUrl != arg) { + m_fileUrl = arg; + if (QFile::exists(QQmlFile::urlToLocalFileOrQrc(arg))) { + QFile file(QQmlFile::urlToLocalFileOrQrc(arg)); + if (file.open(QFile::ReadOnly)) { + QByteArray data = file.readAll(); + QTextCodec *codec = QTextCodec::codecForHtml(data); + setText(codec->toUnicode(data)); + emit textChanged(); + } + } + emit fileUrlChanged(); + } +} + +void DocumentHandler::setText(const QString &arg) +{ + if (m_text != arg) { + m_text = arg; + emit textChanged(); + } +} + +QUrl DocumentHandler::fileUrl() const +{ + return m_fileUrl; +} + +QString DocumentHandler::text() const +{ + return m_text; +} + +void DocumentHandler::setCursorPosition(int position) +{ + if (position == m_cursorPosition) + return; + + m_cursorPosition = position; + + emit currentFontChanged(); + emit alignmentChanged(); + emit boldChanged(); + emit italicChanged(); + emit underlineChanged(); + emit fontSizeChanged(); +} + +QTextCursor DocumentHandler::textCursor() const +{ + QTextCursor cursor = QTextCursor(m_doc); + if (m_selectionStart != m_selectionEnd) { + cursor.setPosition(m_selectionStart); + cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); + } else { + cursor.setPosition(m_cursorPosition); + } + return cursor; +} + +void DocumentHandler::mergeFormatOnWordOrSelection(const QTextCharFormat &format) +{ + QTextCursor cursor = textCursor(); + if (!cursor.hasSelection()) + cursor.select(QTextCursor::WordUnderCursor); + cursor.mergeCharFormat(format); +} + +void DocumentHandler::setSelectionStart(int position) +{ + m_selectionStart = position; +// emit selectionStartChanged(); +} + +void DocumentHandler::setSelectionEnd(int position) +{ + m_selectionEnd = position; +// emit selectionEndChanged(); +} + +void DocumentHandler::setAlignment(Qt::Alignment a) +{ + QTextBlockFormat fmt; + fmt.setAlignment((Qt::Alignment) a); + QTextCursor cursor = QTextCursor(m_doc); + cursor.setPosition(m_selectionStart, QTextCursor::MoveAnchor); + cursor.setPosition(m_selectionEnd, QTextCursor::KeepAnchor); + cursor.mergeBlockFormat(fmt); + emit alignmentChanged(); +} + +Qt::Alignment DocumentHandler::alignment() const +{ +// if (!m_doc || m_doc->isEmpty() || m_cursorPosition < 0) +// return Qt::AlignLeft; + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return Qt::AlignLeft; + return textCursor().blockFormat().alignment(); +} + +bool DocumentHandler::bold() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return false; + return textCursor().charFormat().fontWeight() == QFont::Bold; +} + +bool DocumentHandler::italic() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return false; + return textCursor().charFormat().fontItalic(); +} + +bool DocumentHandler::underline() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull() || cursor.blockNumber() == 0) + return false; + return textCursor().charFormat().fontUnderline(); +} + +void DocumentHandler::setBold(bool arg) +{ + QTextCharFormat fmt; + fmt.setFontWeight(arg ? QFont::Bold : QFont::Normal); + mergeFormatOnWordOrSelection(fmt); + emit boldChanged(); +} + +void DocumentHandler::setItalic(bool arg) +{ + QTextCharFormat fmt; + fmt.setFontItalic(arg); + mergeFormatOnWordOrSelection(fmt); + emit italicChanged(); +} + +void DocumentHandler::setUnderline(bool arg) +{ + QTextCharFormat fmt; + fmt.setFontUnderline(arg); + mergeFormatOnWordOrSelection(fmt); + emit underlineChanged(); +} + +int DocumentHandler::fontSize() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return 0; + QTextCharFormat format = cursor.charFormat(); + return format.font().pointSize(); +} + +void DocumentHandler::setFontSize(int arg) +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return; + QTextCharFormat format; + format.setFontPointSize(arg); + mergeFormatOnWordOrSelection(format); + emit fontSizeChanged(); +} + +QFont DocumentHandler::currentFont() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QFont(); + QTextCharFormat format = cursor.charFormat(); + return format.font(); +} + +QStringList DocumentHandler::defaultFontSizes() const +{ + // uhm... this is quite ugly + QStringList sizes; + QFontDatabase db; + foreach (int size, db.standardSizes()) + sizes.append(QString::number(size)); + return sizes; +} diff --git a/examples/text/src/documenthandler.h b/examples/text/src/documenthandler.h new file mode 100644 index 000000000..804b16d06 --- /dev/null +++ b/examples/text/src/documenthandler.h @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * 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. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT +** OWNER 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef DOCUMENTHANDLER_H +#define DOCUMENTHANDLER_H + +#include <QQuickTextDocument> + +#include <QtGui/QTextCharFormat> +#include <QtCore/QTextCodec> + +#include <qqmlfile.h> + +QT_BEGIN_NAMESPACE +class QTextDocument; +QT_END_NAMESPACE + +class DocumentHandler : public QObject +{ + Q_OBJECT + + Q_ENUMS(HAlignment) + + Q_PROPERTY(QQuickItem *target READ target WRITE setTarget NOTIFY targetChanged) + Q_PROPERTY(int cursorPosition READ cursorPosition WRITE setCursorPosition NOTIFY cursorPositionChanged) + Q_PROPERTY(int selectionStart READ selectionStart WRITE setSelectionStart NOTIFY selectionStartChanged) + Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged) + + Q_PROPERTY(QFont currentFont READ currentFont NOTIFY currentFontChanged) + Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) + + Q_PROPERTY(bool bold READ bold WRITE setBold NOTIFY boldChanged) + Q_PROPERTY(bool italic READ italic WRITE setItalic NOTIFY italicChanged) + Q_PROPERTY(bool underline READ underline WRITE setUnderline NOTIFY underlineChanged) + + Q_PROPERTY(int fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) + + Q_PROPERTY(QStringList defaultFontSizes READ defaultFontSizes NOTIFY defaultFontSizesChanged) + + + Q_PROPERTY(QUrl fileUrl READ fileUrl WRITE setFileUrl NOTIFY fileUrlChanged) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + +public: + DocumentHandler(); + + QQuickItem *target() { return m_target; } + + void setTarget(QQuickItem *target); + + void setCursorPosition(int position); + void setSelectionStart(int position); + void setSelectionEnd(int position); + + int cursorPosition() const { return m_cursorPosition; } + int selectionStart() const { return m_selectionStart; } + int selectionEnd() const { return m_selectionEnd; } + + QFont currentFont() const; + + Qt::Alignment alignment() const; + void setAlignment(Qt::Alignment a); + + bool bold() const; + bool italic() const; + bool underline() const; + int fontSize() const; + + QStringList defaultFontSizes() const; + QUrl fileUrl() const; + QString text() const; + +public Q_SLOTS: + void setBold(bool arg); + void setItalic(bool arg); + void setUnderline(bool arg); + void setFontSize(int arg); + + void setFileUrl(const QUrl &arg); + void setText(const QString &arg); + +Q_SIGNALS: + void targetChanged(); + void cursorPositionChanged(); + void selectionStartChanged(); + void selectionEndChanged(); + + void currentFontChanged(); + void alignmentChanged(); + + void boldChanged(); + void italicChanged(); + void underlineChanged(); + + void fontSizeChanged(); + void defaultFontSizesChanged(); + + void fileUrlChanged(); + + void textChanged(); + +private: + QTextCursor textCursor() const; + void mergeFormatOnWordOrSelection(const QTextCharFormat &format); + + QQuickItem *m_target; + QTextDocument *m_doc; + + int m_cursorPosition; + int m_selectionStart; + int m_selectionEnd; + + QFont m_font; + bool m_bold; + bool m_italic; + bool m_underline; + int m_fontSize; + QUrl m_fileUrl; + QString m_text; +}; + +#endif diff --git a/examples/text/src/main.cpp b/examples/text/src/main.cpp new file mode 100644 index 000000000..0fc064dce --- /dev/null +++ b/examples/text/src/main.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Quick Controls module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * 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. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT +** OWNER 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtWidgets/QApplication> +#include <QtQml> +#include <QtQuick/QQuickView> +#include <QtCore/QString> + +#include "documenthandler.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + QQmlEngine engine; + + qmlRegisterType<DocumentHandler>("org.qtproject.example", 1, 0, "DocumentHandler"); + + QQmlComponent component(&engine); + component.loadUrl(QUrl("qrc:/qml/main.qml")); + if ( !component.isReady() ) { + qWarning("%s", qPrintable(component.errorString())); + return -1; + } + QObject *topLevel = component.create(); + QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel); + if ( !window ) { + qWarning("Error: Your root item has to be a Window."); + return -1; + } + + QObject::connect(&engine, SIGNAL(quit()), &app, SLOT(quit())); + window->show(); + return app.exec(); +} diff --git a/examples/text/src/src.pri b/examples/text/src/src.pri new file mode 100644 index 000000000..2b89cd629 --- /dev/null +++ b/examples/text/src/src.pri @@ -0,0 +1,9 @@ +SOURCES += \ + $$PWD/documenthandler.cpp \ + $$PWD/main.cpp + + +HEADERS += \ + $$PWD/documenthandler.h + + diff --git a/examples/text/text.pro b/examples/text/text.pro new file mode 100644 index 000000000..8b36231aa --- /dev/null +++ b/examples/text/text.pro @@ -0,0 +1,16 @@ +QT += widgets qml quick +CONFIG += console +TARGET = text + +include(src/src.pri) + +OTHER_FILES += \ + qml/main.qml + +RESOURCES += \ + resources.qrc + +MOC_DIR = ./.moc +OBJECTS_DIR = ./.obj +UI_DIR = ./.ui +RCC_DIR = ./.rcc -- GitLab