1 | /****************************************************************************
|
---|
2 | **
|
---|
3 | ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
---|
4 | ** Contact: Qt Software Information ([email protected])
|
---|
5 | **
|
---|
6 | ** This file is part of the documentation of the Qt Toolkit.
|
---|
7 | **
|
---|
8 | ** $QT_BEGIN_LICENSE:LGPL$
|
---|
9 | ** Commercial Usage
|
---|
10 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
---|
11 | ** accordance with the Qt Commercial License Agreement provided with the
|
---|
12 | ** Software or, alternatively, in accordance with the terms contained in
|
---|
13 | ** a written agreement between you and Nokia.
|
---|
14 | **
|
---|
15 | ** GNU Lesser General Public License Usage
|
---|
16 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
---|
17 | ** General Public License version 2.1 as published by the Free Software
|
---|
18 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
---|
19 | ** packaging of this file. Please review the following information to
|
---|
20 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
---|
21 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
---|
22 | **
|
---|
23 | ** In addition, as a special exception, Nokia gives you certain
|
---|
24 | ** additional rights. These rights are described in the Nokia Qt LGPL
|
---|
25 | ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
|
---|
26 | ** package.
|
---|
27 | **
|
---|
28 | ** GNU General Public License Usage
|
---|
29 | ** Alternatively, this file may be used under the terms of the GNU
|
---|
30 | ** General Public License version 3.0 as published by the Free Software
|
---|
31 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
---|
32 | ** packaging of this file. Please review the following information to
|
---|
33 | ** ensure the GNU General Public License version 3.0 requirements will be
|
---|
34 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
---|
35 | **
|
---|
36 | ** If you are unsure which license is appropriate for your use, please
|
---|
37 | ** contact the sales department at [email protected].
|
---|
38 | ** $QT_END_LICENSE$
|
---|
39 | **
|
---|
40 | ****************************************************************************/
|
---|
41 |
|
---|
42 | /*!
|
---|
43 | \page richtext.html
|
---|
44 | \nextpage Rich Text Document Structure
|
---|
45 |
|
---|
46 | \title Rich Text Processing
|
---|
47 | \ingroup architecture
|
---|
48 | \ingroup text-processing
|
---|
49 | \brief An overview of Qt's rich text processing, editing and display features.
|
---|
50 |
|
---|
51 | The Scribe framework provides a set of classes for reading and manipulating
|
---|
52 | structured rich text documents. Unlike previous rich text support in Qt, the
|
---|
53 | new classes are centered around the QTextDocument class rather than raw
|
---|
54 | textual information. This enables the developer to create and modify
|
---|
55 | structured rich text documents without having to prepare content in an
|
---|
56 | intermediate markup format.
|
---|
57 |
|
---|
58 | The information within a document can be accessed via two complementary
|
---|
59 | interfaces: A cursor-based interface is used for editing, and a read-only
|
---|
60 | hierarchical interface provides a high level overview of the document
|
---|
61 | structure. The main advantage of the cursor-based interface is that the
|
---|
62 | text can be edited using operations that mimic a user's interaction with
|
---|
63 | an editor, without losing the underlying structure of the document. The
|
---|
64 | read-only hierarchical interface is most useful when performing operations
|
---|
65 | such as searching and document export.
|
---|
66 |
|
---|
67 | This document is divided up into chapters for convenient reference:
|
---|
68 |
|
---|
69 | \list
|
---|
70 | \i \l{Rich Text Document Structure} outlines
|
---|
71 | the different kinds of elements in a QTextDocument, and describes how
|
---|
72 | they are arranged in a document structure.
|
---|
73 | \i \l{The QTextCursor Interface} explains how rich
|
---|
74 | text documents can be edited using the cursor-based interface.
|
---|
75 | \i \l{Common Rich Text Editing Tasks} examines some
|
---|
76 | common tasks that involve reading or manipulating rich text documents.
|
---|
77 | \i \l{Advanced Rich Text Processing} examines advanced rich text editing tasks.
|
---|
78 | \i \l{Supported HTML Subset} lists the HTML tags supported by QTextDocument.
|
---|
79 | \endlist
|
---|
80 |
|
---|
81 | See also the list of \l{Text Processing Classes}.
|
---|
82 |
|
---|
83 | */
|
---|
84 |
|
---|
85 | /*!
|
---|
86 | \page richtext-structure.html
|
---|
87 | \contentspage richtext.html Contents
|
---|
88 | \previouspage Rich Text Processing
|
---|
89 | \nextpage The QTextCursor Interface
|
---|
90 |
|
---|
91 | \title Rich Text Document Structure
|
---|
92 |
|
---|
93 | \tableofcontents
|
---|
94 |
|
---|
95 | The structured representation of a text document presents its contents as
|
---|
96 | a hierarchy of text blocks, frames, tables, and other objects. These provide
|
---|
97 | a logical structure to the document and describe how their contents will be
|
---|
98 | displayed. Generally, frames and tables are used to group other
|
---|
99 | structures while text blocks contain the actual textual information.
|
---|
100 |
|
---|
101 | New elements are created and inserted into the document programmatically
|
---|
102 | \l{richtext-cursor.html}{with a QTextCursor} or by using an editor
|
---|
103 | widget, such as QTextEdit. Elements can be given a particular format when
|
---|
104 | they are created; otherwise they take the cursor's current format for the
|
---|
105 | element.
|
---|
106 |
|
---|
107 | \table
|
---|
108 | \row
|
---|
109 | \i \inlineimage richtext-document.png
|
---|
110 | \i \bold{Basic structure}
|
---|
111 |
|
---|
112 | The "top level" of a document might be populated in the way shown.
|
---|
113 | Each document always contains a root frame, and this always contains
|
---|
114 | at least one text block.
|
---|
115 |
|
---|
116 | For documents with some textual content, the root
|
---|
117 | frame usually contains a sequence of blocks and other elements.
|
---|
118 |
|
---|
119 | Sequences of frames and tables are always separated by text blocks in a
|
---|
120 | document, even if the text blocks contain no information. This ensures that
|
---|
121 | new elements can always be inserted between existing structures.
|
---|
122 | \endtable
|
---|
123 |
|
---|
124 | In this chapter, we look at each of the structural elements
|
---|
125 | used in a rich text document, outline their features and uses, and show
|
---|
126 | how to examine their contents. Document editing is described in
|
---|
127 | \l{richtext-cursor.html}{The QTextCursor Interface}.
|
---|
128 |
|
---|
129 | \section1 Rich Text Documents
|
---|
130 |
|
---|
131 | QTextDocument objects contain all the information required to construct
|
---|
132 | rich text documents for use with a QTextEdit widget or in a custom editor.
|
---|
133 | Although QTextEdit makes it easy to display and edit rich text, documents
|
---|
134 | can also be used independently of any editor widget, for example:
|
---|
135 |
|
---|
136 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 0
|
---|
137 |
|
---|
138 | Alternatively, they can be extracted from an existing editor:
|
---|
139 |
|
---|
140 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 1
|
---|
141 |
|
---|
142 | This flexibility enables applications to handle multiple rich text
|
---|
143 | documents without the overhead of multiple editor widgets, or requiring
|
---|
144 | documents to be stored in some intermediate format.
|
---|
145 |
|
---|
146 | An empty document contains a root frame which itself contains a single
|
---|
147 | empty text block. The \l{richtext-cursor.html}{text cursor interface}
|
---|
148 | automatically inserts new document elements into the root frame, and
|
---|
149 | ensures that it is padded with empty blocks where necessary.
|
---|
150 |
|
---|
151 | We obtain the root frame in the following manner:
|
---|
152 |
|
---|
153 | \snippet doc/src/snippets/textdocument-frames/xmlwriter.h 0
|
---|
154 | \snippet doc/src/snippets/textdocument-frames/xmlwriter.cpp 0
|
---|
155 |
|
---|
156 | When navigating the document structure, it is useful to begin at the
|
---|
157 | root frame because it provides access to the entire document structure.
|
---|
158 |
|
---|
159 | \section1 Document Elements
|
---|
160 |
|
---|
161 | Rich text documents usually consist of common elements such as paragraphs,
|
---|
162 | frames, tables, and lists. These are represented in a QTextDocument
|
---|
163 | by the QTextBlock, QTextFrame, QTextTable, and QTextList classes.
|
---|
164 | Unlike the other elements in a document, images are represented by
|
---|
165 | specially formatted text fragments. This enables them to be placed
|
---|
166 | formatted inline with the surrounding text.
|
---|
167 |
|
---|
168 | The basic structural building blocks in documents are QTextBlock and
|
---|
169 | QTextFrame. Blocks themselves contain fragments of rich text
|
---|
170 | (QTextFragment), but these do not directly influence the high level
|
---|
171 | structure of a document.
|
---|
172 |
|
---|
173 | Elements which can group together other document elements are typically
|
---|
174 | subclasses of QTextObject, and fall into two categories: Elements that
|
---|
175 | group together text blocks are subclasses of QTextBlockGroup, and those
|
---|
176 | that group together frames and other elements are subclasses of QTextFrame.
|
---|
177 |
|
---|
178 | \section2 Text Blocks
|
---|
179 |
|
---|
180 | Text blocks are provided by the QTextBlock class.
|
---|
181 |
|
---|
182 | Text blocks group together fragments of text with different character formats,
|
---|
183 | and are used to represent paragraphs in the document. Each block
|
---|
184 | typically contains a number of text fragments with different styles.
|
---|
185 | Fragments are created when text is inserted into the document, and more
|
---|
186 | of them are added when the document is edited. The document splits, merges,
|
---|
187 | and removes fragments to efficiently represent the different styles
|
---|
188 | of text in the block.
|
---|
189 |
|
---|
190 | The fragments within a given block can be examined by using a
|
---|
191 | QTextBlock::iterator to traverse the block's internal structure:
|
---|
192 |
|
---|
193 | \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 3
|
---|
194 | \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 5
|
---|
195 | \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 6
|
---|
196 |
|
---|
197 | Blocks are also used to represent list items. As a result, blocks can
|
---|
198 | define their own character formats which contain information about
|
---|
199 | block-level decoration, such as the type of bullet points used for
|
---|
200 | list items. The formatting for the block itself is described by the
|
---|
201 | QTextBlockFormat class, and describes properties such as text alignment,
|
---|
202 | indentation, and background color.
|
---|
203 |
|
---|
204 | Although a given document may contain complex structures, once we have a
|
---|
205 | reference to a valid block in the document, we can navigate between each
|
---|
206 | of the text blocks in the order in which they were written:
|
---|
207 |
|
---|
208 | \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 0
|
---|
209 | \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 1
|
---|
210 | \snippet doc/src/snippets/textblock-fragments/xmlwriter.cpp 2
|
---|
211 |
|
---|
212 | This method is useful for when you want to extract just the rich text from a
|
---|
213 | document because it ignores frames, tables, and other types of structure.
|
---|
214 |
|
---|
215 | QTextBlock provides comparison operators that make it easier to manipulate
|
---|
216 | blocks: \l{QTextBlock::operator==()}{operator==()} and
|
---|
217 | \l{QTextBlock::operator!=()}{operator!=()} are used to test whether two
|
---|
218 | blocks are the same, and \l{QTextBlock::operator<()}{operator<()} is used
|
---|
219 | to determine which one occurs first in a document.
|
---|
220 |
|
---|
221 | \section2 Frames
|
---|
222 |
|
---|
223 | Frames are provided by the QTextFrame class.
|
---|
224 |
|
---|
225 | Text frames group together blocks of text and child frames, creating
|
---|
226 | document structures that are larger than paragraphs. The format of a frame
|
---|
227 | specifies how it is rendered and positioned on the page. Frames are
|
---|
228 | either inserted into the text flow, or they float on the left or right
|
---|
229 | hand side of the page.
|
---|
230 | Each document contains a root frame that contains all the other document
|
---|
231 | elements. As a result, all frames except the root frame have a parent
|
---|
232 | frame.
|
---|
233 |
|
---|
234 | Since text blocks are used to separate other document elements, each
|
---|
235 | frame will always contain at least one text block, and zero or more
|
---|
236 | child frames. We can inspect the contents of a frame by using a
|
---|
237 | QTextFrame::iterator to traverse the frame's child elements:
|
---|
238 |
|
---|
239 | \snippet doc/src/snippets/textdocument-frames/xmlwriter.cpp 1
|
---|
240 | \snippet doc/src/snippets/textdocument-frames/xmlwriter.cpp 2
|
---|
241 |
|
---|
242 | Note that the iterator selects both frames and blocks, so it is necessary
|
---|
243 | to check which it is referring to. This allows us to navigate the document
|
---|
244 | structure on a frame-by-frame basis yet still access text blocks if
|
---|
245 | required. Both the QTextBlock::iterator and QTextFrame::iterator classes
|
---|
246 | can be used in complementary ways to extract the required structure from
|
---|
247 | a document.
|
---|
248 |
|
---|
249 | \section2 Tables
|
---|
250 |
|
---|
251 | Tables are provided by the QTextTable class.
|
---|
252 |
|
---|
253 | Tables are collections of cells that are arranged in rows and columns.
|
---|
254 | Each table cell is a document element with its own character format, but it
|
---|
255 | can also contain other elements, such as frames and text blocks. Table cells
|
---|
256 | are automatically created when the table is constructed, or when extra rows
|
---|
257 | or columns are added. They can also be moved between tables.
|
---|
258 |
|
---|
259 | QTextTable is a subclass of QTextFrame, so tables are treated like frames
|
---|
260 | in the document structure. For each frame that we encounter in the
|
---|
261 | document, we can test whether it represents a table, and deal with it in a
|
---|
262 | different way:
|
---|
263 |
|
---|
264 | \snippet doc/src/snippets/textdocument-tables/xmlwriter.cpp 0
|
---|
265 | \snippet doc/src/snippets/textdocument-tables/xmlwriter.cpp 1
|
---|
266 |
|
---|
267 | The cells within an existing table can be examined by iterating through
|
---|
268 | the rows and columns.
|
---|
269 |
|
---|
270 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 9
|
---|
271 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 10
|
---|
272 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 11
|
---|
273 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 12
|
---|
274 |
|
---|
275 |
|
---|
276 | \section2 Lists
|
---|
277 |
|
---|
278 | Lists are provided by the QTextList class.
|
---|
279 |
|
---|
280 | Lists are sequences of text blocks that are formatted in the usual way, but
|
---|
281 | which also provide the standard list decorations such as bullet points and
|
---|
282 | enumerated items. Lists can be nested, and will be indented if the list's
|
---|
283 | format specifies a non-zero indentation.
|
---|
284 |
|
---|
285 | We can refer to each list item by its index in the list:
|
---|
286 |
|
---|
287 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 0
|
---|
288 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 1
|
---|
289 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 2
|
---|
290 |
|
---|
291 | Since QTextList is a subclass of QTextBlockGroup, it does not group the
|
---|
292 | list items as child elements, but instead provides various functions for
|
---|
293 | managing them. This means that any text block we find when traversing a
|
---|
294 | document may actually be a list item. We can ensure that list items are
|
---|
295 | correctly identified by using the following code:
|
---|
296 |
|
---|
297 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 3
|
---|
298 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 4
|
---|
299 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 5
|
---|
300 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 6
|
---|
301 | \snippet doc/src/snippets/textdocument-listitems/mainwindow.cpp 7
|
---|
302 |
|
---|
303 |
|
---|
304 | \section2 Images
|
---|
305 |
|
---|
306 | Images in QTextDocument are represented by text fragments that reference
|
---|
307 | external images via the resource mechanism. Images are created using the
|
---|
308 | cursor interface, and can be modified later by changing the character
|
---|
309 | format of the image's text fragment:
|
---|
310 |
|
---|
311 | \snippet doc/src/snippets/textdocument-imageformat/main.cpp 0
|
---|
312 | \snippet doc/src/snippets/textdocument-imageformat/main.cpp 1
|
---|
313 | \snippet doc/src/snippets/textdocument-imageformat/main.cpp 2
|
---|
314 |
|
---|
315 | The fragment that represents the image can be found by iterating over
|
---|
316 | the fragments in the text block that contains the image.
|
---|
317 | */
|
---|
318 |
|
---|
319 | /*!
|
---|
320 | \page richtext-cursor.html
|
---|
321 | \contentspage richtext.html Contents
|
---|
322 | \previouspage Rich Text Document Structure
|
---|
323 | \nextpage Common Rich Text Editing Tasks
|
---|
324 |
|
---|
325 | \title The QTextCursor Interface
|
---|
326 |
|
---|
327 | \tableofcontents
|
---|
328 |
|
---|
329 | The QTextCursor interface allows documents and their structure to be
|
---|
330 | edited in a way that should be familiar to most users of text editors and
|
---|
331 | document editing software. Rich text documents can have multiple cursors
|
---|
332 | associated with them, and each of these contains information about their
|
---|
333 | position in the document and any selections that they may hold. This
|
---|
334 | cursor-based paradigm makes common operations, such as cutting and pasting
|
---|
335 | text, simple to implement programmatically, yet it also allows more complex
|
---|
336 | editing operations to be performed on the document.
|
---|
337 |
|
---|
338 | This chapter describes most of the common editing operations that you
|
---|
339 | will need to perform using a cursor, from basic insertion of text and
|
---|
340 | document elements to more complex manipulation of document structures.
|
---|
341 |
|
---|
342 | \section1 Cursor-Based Editing
|
---|
343 |
|
---|
344 | At the simplest level, text documents are made up of a string of characters,
|
---|
345 | marked up in some way to represent the block structure of the text within the
|
---|
346 | document. QTextCursor provides a cursor-based interface that allows the
|
---|
347 | contents of a QTextDocument to be manipulated at the character level. Since
|
---|
348 | the elements (blocks, frames, tables, etc.) are also encoded in the character
|
---|
349 | stream, the document structure can itself be changed by the cursor.
|
---|
350 |
|
---|
351 | The cursor keeps track of its location within its parent document, and can
|
---|
352 | report information about the surrounding structure, such as the enclosing
|
---|
353 | text block, frame, table, or list. The formats of the enclosing structures
|
---|
354 | can also be directly obtained through the cursor.
|
---|
355 |
|
---|
356 | \section2 Using a Cursor
|
---|
357 |
|
---|
358 | The main use of a cursor is to insert or modify text within a block.
|
---|
359 | We can use a text editor's cursor to do this:
|
---|
360 |
|
---|
361 | \snippet doc/src/snippets/textblock-formats/main.cpp 0
|
---|
362 |
|
---|
363 | Alternatively, we can obtain a cursor directly from a document:
|
---|
364 |
|
---|
365 | \snippet doc/src/snippets/textdocument-images/main.cpp 0
|
---|
366 |
|
---|
367 | The cursor is positioned at the start of the document so that we can write
|
---|
368 | into the first (empty) block in the document.
|
---|
369 |
|
---|
370 | \section2 Grouping Cursor Operations
|
---|
371 |
|
---|
372 | A series of editing operations can be packaged together so that they can
|
---|
373 | be replayed, or undone together in a single action. This is achieved by
|
---|
374 | using the \c beginEditBlock() and \c endEditBlock() functions in the
|
---|
375 | following way, as in the following example where we select the word that
|
---|
376 | contains the cursor:
|
---|
377 |
|
---|
378 | \snippet doc/src/snippets/textdocument-selections/mainwindow.cpp 0
|
---|
379 |
|
---|
380 | If editing operations are not grouped, the document automatically records
|
---|
381 | the individual operations so that they can be undone later. Grouping
|
---|
382 | operations into larger packages can make editing more efficient both for
|
---|
383 | the user and for the application, but care has to be taken not to group too
|
---|
384 | many operations together as the user may want find-grained control over the
|
---|
385 | undo process.
|
---|
386 |
|
---|
387 | \section2 Multiple Cursors
|
---|
388 |
|
---|
389 | Multiple cursors can be used to simultaneously edit the same document,
|
---|
390 | although only one will be visible to the user in a QTextEdit widget.
|
---|
391 | The QTextDocument ensures that each cursor writes text correctly and
|
---|
392 | does not interfere with any of the others.
|
---|
393 |
|
---|
394 | \omit
|
---|
395 | \snippet doc/src/snippets/textdocument-cursors/main.cpp 0
|
---|
396 | \snippet doc/src/snippets/textdocument-cursors/main.cpp 1
|
---|
397 | \endomit
|
---|
398 |
|
---|
399 | \section1 Inserting Document Elements
|
---|
400 |
|
---|
401 | QTextCursor provides several functions that can be used to change the
|
---|
402 | structure of a rich text document. Generally, these functions allow
|
---|
403 | document elements to be created with relevant formatting information,
|
---|
404 | and they are inserted into the document at the cursor's position.
|
---|
405 |
|
---|
406 | The first group of functions insert block-level elements, and update the
|
---|
407 | cursor position, but they do not return the element that was inserted:
|
---|
408 |
|
---|
409 | \list
|
---|
410 | \i \l{QTextCursor::insertBlock()}{insertBlock()} inserts a new text block
|
---|
411 | (paragraph) into a document at the cursor's position, and moves the
|
---|
412 | cursor to the start of the new block.
|
---|
413 | \i \l{QTextCursor::insertFragment()}{insertFragment()} inserts an existing
|
---|
414 | text fragment into a document at the cursor's position.
|
---|
415 | \i \l{QTextCursor::insertImage()}{insertImage()} inserts an image into a
|
---|
416 | document at the cursor's position.
|
---|
417 | \i \l{QTextCursor::insertText()}{insertText()} inserts text into the
|
---|
418 | document at the cursor's position.
|
---|
419 | \endlist
|
---|
420 |
|
---|
421 | You can examine the contents of the element that was inserted through the
|
---|
422 | cursor interface.
|
---|
423 |
|
---|
424 | The second group of functions insert elements that provide structure to
|
---|
425 | the document, and return the structure that was inserted:
|
---|
426 |
|
---|
427 | \list
|
---|
428 | \i \l{QTextCursor::insertFrame()}{insertFrame()} inserts a frame into the
|
---|
429 | document \e after the cursor's current block, and moves the cursor to
|
---|
430 | the start of the empty block in the new frame.
|
---|
431 | \i \l{QTextCursor::insertList()}{insertList()} inserts a list into the
|
---|
432 | document at the cursor's position, and moves the cursor to the start
|
---|
433 | of the first item in the list.
|
---|
434 | \i \l{QTextCursor::insertTable()}{insertTable()} inserts a table into
|
---|
435 | the document \e after the cursor's current block, and moves the cursor
|
---|
436 | to the start of the block following the table.
|
---|
437 | \endlist
|
---|
438 |
|
---|
439 | These elements either contain or group together other elements in the
|
---|
440 | document.
|
---|
441 |
|
---|
442 | \section2 Text and Text Fragments
|
---|
443 |
|
---|
444 | Text can be inserted into the current block in the current character
|
---|
445 | format, or in a custom format that is specified with the text:
|
---|
446 |
|
---|
447 | \snippet doc/src/snippets/textdocument-charformats/main.cpp 0
|
---|
448 |
|
---|
449 | Once the character format has been used with a cursor, that format becomes
|
---|
450 | the default format for any text inserted with that cursor until another
|
---|
451 | character format is specified.
|
---|
452 |
|
---|
453 | If a cursor is used to insert text without specifying a character format,
|
---|
454 | the text will be given the character format used at that position in the
|
---|
455 | document.
|
---|
456 |
|
---|
457 | \section2 Blocks
|
---|
458 |
|
---|
459 | Text blocks are inserted into the document with the
|
---|
460 | \l{QTextCursor::insertBlock()}{insertBlock()} function.
|
---|
461 |
|
---|
462 | \snippet doc/src/snippets/textblock-formats/main.cpp 1
|
---|
463 |
|
---|
464 | The cursor is positioned at the start of the new block.
|
---|
465 |
|
---|
466 | \section2 Frames
|
---|
467 |
|
---|
468 | Frames are inserted into a document using the cursor, and will be placed
|
---|
469 | within the cursor's current frame \e after the current block.
|
---|
470 | The following code shows how a frame can be inserted between two text
|
---|
471 | blocks in a document's root frame. We begin by finding the cursor's
|
---|
472 | current frame:
|
---|
473 |
|
---|
474 | \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 0
|
---|
475 |
|
---|
476 | We insert some text in this frame then set up a frame format for the
|
---|
477 | child frame:
|
---|
478 |
|
---|
479 | \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 1
|
---|
480 |
|
---|
481 | The frame format will give the frame an external margin of 32 pixels,
|
---|
482 | internal padding of 8 pixels, and a border that is 4 pixels wide.
|
---|
483 | See the QTextFrameFormat documentation for more information about
|
---|
484 | frame formats.
|
---|
485 |
|
---|
486 | The frame is inserted into the document after the preceding text:
|
---|
487 |
|
---|
488 | \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 2
|
---|
489 |
|
---|
490 | We add some text to the document immediately after we insert the frame.
|
---|
491 | Since the text cursor is positioned \e{inside the frame} when it is inserted
|
---|
492 | into the document, this text will also be inserted inside the frame.
|
---|
493 |
|
---|
494 | Finally, we position the cursor outside the frame by taking the last
|
---|
495 | available cursor position inside the frame we recorded earlier:
|
---|
496 |
|
---|
497 | \snippet doc/src/snippets/textdocument-frames/mainwindow.cpp 3
|
---|
498 |
|
---|
499 | The text that we add last is inserted after the child frame in the
|
---|
500 | document. Since each frame is padded with text blocks, this ensures that
|
---|
501 | more elements can always be inserted with a cursor.
|
---|
502 |
|
---|
503 | \section2 Tables
|
---|
504 |
|
---|
505 | Tables are inserted into the document using the cursor, and will be
|
---|
506 | placed within the cursor's current frame \e after the current block:
|
---|
507 |
|
---|
508 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 0
|
---|
509 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 3
|
---|
510 |
|
---|
511 | Tables can be created with a specific format that defines the overall
|
---|
512 | properties of the table, such as its alignment, background color, and
|
---|
513 | the cell spacing used. It can also determine the constraints on each
|
---|
514 | column, allowing each of them to have a fixed width, or resize according
|
---|
515 | to the available space.
|
---|
516 |
|
---|
517 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 2
|
---|
518 |
|
---|
519 | The columns in the table created above will each take up a certain
|
---|
520 | percentage of the available width. Note that the table format is
|
---|
521 | optional; if you insert a table without a format, some sensible
|
---|
522 | default values will be used for the table's properties.
|
---|
523 |
|
---|
524 | Since cells can contain other document elements, they too can be
|
---|
525 | formatted and styled as necessary.
|
---|
526 |
|
---|
527 | Text can be added to the table by navigating to each cell with the cursor
|
---|
528 | and inserting text.
|
---|
529 |
|
---|
530 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 4
|
---|
531 |
|
---|
532 | We can create a simple timetable by following this approach:
|
---|
533 |
|
---|
534 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 5
|
---|
535 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 6
|
---|
536 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 7
|
---|
537 | \snippet doc/src/snippets/textdocument-tables/mainwindow.cpp 8
|
---|
538 |
|
---|
539 | \section2 Lists
|
---|
540 |
|
---|
541 | Lists of block elements can be automatically created and inserted into the
|
---|
542 | document at the current cursor position. Each list that is created in this
|
---|
543 | way requires a list format to be specified:
|
---|
544 |
|
---|
545 | \snippet doc/src/snippets/textdocument-lists/mainwindow.cpp 0
|
---|
546 |
|
---|
547 | The above code first checks whether the cursor is within an existing list
|
---|
548 | and, if so, gives the list format for the new list a suitable level of
|
---|
549 | indentation. This allows nested lists to be created with increasing
|
---|
550 | levels of indentation. A more sophisticated implementation would also use
|
---|
551 | different kinds of symbol for the bullet points in each level of the list.
|
---|
552 |
|
---|
553 | \section2 Images
|
---|
554 |
|
---|
555 | Inline images are added to documents through the cursor in the usual manner.
|
---|
556 | Unlike many other elements, all of the image properties are specified by the
|
---|
557 | image's format. This means that a QTextImageFormat object has to be
|
---|
558 | created before an image can be inserted:
|
---|
559 |
|
---|
560 | \snippet doc/src/snippets/textdocument-images/main.cpp 1
|
---|
561 |
|
---|
562 | The image name refers to an entry in the application's resource file.
|
---|
563 | The method used to derive this name is described in
|
---|
564 | \l{resources.html}{The Qt Resource System}.
|
---|
565 |
|
---|
566 | */
|
---|
567 |
|
---|
568 | /*!
|
---|
569 | \page richtext-common-tasks.html
|
---|
570 | \contentspage richtext.html Contents
|
---|
571 | \previouspage The QTextCursor Interface
|
---|
572 | \nextpage Advanced Rich Text Processing
|
---|
573 |
|
---|
574 | \title Common Rich Text Editing Tasks
|
---|
575 |
|
---|
576 | \tableofcontents
|
---|
577 |
|
---|
578 | There are a number of tasks that are often performed by developers
|
---|
579 | when editing and processing text documents using Qt. These include the use
|
---|
580 | of display widgets such as QTextBrowser and QTextEdit, creation of
|
---|
581 | documents with QTextDocument, editing using a QTextCursor, and
|
---|
582 | exporting the document structure.
|
---|
583 | This document outlines some of the more common ways of using the rich
|
---|
584 | text classes to perform these tasks, showing convenient patterns that can
|
---|
585 | be reused in your own applications.
|
---|
586 |
|
---|
587 | \section1 Using QTextEdit
|
---|
588 |
|
---|
589 | A text editor widget can be constructed and used to display HTML in the
|
---|
590 | following way:
|
---|
591 |
|
---|
592 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 2
|
---|
593 |
|
---|
594 | By default, the text editor contains a document with a root frame, inside
|
---|
595 | which is an empty text block. This document can be obtained so that it can
|
---|
596 | be modified directly by the application:
|
---|
597 |
|
---|
598 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 3
|
---|
599 |
|
---|
600 | The text editor's cursor may also be used to edit a document:
|
---|
601 |
|
---|
602 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 4
|
---|
603 |
|
---|
604 | Although a document can be edited using many cursors at once, a QTextEdit
|
---|
605 | only displays a single cursor at a time. Therefore, if we want to update the
|
---|
606 | editor to display a particular cursor or its selection, we need to set the
|
---|
607 | editor's cursor after we have modified the document:
|
---|
608 |
|
---|
609 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 5
|
---|
610 |
|
---|
611 | \section1 Selecting Text
|
---|
612 |
|
---|
613 | Text is selected by moving the cursor using operations that are similar to
|
---|
614 | those performed by a user in a text editor. To select text between two
|
---|
615 | points in the document, we need to position the cursor at the first point
|
---|
616 | then move it using a special mode (\l{QTextCursor::MoveMode}) with a
|
---|
617 | move operation (\l{QTextCursor::MoveOperation}).
|
---|
618 | When we select the text, we leave the selection anchor at the old cursor
|
---|
619 | position just as the user might do by holding down the Shift key when
|
---|
620 | selecting text:
|
---|
621 |
|
---|
622 | \snippet doc/src/snippets/textdocument-selections/mainwindow.cpp 1
|
---|
623 |
|
---|
624 | In the above code, a whole word is selected using this method. QTextCursor
|
---|
625 | provides a number of common move operations for selecting individual
|
---|
626 | characters, words, lines, and whole blocks.
|
---|
627 |
|
---|
628 | \section1 Finding Text
|
---|
629 |
|
---|
630 | QTextDocument provides a cursor-based interface for searching, making
|
---|
631 | it easy to find and modify text in the style of a text editor. The following
|
---|
632 | code finds all the instances of a particular word in a document, and changes
|
---|
633 | the color of each:
|
---|
634 |
|
---|
635 | \snippet doc/src/snippets/textdocument-find/main.cpp 0
|
---|
636 | \snippet doc/src/snippets/textdocument-find/main.cpp 1
|
---|
637 |
|
---|
638 | Note that the cursor does not have to be moved after each search and replace
|
---|
639 | operation; it is always positioned at the end of the word that was just
|
---|
640 | replaced.
|
---|
641 |
|
---|
642 | \section1 Printing Documents
|
---|
643 |
|
---|
644 | QTextEdit is designed for the display of large rich text documents that are
|
---|
645 | read on screen, rendering them in the same way as a web browser. As a result,
|
---|
646 | it does not automatically break the contents of the document into page-sized
|
---|
647 | pieces that are suitable for printing.
|
---|
648 |
|
---|
649 | QTextDocument provides a \l{QTextDocument::print()}{print()} function to
|
---|
650 | allow documents to be printed using the QPrinter class. The following code
|
---|
651 | shows how to prepare a document in a QTextEdit for printing with a QPrinter:
|
---|
652 |
|
---|
653 | \snippet doc/src/snippets/textdocument-printing/mainwindow.cpp 0
|
---|
654 |
|
---|
655 | The document is obtained from the text editor, and a QPrinter is constructed
|
---|
656 | then configured using a QPrintDialog. If the user accepts the printer's
|
---|
657 | configuration then the document is formatted and printed using the
|
---|
658 | \l{QTextDocument::print()}{print()} function.
|
---|
659 |
|
---|
660 | */
|
---|
661 |
|
---|
662 | /*!
|
---|
663 | \page richtext-advanced-processing.html
|
---|
664 | \contentspage richtext.html Contents
|
---|
665 | \previouspage Common Rich Text Editing Tasks
|
---|
666 | \nextpage Supported HTML Subset
|
---|
667 |
|
---|
668 | \title Advanced Rich Text Processing
|
---|
669 |
|
---|
670 | \section1 Handling Large Files
|
---|
671 |
|
---|
672 | Qt does not limit the size of files that are used for text
|
---|
673 | processing. In most cases, this will not present a problem. For
|
---|
674 | especially large files, however, you might experience that your
|
---|
675 | application will become unresponsive or that you will run out of
|
---|
676 | memory. The size of the files you can load depends on your
|
---|
677 | hardware and on Qt's and your own application's implementation.
|
---|
678 |
|
---|
679 | If you are faced with this problem, we recommend that you address the
|
---|
680 | following issues:
|
---|
681 |
|
---|
682 | \list
|
---|
683 | \o You should consider breaking up large paragraphs into smaller
|
---|
684 | ones as Qt handles small paragraphs better. You could also
|
---|
685 | insert line breaks at regular intervals, which will look the
|
---|
686 | same as one large paragraph in a QTextEdit.
|
---|
687 | \o You can reduce the amount of blocks in a QTextDocument with
|
---|
688 | \l{QTextDocument::}{maximumBlockCount()}. The document is only
|
---|
689 | as large as the number of blocks as far as QTextEdit is concerned.
|
---|
690 | \o When adding text to a text edit, it is an advantage to add it
|
---|
691 | in an edit block (see example below). The result is that the
|
---|
692 | text edit does not need to build the entire document structure at once.
|
---|
693 | \endlist
|
---|
694 |
|
---|
695 | We give an example of the latter technique from the list. We assume that
|
---|
696 | the text edit is visible.
|
---|
697 |
|
---|
698 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 6
|
---|
699 |
|
---|
700 | \omit
|
---|
701 | Ideas for other sections:
|
---|
702 |
|
---|
703 | * Hiding QTextBlock elements.
|
---|
704 | * Changing the word wrapping mode in QTextEdit. Custom word wrapping?
|
---|
705 | \endomit
|
---|
706 | */
|
---|
707 |
|
---|
708 | /*!
|
---|
709 | \page richtext-html-subset.html
|
---|
710 | \title Supported HTML Subset
|
---|
711 | \brief Describes the support for HTML markup in text widgets.
|
---|
712 |
|
---|
713 | \contentspage richtext.html Contents
|
---|
714 | \previouspage Common Rich Text Editing Tasks
|
---|
715 |
|
---|
716 | Qt's text widgets are able to display rich text, specified using a subset of \l{HTML 4}
|
---|
717 | markup. Widgets that use QTextDocument, such as QLabel, QTextEdit, QTreeWidgetItem and
|
---|
718 | the other item widgets, are able to display rich text specified in this way.
|
---|
719 |
|
---|
720 | \tableofcontents
|
---|
721 |
|
---|
722 | \section1 Using HTML Markup in Text Widgets
|
---|
723 |
|
---|
724 | Widgets automatically detect HTML markup and display rich text accordingly. For example,
|
---|
725 | setting a label's \l{QLabel::}{text} property with the string \c{"<b>Hello</b> <i>Qt!</i>"}
|
---|
726 | will result in the label displaying text like this: \bold{Hello} \e{Qt!}
|
---|
727 |
|
---|
728 | When HTML markup is used for text, Qt follows the rules defined by the \l{HTML 4}
|
---|
729 | specification. This includes default properties for text layout, such as the
|
---|
730 | direction of the text flow (left-to-right) which can be changed by applying the
|
---|
731 | \l{#Block Attributes}{\c dir} attribute to blocks of text.
|
---|
732 |
|
---|
733 | \section1 Supported Tags
|
---|
734 |
|
---|
735 | The following table lists the HTML tags supported by Qt's
|
---|
736 | \l{Rich Text Processing}{rich text} engine:
|
---|
737 |
|
---|
738 | \table
|
---|
739 | \header \o Tag
|
---|
740 | \o Description
|
---|
741 | \o Comment
|
---|
742 | \row \o \c a
|
---|
743 | \o Anchor or link
|
---|
744 | \o Supports the \c href and \c name attributes.
|
---|
745 | \row \o \c address
|
---|
746 | \o Address
|
---|
747 | \o
|
---|
748 | \row \o \c b
|
---|
749 | \o Bold
|
---|
750 | \o
|
---|
751 | \row \o \c big
|
---|
752 | \o Larger font
|
---|
753 | \o
|
---|
754 | \row \o \c blockquote
|
---|
755 | \o Indented paragraph
|
---|
756 | \o
|
---|
757 | \row \o \c body
|
---|
758 | \o Document body
|
---|
759 | \o Supports the \c bgcolor attribute, which
|
---|
760 | can be a Qt \l{QColor::setNamedColor()}{color name}
|
---|
761 | or a \c #RRGGBB color specification.
|
---|
762 | \row \o \c br
|
---|
763 | \o Line break
|
---|
764 | \o
|
---|
765 | \row \o \c center
|
---|
766 | \o Centered paragraph
|
---|
767 | \o
|
---|
768 | \row \o \c cite
|
---|
769 | \o Inline citation
|
---|
770 | \o Same as \c i.
|
---|
771 | \row \o \c code
|
---|
772 | \o Code
|
---|
773 | \o Same as \c tt.
|
---|
774 | \row \o \c dd
|
---|
775 | \o Definition data
|
---|
776 | \o
|
---|
777 | \row \o \c dfn
|
---|
778 | \o Definition
|
---|
779 | \o Same as \c i.
|
---|
780 | \row \o \c div
|
---|
781 | \o Document division
|
---|
782 | \o Supports the standard \l{block attributes}.
|
---|
783 | \row \o \c dl
|
---|
784 | \o Definition list
|
---|
785 | \o Supports the standard \l{block attributes}.
|
---|
786 | \row \o \c dt
|
---|
787 | \o Definition term
|
---|
788 | \o Supports the standard \l{block attributes}.
|
---|
789 | \row \o \c em
|
---|
790 | \o Emphasized
|
---|
791 | \o Same as \c i.
|
---|
792 | \row \o \c font
|
---|
793 | \o Font size, family, and/or color
|
---|
794 | \o Supports the following attributes:
|
---|
795 | \c size, \c face, and \c color (Qt
|
---|
796 | \l{QColor::setNamedColor()}{color names} or
|
---|
797 | \c #RRGGBB).
|
---|
798 | \row \o \c h1
|
---|
799 | \o Level 1 heading
|
---|
800 | \o Supports the standard \l{block attributes}.
|
---|
801 | \row \o \c h2
|
---|
802 | \o Level 2 heading
|
---|
803 | \o Supports the standard \l{block attributes}.
|
---|
804 | \row \o \c h3
|
---|
805 | \o Level 3 heading
|
---|
806 | \o Supports the standard \l{block attributes}.
|
---|
807 | \row \o \c h4
|
---|
808 | \o Level 4 heading
|
---|
809 | \o Supports the standard \l{block attributes}.
|
---|
810 | \row \o \c h5
|
---|
811 | \o Level 5 heading
|
---|
812 | \o Supports the standard \l{block attributes}.
|
---|
813 | \row \o \c h6
|
---|
814 | \o Level 6 heading
|
---|
815 | \o Supports the standard \l{block attributes}.
|
---|
816 | \row \o \c head
|
---|
817 | \o Document header
|
---|
818 | \o
|
---|
819 | \row \o \c hr
|
---|
820 | \o Horizontal line
|
---|
821 | \o Supports the \c width attribute, which can
|
---|
822 | be specified as an absolute or relative (\c %) value.
|
---|
823 | \row \o \c html
|
---|
824 | \o HTML document
|
---|
825 | \o
|
---|
826 | \row \o \c i
|
---|
827 | \o Italic
|
---|
828 | \o
|
---|
829 | \row \o \c img
|
---|
830 | \o Image
|
---|
831 | \o Supports the \c src, \c source
|
---|
832 | (for Qt 3 compatibility), \c width, and \c height
|
---|
833 | attributes.
|
---|
834 | \row \o \c kbd
|
---|
835 | \o User-entered text
|
---|
836 | \o
|
---|
837 | \row \o \c meta
|
---|
838 | \o Meta-information
|
---|
839 | \o If a text encoding is specified using the \c{meta} tag,
|
---|
840 | it is picked up by Qt::codecForHtml().
|
---|
841 | Likewise, if an encoding is specified to
|
---|
842 | QTextDocument::toHtml(), the encoding is stored using
|
---|
843 | a \c meta tag, for example:
|
---|
844 |
|
---|
845 | \snippet doc/src/snippets/code/doc_src_richtext.qdoc 7
|
---|
846 |
|
---|
847 | \row \o \c li
|
---|
848 | \o List item
|
---|
849 | \o
|
---|
850 | \row \o \c nobr
|
---|
851 | \o Non-breakable text
|
---|
852 | \o
|
---|
853 | \row \o \c ol
|
---|
854 | \o Ordered list
|
---|
855 | \o Supports the standard \l{list attributes}.
|
---|
856 | \row \o \c p
|
---|
857 | \o Paragraph
|
---|
858 | \o Left-aligned by default. Supports the standard
|
---|
859 | \l{block attributes}.
|
---|
860 | \row \o \c pre
|
---|
861 | \o Preformated text
|
---|
862 | \o
|
---|
863 | \row \o \c qt
|
---|
864 | \o Qt rich-text document
|
---|
865 | \o Synonym for \c html. Provided for compatibility with
|
---|
866 | earlier versions of Qt.
|
---|
867 | \row \o \c s
|
---|
868 | \o Strikethrough
|
---|
869 | \o
|
---|
870 | \row \o \c samp
|
---|
871 | \o Sample code
|
---|
872 | \o Same as \c tt.
|
---|
873 | \row \o \c small
|
---|
874 | \o Small font
|
---|
875 | \o
|
---|
876 | \row \o \c span
|
---|
877 | \o Grouped elements
|
---|
878 | \o
|
---|
879 | \row \o \c strong
|
---|
880 | \o Strong
|
---|
881 | \o Same as \c b.
|
---|
882 | \row \o \c sub
|
---|
883 | \o Subscript
|
---|
884 | \o
|
---|
885 | \row \o \c sup
|
---|
886 | \o Superscript
|
---|
887 | \o
|
---|
888 | \row \o \c table
|
---|
889 | \o Table
|
---|
890 | \o Supports the following attributes: \c border,
|
---|
891 | \c bgcolor (Qt \l{QColor::setNamedColor()}{color names}
|
---|
892 | or \c #RRGGBB), \c cellspacing, \c cellpadding,
|
---|
893 | \c width (absolute or relative), and \c height.
|
---|
894 | \row \o \c tbody
|
---|
895 | \o Table body
|
---|
896 | \o Does nothing.
|
---|
897 | \row \o \c td
|
---|
898 | \o Table data cell
|
---|
899 | \o Supports the standard \l{table cell attributes}.
|
---|
900 | \row \o \c tfoot
|
---|
901 | \o Table footer
|
---|
902 | \o Does nothing.
|
---|
903 | \row \o \c th
|
---|
904 | \o Table header cell
|
---|
905 | \o Supports the standard \l{table cell attributes}.
|
---|
906 | \row \o \c thead
|
---|
907 | \o Table header
|
---|
908 | \o If the \c thead tag is specified, it is used when printing tables
|
---|
909 | that span multiple pages.
|
---|
910 | \row \o \c title
|
---|
911 | \o Document title
|
---|
912 | \o The value specified using the \c
|
---|
913 | title tag is available through
|
---|
914 | QTextDocument::metaInformation().
|
---|
915 | \row \o \c tr
|
---|
916 | \o Table row
|
---|
917 | \o Supports the \c bgcolor attribute, which
|
---|
918 | can be a Qt \l{QColor::setNamedColor()}{color name}
|
---|
919 | or a \c #RRGGBB color specification.
|
---|
920 | \row \o \c tt
|
---|
921 | \o Typewrite font
|
---|
922 | \o
|
---|
923 | \row \o \c u
|
---|
924 | \o Underlined
|
---|
925 | \o
|
---|
926 | \row \o \c ul
|
---|
927 | \o Unordered list
|
---|
928 | \o Supports the standard \l{list attributes}.
|
---|
929 | \row \o \c var
|
---|
930 | \o Variable
|
---|
931 | \o Same as \c i.
|
---|
932 | \endtable
|
---|
933 |
|
---|
934 | \section1 Block Attributes
|
---|
935 |
|
---|
936 | The following attributes are supported by the \c div, \c dl, \c
|
---|
937 | dt, \c h1, \c h2, \c h3, \c h4, \c h5, \c h6, \c p tags:
|
---|
938 |
|
---|
939 | \list
|
---|
940 | \o \c align (\c left, \c right, \c center, \c justify)
|
---|
941 | \o \c dir (\c ltr, \c rtl)
|
---|
942 | \endlist
|
---|
943 |
|
---|
944 | \section1 List Attributes
|
---|
945 |
|
---|
946 | The following attribute is supported by the \c ol and \c ul tags:
|
---|
947 |
|
---|
948 | \list
|
---|
949 | \o \c type (\c 1, \c a, \c A, \c square, \c disc, \c circle)
|
---|
950 | \endlist
|
---|
951 |
|
---|
952 | \section1 Table Cell Attributes
|
---|
953 |
|
---|
954 | The following attributes are supported by the \c td and \c th
|
---|
955 | tags:
|
---|
956 |
|
---|
957 | \list
|
---|
958 | \o \c width (absolute, relative, or no-value)
|
---|
959 | \o \c bgcolor (Qt \l{QColor::setNamedColor()}{color names} or \c #RRGGBB)
|
---|
960 | \o \c colspan
|
---|
961 | \o \c rowspan
|
---|
962 | \o \c align (\c left, \c right, \c center, \c justify)
|
---|
963 | \o \c valign (\c top, \c middle, \c bottom)
|
---|
964 | \endlist
|
---|
965 |
|
---|
966 | \section1 CSS Properties
|
---|
967 | The following table lists the CSS properties supported by Qt's
|
---|
968 | \l{Rich Text Processing}{rich text} engine:
|
---|
969 |
|
---|
970 | \table
|
---|
971 | \header \o Property
|
---|
972 | \o Values
|
---|
973 | \o Description
|
---|
974 | \row
|
---|
975 | \o \c background-color
|
---|
976 | \o <color>
|
---|
977 | \o Background color for elements
|
---|
978 | \row
|
---|
979 | \o \c background-image
|
---|
980 | \o <uri>
|
---|
981 | \o Background image for elements
|
---|
982 | \row \o \c color
|
---|
983 | \o <color>
|
---|
984 | \o Text foreground color
|
---|
985 | \row \o \c font-family
|
---|
986 | \o <family name>
|
---|
987 | \o Font family name
|
---|
988 | \row \o \c font-size
|
---|
989 | \o [ small | medium | large | x-large | xx-large ] | <size>pt | <size>px
|
---|
990 | \o Font size relative to the document font, or specified in points or pixels
|
---|
991 | \row \o \c font-style
|
---|
992 | \o [ normal | italic | oblique ]
|
---|
993 | \o
|
---|
994 | \row \o \c font-weight
|
---|
995 | \o [ normal | bold | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 ]
|
---|
996 | \o Specifies the font weight used for text, where \c normal and \c bold
|
---|
997 | are mapped to the corresponding QFont weights. Numeric values are
|
---|
998 | 8 times the equivalent QFont weight values.
|
---|
999 | \row \o \c text-decoration
|
---|
1000 | \o none | [ underline || overline || line-through ]
|
---|
1001 | \o Additional text effects
|
---|
1002 | \row \o \c font
|
---|
1003 | \o [ [ <'font-style'> || <'font-weight'> ]? <'font-size'> <'font-family'> ]
|
---|
1004 | \o Font shorthand property
|
---|
1005 | \row \o \c text-indent
|
---|
1006 | \o <length>px
|
---|
1007 | \o First line text indentation in pixels
|
---|
1008 | \row \o \c white-space
|
---|
1009 | \o normal | pre | nowrap | pre-wrap
|
---|
1010 | \o Declares how whitespace in HTML is handled.
|
---|
1011 | \row \o \c margin-top
|
---|
1012 | \o <length>px
|
---|
1013 | \o Top paragraph margin in pixels
|
---|
1014 | \row \o \c margin-bottom
|
---|
1015 | \o <length>px
|
---|
1016 | \o Bottom paragraph margin in pixels
|
---|
1017 | \row \o \c margin-left
|
---|
1018 | \o <length>px
|
---|
1019 | \o Left paragraph margin in pixels
|
---|
1020 | \row \o \c margin-right
|
---|
1021 | \o <length>px
|
---|
1022 | \o Right paragraph margin in pixels
|
---|
1023 | \row \o \c padding-top
|
---|
1024 | \o <length>px
|
---|
1025 | \o Top table cell padding in pixels
|
---|
1026 | \row \o \c padding-bottom
|
---|
1027 | \o <length>px
|
---|
1028 | \o Bottom table cell padding in pixels
|
---|
1029 | \row \o \c padding-left
|
---|
1030 | \o <length>px
|
---|
1031 | \o Left table cell padding in pixels
|
---|
1032 | \row \o \c padding-right
|
---|
1033 | \o <length>px
|
---|
1034 | \o Right table cell padding in pixels
|
---|
1035 | \row \o \c padding
|
---|
1036 | \o <length>px
|
---|
1037 | \o Shorthand for setting all the padding properties at once.
|
---|
1038 | \row \o \c vertical-align
|
---|
1039 | \o baseline | sub | super | middle | top | bottom
|
---|
1040 | \o Vertical text alignment. For vertical alignment in text table cells only middle, top, and bottom apply.
|
---|
1041 | \row \o \c border-color
|
---|
1042 | \o <color>
|
---|
1043 | \o Border color for text tables.
|
---|
1044 | \row \o \c border-style
|
---|
1045 | \o none | dotted | dashed | dot-dash | dot-dot-dash | solid | double | groove | ridge | inset | outset
|
---|
1046 | \o Border style for text tables.
|
---|
1047 | \row \o \c background
|
---|
1048 | \o [ <'background-color'> || <'background-image'> ]
|
---|
1049 | \o Background shorthand property
|
---|
1050 | \row \o \c page-break-before
|
---|
1051 | \o [ auto | always ]
|
---|
1052 | \o Make it possible to enforce a page break before the paragraph/table
|
---|
1053 | \row \o \c page-break-after
|
---|
1054 | \o [ auto | always ]
|
---|
1055 | \o Make it possible to enforce a page break after the paragraph/table
|
---|
1056 | \row \o float
|
---|
1057 | \o [ left | right | none ]
|
---|
1058 | \o Specifies where an image or a text will be placed in another element. Note that the \c float property is
|
---|
1059 | only supported for tables and images.
|
---|
1060 | \row \o \c text-transform
|
---|
1061 | \o [ uppercase | lowercase | smallcaps ]
|
---|
1062 | \o Select the transformation that will be performed on the text prior to displaying it.
|
---|
1063 | \row \o \c word-spacing
|
---|
1064 | \o <width>px
|
---|
1065 | \o Specifies an alternate spacing between each word.
|
---|
1066 | \endtable
|
---|
1067 |
|
---|
1068 | \section1 Supported CSS Selectors
|
---|
1069 |
|
---|
1070 | All CSS 2.1 selector classes are supported except pseudo-class selectors such
|
---|
1071 | as \c{:first-child}, \c{:visited} and \c{:hover}.
|
---|
1072 |
|
---|
1073 | */
|
---|