|
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 */ |