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