doc/src/porting/qt4-interview.qdoc
changeset 0 1918ee327afb
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 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     \page qt4-interview.html
       
    44     \title The Interview Framework
       
    45 
       
    46     \contentspage {What's New in Qt 4}{Home}
       
    47     \previouspage The Tulip Container Classes
       
    48     \nextpage The Arthur Paint System
       
    49 
       
    50     The Interview classes provide a model/view framework for Qt
       
    51     applications based on the well known Model-View-Controller design
       
    52     pattern. In this document, we will describe Qt's model/view
       
    53     architecture, provide some examples, and show the improvements
       
    54     offered over Qt 3's item view classes.
       
    55 
       
    56     \tableofcontents
       
    57 
       
    58     \section1 Overview of The Model/View Architecture
       
    59 
       
    60     The model/view architecture is a variation of the Model-View-Controller
       
    61     (MVC) design pattern, originating from Smalltalk, that is often used when
       
    62     building user interfaces.
       
    63 
       
    64     In the model/view architecture, the view and the controller objects are
       
    65     combined. This still separates the way that data is stored from the way
       
    66     that it is presented to the user, but provides a simpler framework based
       
    67     on the same principles. This separation makes it possible to display the
       
    68     same data in several different views, and to implement new types of views,
       
    69     without changing the underlying data structures.
       
    70 
       
    71     User input is handled by \e delegates. The advantage of this approach is
       
    72     that it allows rendering and editing of individual items of data to be
       
    73     customized to suit each data type in use.
       
    74 
       
    75     \table
       
    76     \row \i \inlineimage modelview-overview.png
       
    77     \i \bold{The model/view architecture}
       
    78 
       
    79     The model communicates with a source of data, providing an \e interface
       
    80     for the other components in the architecture. The nature of the
       
    81     communication depends on the type of data source, and the way the model
       
    82     is implemented.
       
    83 
       
    84     The view obtains \e{model indexes} from the model; these are references
       
    85     to items of data. By supplying model indexes to the model, the view can
       
    86     retrieve items of data from the data source.
       
    87 
       
    88     In standard views, a \e delegate renders the items of data. When an item
       
    89     is edited, the delegate communicates with the model directly using
       
    90     model indexes.
       
    91     \endtable
       
    92 
       
    93     \section1 Model/View Classes
       
    94 
       
    95     On a fundamental level, the Interview classes define the interfaces and
       
    96     common functionality for models, views, and delegates. All implemented
       
    97     components subclass QAbstractItemModel, QAbstractItemView, or
       
    98     QAbstractItemDelegate. The use of a common API ensures a level of
       
    99     interoperability between the components.
       
   100 
       
   101     \image standard-views.png
       
   102 
       
   103     Interview provides ready-to-use implementations of views for table,
       
   104     tree, and list widgets: QTableView, QTreeView, and QListView.
       
   105     These standard views are suitable for displaying the most common
       
   106     types of data structures used in applications, and can be used with
       
   107     the ready-made models supplied with Qt:
       
   108 
       
   109     \list
       
   110     \o QStandardItemModel is a minimal convenience model that developers
       
   111        can use to manage items of data.
       
   112     \o QFileSystemModel provides directory information for use with QListView
       
   113        and QTreeView.
       
   114     \o QStringListModel is a convenience model that can be used to hold
       
   115        strings for views such as QListView and QComboBox.
       
   116     \endlist
       
   117 
       
   118     Two specialized abstract models are provided that can be subclassed
       
   119     and extended (see the
       
   120     \l{model-view-programming.html#related-examples}{Model/View Programming}
       
   121     examples):
       
   122 
       
   123     \list
       
   124     \o QAbstractTableModel is a useful starting point for providing a custom
       
   125        model that can be used with QTableView.
       
   126     \o QAbstractListModel can be subclassed to produce a list-based model
       
   127        for use with QListView.
       
   128     \endlist
       
   129 
       
   130     Operations on items, such as filtering and sorting, are handled by \e{proxy
       
   131     models} that allow views to display processed data without having to
       
   132     copy or modify data obtained from a source model. Interview provides
       
   133     the QSortFilterProxyModel class to allow items of data from a source model
       
   134     to be sorted and filtered before they are supplied to views.
       
   135 
       
   136     Developers who are familiar with the conventional list, tree, and table
       
   137     widgets may find QListWidget, QTreeWidget, and QTableWidget useful.
       
   138     These present a simplified interface to the views that does not require a
       
   139     knowledge of the underlying model/view architecture.
       
   140 
       
   141     For details about how to use the model/view classes, see the
       
   142     \l{Model/View Programming} document.
       
   143 
       
   144     See also the \l{The Qt 4 Database GUI Layer}{Database GUI Layer} document
       
   145     for information about Qt 4's database models.
       
   146 
       
   147     \section1 Example Code
       
   148 
       
   149     To illustrate how the Interview classes are used, we present two
       
   150     examples that show different aspects of the model/view architecture.
       
   151 
       
   152     \section2 Sharing a Model Between Views
       
   153 
       
   154     In this example, we display the contents of a model using two
       
   155     different views, and share the user's selection between
       
   156     them. We will use the QFileSystemModel supplied with Qt because it
       
   157     requires very little configuration, and provides existing data to
       
   158     the views.
       
   159 
       
   160     The main() function for this example demonstrates all the
       
   161     principles involved in setting up a model and two views. We also
       
   162     share the selection between the two views:
       
   163 
       
   164     \snippet doc/src/snippets/shareddirmodel/main.cpp 1
       
   165 
       
   166     In the above function, we construct a directory model to display
       
   167     the contents of a default directory. The two views are constructed
       
   168     and given the same model to work with. By default, each view will
       
   169     maintain and display its own selection of items from the model,
       
   170     so we explicitly create a new selection that is shared between the
       
   171     tree view and the list view. As a result, changes to the selection
       
   172     in either of these views will automatically cause the selection in
       
   173     the other to change.
       
   174 
       
   175     \image interview-shareddirmodel.png
       
   176 
       
   177     The model/view architecture allows us to replace the QFileSystemModel in
       
   178     this example with a completely different model, one that will perhaps
       
   179     obtain data from a remote server, or from a database.
       
   180 
       
   181     \section2 Creating a Custom Model
       
   182 
       
   183     In this example, we display items of data obtained from a custom list
       
   184     model using a standard view. The custom model is a subclass of
       
   185     QAbstractListModel and provides implementations of a core set of
       
   186     functions.
       
   187 
       
   188     The complete declaration of our model is as follows:
       
   189 
       
   190     \snippet doc/src/snippets/stringlistmodel/model.h 0
       
   191     \snippet doc/src/snippets/stringlistmodel/model.h 1
       
   192     \codeline
       
   193     \snippet doc/src/snippets/stringlistmodel/model.h 5
       
   194 
       
   195     The model takes a list of strings when constructed, and supplies these
       
   196     to views as required. Since this is only a simple read-only model, we
       
   197     only need to implement a few functions.
       
   198 
       
   199     The underlying data structure used to hold the strings is a QStringList.
       
   200     Since the model maps each item in the list to a row in the model, the
       
   201     rowCount() function is quite simple:
       
   202 
       
   203     \snippet doc/src/snippets/stringlistmodel/model.cpp 0
       
   204 
       
   205     The data() function returns an item of data for each model index
       
   206     supplied by a view:
       
   207 
       
   208     \snippet doc/src/snippets/stringlistmodel/model.cpp 1
       
   209 
       
   210     The data() function returns a QVariant containing the information
       
   211     referred to by the model index. Items of data are returned to the view,
       
   212     but only if a number of checks are satisfied; for example, if the view
       
   213     specifies an invalid model index, the model indicates this by returning
       
   214     an invalid QVariant.
       
   215 
       
   216     Vertical and horizontal headers are supplied by the headerData()
       
   217     function. In this model, the value returned for these items is the row
       
   218     or column number, depending on the header:
       
   219 
       
   220     \snippet doc/src/snippets/stringlistmodel/model.cpp 2
       
   221 
       
   222     We only include an excerpt from the main() function for this short
       
   223     example:
       
   224 
       
   225     \snippet doc/src/snippets/stringlistmodel/main.cpp 1
       
   226     \dots
       
   227     \snippet doc/src/snippets/stringlistmodel/main.cpp 3
       
   228 
       
   229     We create a string list to use with the model, and we supply it to the
       
   230     model when it is constructed. The information in the string list is
       
   231     made available to the view via the model.
       
   232 
       
   233     \image stringlistmodel.png
       
   234 
       
   235     This example shows that it can be easy to populate views with data
       
   236     from a simple model. The standard models and views planned for
       
   237     Qt 4 will make the process even easier, and the convenience widgets
       
   238     supplied provide support for the classic item-based approach.
       
   239 
       
   240     \section1 What's Changed Since Qt 3?
       
   241 
       
   242     The table and item view classes in Qt 3 implemented widgets that
       
   243     both stored data and presented it to the user. These classes were
       
   244     designed to be easy-to-use and consistent, but were sometimes
       
   245     difficult to customize and extend.
       
   246 
       
   247     The equivalent classes in Qt 4 are designed to be extensible while
       
   248     remaining easy-to-use; the introduction of the model/view
       
   249     architecture ensures that they will be more consistent than their
       
   250     predecessors. The view classes provided can be summarized in the
       
   251     following way:
       
   252 
       
   253     \list
       
   254     \i QListView class provides a view widget that looks similar to
       
   255        Qt 3's QListBox widget, but displays data provided by a model.
       
   256        It can also be used to display icons in a similar way to Qt 3's
       
   257        QIconView.
       
   258     \i The QTableView class is a view widget that displays tabular data
       
   259        like Qt 3's QTable widget, but uses data provided by a model.
       
   260     \i The QTreeView class provides a view widget that behaves like
       
   261        Qt 3's QListView widget, except that it displays data provided
       
   262        by a model.
       
   263     \endlist
       
   264 
       
   265     Since the model takes responsibility for supplying items of data,
       
   266     and the view takes care of their presentation to the user, we do
       
   267     not require item classes to represent individual items.
       
   268     Delegates handle the painting and editing of data obtained from
       
   269     the model.
       
   270 
       
   271     Qt continues to provide a number of classic item view widgets with
       
   272     familiar item-based interfaces that are not based on compatibility
       
   273     classes:
       
   274 
       
   275     \list
       
   276     \i The QListWidget class provides a widget to display a
       
   277        list of items, as found in Qt 3's QListBox class.
       
   278     \i The QTreeWidget class implements the equivalent of Qt 3's
       
   279        QListView class.
       
   280     \i The QTableWidget class provides comparable functionality to
       
   281        Qt 3's QTable class.
       
   282     \endlist
       
   283 
       
   284     Each of the convenience classes have a corresponding item class:
       
   285     QListWidgetItem, QTreeWidgetItem, and QTableWidgetItem are the Qt 4
       
   286     equivalents of Qt 3's QListBoxItem, QListViewItem, and QTableItem
       
   287     respectively.
       
   288 
       
   289     The move towards a model/view architecture presents both challenges
       
   290     and opportunities for developers. Although the approach may appear to
       
   291     be rather powerful for simple applications, it encourages greater
       
   292     reuse of components within applications.
       
   293 */