|
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 model-view |
|
44 \title Model/View Classes |
|
45 */ |
|
46 |
|
47 /*! |
|
48 \page model-view-programming.html |
|
49 \nextpage An Introduction to Model/View Programming |
|
50 \startpage index.html Qt Reference Documentation |
|
51 |
|
52 \title Model/View Programming |
|
53 \brief A guide to the extensible model/view architecture used by Qt's |
|
54 item view classes. |
|
55 |
|
56 \ingroup frameworks-technologies |
|
57 |
|
58 \list |
|
59 \o \l{An Introduction to Model/View Programming} |
|
60 \tableofcontents{1 An Introduction to Model/View Programming} |
|
61 \o \l{Using Models and Views} |
|
62 \tableofcontents{1 Using Models and Views} |
|
63 \o \l{Model Classes} |
|
64 \tableofcontents{1 Model Classes} |
|
65 \o \l{Creating New Models} |
|
66 \tableofcontents{1 Creating New Models} |
|
67 \o \l{View Classes} |
|
68 \tableofcontents{1 View Classes} |
|
69 \o \l{Handling Selections in Item Views} |
|
70 \tableofcontents{1 Handling Selections in Item Views} |
|
71 \o \l{Delegate Classes} |
|
72 \tableofcontents{1 Delegate Classes} |
|
73 \o \l{Item View Convenience Classes} |
|
74 \tableofcontents{1 Item View Convenience Classes} |
|
75 \o \l{Using Drag and Drop with Item Views} |
|
76 \tableofcontents{1 Using Drag and Drop with Item Views} |
|
77 \o \l{Proxy Models} |
|
78 \tableofcontents{1 Proxy Models} |
|
79 \o \l{Model Subclassing Reference} |
|
80 \tableofcontents{1 Model Subclassing Reference} |
|
81 \endlist |
|
82 |
|
83 \keyword Model/View Classes |
|
84 \section1 All Model/View Classes |
|
85 |
|
86 These classes use the model/view design pattern in which the |
|
87 underlying data (in the model) is kept separate from the way the data |
|
88 is presented and manipulated by the user (in the view). |
|
89 |
|
90 \annotatedlist model-view |
|
91 |
|
92 \section1 Related Examples |
|
93 |
|
94 \list |
|
95 \o \l{itemviews/dirview}{Dir View} |
|
96 \o \l{itemviews/spinboxdelegate}{Spin Box Delegate} |
|
97 \o \l{itemviews/pixelator}{Pixelator} |
|
98 \o \l{itemviews/simpletreemodel}{Simple Tree Model} |
|
99 \o \l{itemviews/chart}{Chart} |
|
100 \endlist |
|
101 */ |
|
102 |
|
103 /*! |
|
104 \page model-view-introduction.html |
|
105 \previouspage Model/View Programming |
|
106 \nextpage Using Models and Views |
|
107 \startpage index.html Qt Reference Documentation |
|
108 |
|
109 \title An Introduction to Model/View Programming |
|
110 |
|
111 \tableofcontents |
|
112 |
|
113 Qt 4 introduces a new set of item view classes that use a model/view |
|
114 architecture to manage the relationship between data and the way it |
|
115 is presented to the user. The separation of functionality introduced by |
|
116 this architecture gives developers greater flexibility to customize the |
|
117 presentation of items, and provides a standard model interface to allow |
|
118 a wide range of data sources to be used with existing item views. |
|
119 In this document, we give a brief introduction to the model/view paradigm, |
|
120 outline the concepts involved, and describe the architecture of the item |
|
121 view system. Each of the components in the architecture is explained, |
|
122 and examples are given that show how to use the classes provided. |
|
123 |
|
124 \section1 The Model/View Architecture |
|
125 |
|
126 Model-View-Controller (MVC) is a design pattern originating from |
|
127 Smalltalk that is often used when building user interfaces. |
|
128 In \l{Design Patterns}, Gamma et al. write: |
|
129 |
|
130 \quotation |
|
131 MVC consists of three kinds of objects. The Model is the application |
|
132 object, the View is its screen presentation, and the Controller defines |
|
133 the way the user interface reacts to user input. Before MVC, user |
|
134 interface designs tended to lump these objects together. MVC decouples |
|
135 them to increase flexibility and reuse. |
|
136 \endquotation |
|
137 |
|
138 If the view and the controller objects are combined, the result is |
|
139 the model/view architecture. This still separates the way that data |
|
140 is stored from the way that it is presented to the user, but provides |
|
141 a simpler framework based on the same principles. This separation |
|
142 makes it possible to display the same data in several different views, |
|
143 and to implement new types of views, without changing the underlying |
|
144 data structures. |
|
145 To allow flexible handling of user input, we introduce the concept of |
|
146 the \e delegate. The advantage of having a delegate in this framework |
|
147 is that it allows the way items of data are rendered and edited to be |
|
148 customized. |
|
149 |
|
150 \table |
|
151 \row \i \inlineimage modelview-overview.png |
|
152 \i \bold{The model/view architecture} |
|
153 |
|
154 The model communicates with a source of data, providing an \e interface |
|
155 for the other components in the architecture. The nature of the |
|
156 communication depends on the type of data source, and the way the model |
|
157 is implemented. |
|
158 |
|
159 The view obtains \e{model indexes} from the model; these are references |
|
160 to items of data. By supplying model indexes to the model, the view can |
|
161 retrieve items of data from the data source. |
|
162 |
|
163 In standard views, a \e delegate renders the items of data. When an item |
|
164 is edited, the delegate communicates with the model directly using |
|
165 model indexes. |
|
166 \endtable |
|
167 |
|
168 Generally, the model/view classes can be separated into the three groups |
|
169 described above: models, views, and delegates. Each of these components |
|
170 is defined by \e abstract classes that provide common interfaces and, |
|
171 in some cases, default implementations of features. |
|
172 Abstract classes are meant to be subclassed in order to provide the full |
|
173 set of functionality expected by other components; this also allows |
|
174 specialized components to be written. |
|
175 |
|
176 Models, views, and delegates communicate with each other using \e{signals |
|
177 and slots}: |
|
178 |
|
179 \list |
|
180 \o Signals from the model inform the view about changes to the data |
|
181 held by the data source. |
|
182 \o Signals from the view provide information about the user's interaction |
|
183 with the items being displayed. |
|
184 \o Signals from the delegate are used during editing to tell the |
|
185 model and view about the state of the editor. |
|
186 \endlist |
|
187 |
|
188 \section2 Models |
|
189 |
|
190 All item models are based on the QAbstractItemModel class. This class |
|
191 defines an interface that is used by views and delegates to access data. |
|
192 The data itself does not have to be stored in the model; it can be held |
|
193 in a data structure or repository provided by a separate class, a file, |
|
194 a database, or some other application component. |
|
195 |
|
196 The basic concepts surrounding models are presented in the section |
|
197 on \l{Model Classes}. |
|
198 |
|
199 QAbstractItemModel |
|
200 provides an interface to data that is flexible enough to handle views |
|
201 that represent data in the form of tables, lists, and trees. However, |
|
202 when implementing new models for list and table-like data structures, |
|
203 the QAbstractListModel and QAbstractTableModel classes are better |
|
204 starting points because they provide appropriate default implementations |
|
205 of common functions. Each of these classes can be subclassed to provide |
|
206 models that support specialized kinds of lists and tables. |
|
207 |
|
208 The process of subclassing models is discussed in the section on |
|
209 \l{Creating New Models}. |
|
210 |
|
211 Qt provides some ready-made models that can be used to handle items of |
|
212 data: |
|
213 |
|
214 \list |
|
215 \o QStringListModel is used to store a simple list of QString items. |
|
216 \o QStandardItemModel manages more complex tree structures of items, each |
|
217 of which can contain arbitrary data. |
|
218 \o QFileSystemModel provides information about files and directories in the |
|
219 local filing system. |
|
220 \o QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel are used |
|
221 to access databases using model/view conventions. |
|
222 \endlist |
|
223 |
|
224 If these standard models do not meet your requirements, you can subclass |
|
225 QAbstractItemModel, QAbstractListModel, or QAbstractTableModel to create |
|
226 your own custom models. |
|
227 |
|
228 \section2 Views |
|
229 |
|
230 Complete implementations are provided for different kinds of |
|
231 views: QListView displays a list of items, QTableView displays data |
|
232 from a model in a table, and QTreeView shows model items of data in a |
|
233 hierarchical list. Each of these classes is based on the |
|
234 QAbstractItemView abstract base class. Although these classes are |
|
235 ready-to-use implementations, they can also be subclassed to provide |
|
236 customized views. |
|
237 |
|
238 The available views are examined in the section on \l{View Classes}. |
|
239 |
|
240 \section2 Delegates |
|
241 |
|
242 QAbstractItemDelegate is the abstract base class for delegates in the |
|
243 model/view framework. Since Qt 4.4, the default delegate implementation is |
|
244 provided by QStyledItemDelegate, and this is used as the default delegate |
|
245 by Qt's standard views. However, QStyledItemDelegate and QItemDelegate are |
|
246 independent alternatives to painting and providing editors for items in |
|
247 views. The difference between them is that QStyledItemDelegate uses the |
|
248 current style to paint its items. We therefore recommend using |
|
249 QStyledItemDelegate as the base class when implementing custom delegates or |
|
250 when working with Qt style sheets. |
|
251 |
|
252 Delegates are described in the section on \l{Delegate Classes}. |
|
253 |
|
254 \section2 Sorting |
|
255 |
|
256 There are two ways of approaching sorting in the model/view |
|
257 architecture; which approach to choose depends on your underlying |
|
258 model. |
|
259 |
|
260 If your model is sortable, i.e, if it reimplements the |
|
261 QAbstractItemModel::sort() function, both QTableView and QTreeView |
|
262 provide an API that allows you to sort your model data |
|
263 programmatically. In addition, you can enable interactive sorting |
|
264 (i.e. allowing the users to sort the data by clicking the view's |
|
265 headers), by connecting the QHeaderView::sortIndicatorChanged() signal |
|
266 to the QTableView::sortByColumn() slot or the |
|
267 QTreeView::sortByColumn() slot, respectively. |
|
268 |
|
269 The alternative approach, if your model do not have the required |
|
270 interface or if you want to use a list view to present your data, |
|
271 is to use a proxy model to transform the structure of your model |
|
272 before presenting the data in the view. This is covered in detail |
|
273 in the section on \l {Proxy Models}. |
|
274 |
|
275 \section2 Convenience Classes |
|
276 |
|
277 A number of \e convenience classes are derived from the standard view |
|
278 classes for the benefit of applications that rely on Qt's item-based |
|
279 item view and table classes. They are not intended to be subclassed, |
|
280 but simply exist to provide a familiar interface to the equivalent classes |
|
281 in Qt 3. |
|
282 Examples of such classes include \l QListWidget, \l QTreeWidget, and |
|
283 \l QTableWidget; these provide similar behavior to the \c QListBox, |
|
284 \c QListView, and \c QTable classes in Qt 3. |
|
285 |
|
286 These classes are less flexible than the view classes, and cannot be |
|
287 used with arbitrary models. We recommend that you use a model/view |
|
288 approach to handling data in item views unless you strongly need an |
|
289 item-based set of classes. |
|
290 |
|
291 If you wish to take advantage of the features provided by the model/view |
|
292 approach while still using an item-based interface, consider using view |
|
293 classes, such as QListView, QTableView, and QTreeView with |
|
294 QStandardItemModel. |
|
295 |
|
296 \section1 The Model/View Components |
|
297 |
|
298 The following sections describe the way in which the model/view pattern |
|
299 is used in Qt. Each section provides an example of use, and is followed |
|
300 by a section showing how you can create new components. |
|
301 */ |
|
302 |
|
303 /*! |
|
304 \page model-view-using.html |
|
305 \contentspage model-view-programming.html Contents |
|
306 \previouspage An Introduction to Model/View Programming |
|
307 \nextpage Model Classes |
|
308 |
|
309 \title Using Models and Views |
|
310 |
|
311 \tableofcontents |
|
312 |
|
313 \section1 Introduction |
|
314 |
|
315 Two of the standard models provided by Qt are QStandardItemModel and |
|
316 QFileSystemModel. QStandardItemModel is a multi-purpose model that can be |
|
317 used to represent various different data structures needed by list, table, |
|
318 and tree views. This model also holds the items of data. |
|
319 QFileSystemModel is a model that maintains information about the contents |
|
320 of a directory. As a result, it does not hold any items of data itself, but |
|
321 simply represents files and directories on the local filing system. |
|
322 |
|
323 QFileSystemModel provides a ready-to-use model to experiment with, and can be |
|
324 easily configured to use existing data. Using this model, we can show how |
|
325 to set up a model for use with ready-made views, and explore how to |
|
326 manipulate data using model indexes. |
|
327 |
|
328 \section1 Using Views with an Existing Model |
|
329 |
|
330 The QListView and QTreeView classes are the most suitable views |
|
331 to use with QFileSystemModel. The example presented below displays the |
|
332 contents of a directory in a tree view next to the same information in |
|
333 a list view. The views share the user's selection so that the selected |
|
334 items are highlighted in both views. |
|
335 |
|
336 \img shareddirmodel.png |
|
337 |
|
338 We set up a QFileSystemModel so that it is ready for use, and create some |
|
339 views to display the contents of a directory. This shows the simplest |
|
340 way to use a model. The construction and use of the model is |
|
341 performed from within a single \c main() function: |
|
342 |
|
343 \snippet doc/src/snippets/shareddirmodel/main.cpp 0 |
|
344 |
|
345 The model is set up to use data from a certain file system. The call to |
|
346 \l{QFileSystemModel::}{setRootPath()} tell the model which drive on the |
|
347 file system to expose to the views. |
|
348 |
|
349 We create two views so that we can examine the items held in the model in two |
|
350 different ways: |
|
351 |
|
352 \snippet doc/src/snippets/shareddirmodel/main.cpp 5 |
|
353 |
|
354 The views are constructed in the same way as other widgets. Setting up |
|
355 a view to display the items in the model is simply a matter of calling its |
|
356 \l{QAbstractItemView::setModel()}{setModel()} function with the directory |
|
357 model as the argument. We filter the data supplied by the model by calling |
|
358 the \l{QAbstractItemView::}{setRootIndex()} function on each view, passing |
|
359 a suitable \e{model index} from the file system model for the current |
|
360 directory. |
|
361 |
|
362 The \c index() function used in this case is unique to QFileSystemModel; we |
|
363 supply it with a directory and it returns a model index. Model indexes are |
|
364 discussed in the \l{Model Classes} chapter. |
|
365 |
|
366 The rest of the function just displays the views within a splitter |
|
367 widget, and runs the application's event loop: |
|
368 |
|
369 \snippet doc/src/snippets/shareddirmodel/main.cpp 8 |
|
370 |
|
371 In the above example, we neglected to mention how to handle selections |
|
372 of items. This subject is covered in more detail in the chapter on |
|
373 \l{Handling Selections in Item Views}. Before examining how selections |
|
374 are handled, you may find it useful to read the \l{Model Classes} chapter |
|
375 which describes the concepts used in the model/view framework. |
|
376 */ |
|
377 |
|
378 /*! |
|
379 \page model-view-model.html |
|
380 \contentspage model-view-programming.html Contents |
|
381 \previouspage Using Models and Views |
|
382 \nextpage Creating New Models |
|
383 |
|
384 \title Model Classes |
|
385 |
|
386 \tableofcontents |
|
387 |
|
388 \section1 Basic Concepts |
|
389 |
|
390 In the model/view architecture, the model provides a standard interface |
|
391 that views and delegates use to access data. In Qt, the standard |
|
392 interface is defined by the QAbstractItemModel class. No matter how the |
|
393 items of data are stored in any underlying data structure, all subclasses |
|
394 of QAbstractItemModel represent the data as a hierarchical structure |
|
395 containing tables of items. Views use this \e convention to access items |
|
396 of data in the model, but they are not restricted in the way that they |
|
397 present this information to the user. |
|
398 |
|
399 \image modelview-models.png |
|
400 |
|
401 Models also notify any attached views about changes to data through the |
|
402 signals and slots mechanism. |
|
403 |
|
404 This chapter describes some basic concepts that are central to the way |
|
405 item of data are accessed by other components via a model class. More |
|
406 advanced concepts are discussed in later chapters. |
|
407 |
|
408 \section2 Model Indexes |
|
409 |
|
410 To ensure that the representation of the data is kept separate from the |
|
411 way it is accessed, the concept of a \e{model index} is introduced. Each |
|
412 piece of information that can be obtained via a model is represented by |
|
413 a model index. Views and delegates use these indexes to request items of |
|
414 data to display. |
|
415 |
|
416 As a result, only the model needs to know how to obtain data, and the type |
|
417 of data managed by the model can be defined fairly generally. Model indexes |
|
418 contain a pointer to the model that created them, and this prevents |
|
419 confusion when working with more than one model. |
|
420 |
|
421 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 0 |
|
422 |
|
423 Model indexes provide \e temporary references to pieces of information, and |
|
424 can be used to retrieve or modify data via the model. Since models may |
|
425 reorganize their internal structures from time to time, model indexes may |
|
426 become invalid, and \e{should not be stored}. If a long-term reference to a |
|
427 piece of information is required, a \e{persistent model index} must be |
|
428 created. This provides a reference to the information that the model keeps |
|
429 up-to-date. Temporary model indexes are provided by the QModelIndex class, |
|
430 and persistent model indexes are provided by the QPersistentModelIndex |
|
431 class. |
|
432 |
|
433 To obtain a model index that corresponds to an item of data, three |
|
434 properties must be specified to the model: a row number, a column number, |
|
435 and the model index of a parent item. The following sections describe |
|
436 and explain these properties in detail. |
|
437 |
|
438 \section2 Rows and Columns |
|
439 |
|
440 In its most basic form, a model can be accessed as a simple table in which |
|
441 items are located by their row and column numbers. \e{This does not mean |
|
442 that the underlying pieces of data are stored in an array structure}; the |
|
443 use of row and column numbers is only a convention to allow components to |
|
444 communicate with each other. We can retrieve information about any given |
|
445 item by specifying its row and column numbers to the model, and we receive |
|
446 an index that represents the item: |
|
447 |
|
448 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 1 |
|
449 |
|
450 Models that provide interfaces to simple, single level data structures like |
|
451 lists and tables do not need any other information to be provided but, as |
|
452 the above code indicates, we need to supply more information when obtaining |
|
453 a model index. |
|
454 |
|
455 \table |
|
456 \row \i \inlineimage modelview-tablemodel.png |
|
457 \i \bold{Rows and columns} |
|
458 |
|
459 The diagram shows a representation of a basic table model in which each |
|
460 item is located by a pair of row and column numbers. We obtain a model |
|
461 index that refers to an item of data by passing the relevant row and |
|
462 column numbers to the model. |
|
463 |
|
464 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 2 |
|
465 |
|
466 Top level items in a model are always referenced by specifying |
|
467 \c QModelIndex() as their parent item. This is discussed in the next |
|
468 section. |
|
469 \endtable |
|
470 |
|
471 \section2 Parents of Items |
|
472 |
|
473 The table-like interface to item data provided by models is ideal when |
|
474 using data in a table or list view; the row and column number system maps |
|
475 exactly to the way the views display items. However, structures such as |
|
476 tree views require the model to expose a more flexible interface to the |
|
477 items within. As a result, each item can also be the parent of another |
|
478 table of items, in much the same way that a top-level item in a tree view |
|
479 can contain another list of items. |
|
480 |
|
481 When requesting an index for a model item, we must provide some information |
|
482 about the item's parent. Outside the model, the only way to refer to an |
|
483 item is through a model index, so a parent model index must also be given: |
|
484 |
|
485 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 3 |
|
486 |
|
487 \table |
|
488 \row \i \inlineimage modelview-treemodel.png |
|
489 \i \bold{Parents, rows, and columns} |
|
490 |
|
491 The diagram shows a representation of a tree model in which each item is |
|
492 referred to by a parent, a row number, and a column number. |
|
493 |
|
494 Items "A" and "C" are represented as top-level siblings in the model: |
|
495 |
|
496 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 4 |
|
497 |
|
498 Item "A" has a number of children. A model index for item "B" is |
|
499 obtained with the following code: |
|
500 |
|
501 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 5 |
|
502 \endtable |
|
503 |
|
504 \section2 Item Roles |
|
505 |
|
506 Items in a model can perform various \e roles for other components, |
|
507 allowing different kinds of data to be supplied for different situations. |
|
508 For example, Qt::DisplayRole is used to access a string that can be |
|
509 displayed as text in a view. Typically, items contain data for a number of |
|
510 different roles, and the standard roles are defined by Qt::ItemDataRole. |
|
511 |
|
512 We can ask the model for the item's data by passing it the model index |
|
513 corresponding to the item, and by specifying a role to obtain the type |
|
514 of data we want: |
|
515 |
|
516 \snippet doc/src/snippets/code/doc_src_model-view-programming.qdoc 6 |
|
517 |
|
518 \table |
|
519 \row \i \inlineimage modelview-roles.png |
|
520 \i \bold{Item roles} |
|
521 |
|
522 The role indicates to the model which type of data is being referred to. |
|
523 Views can display the roles in different ways, so it is important to |
|
524 supply appropriate information for each role. |
|
525 |
|
526 The \l{Creating New Models} section covers some specific uses of roles in |
|
527 more detail. |
|
528 \endtable |
|
529 |
|
530 Most common uses for item data are covered by the standard roles defined in |
|
531 Qt::ItemDataRole. By supplying appropriate item data for each role, models |
|
532 can provide hints to views and delegates about how items should be |
|
533 presented to the user. Different kinds of views have the freedom to |
|
534 interpret or ignore this information as required. It is also possible to |
|
535 define additional roles for application-specific purposes. |
|
536 |
|
537 \section2 Summary of Concepts |
|
538 |
|
539 \list |
|
540 \o Model indexes give views and delegates information about the location |
|
541 of items provided by models in a way that is independent of any |
|
542 underlying data structures. |
|
543 \o Items are referred to by their row and column numbers, and by the model |
|
544 index of their parent items. |
|
545 \o Model indexes are constructed by models at the request of other |
|
546 components, such as views and delegates. |
|
547 \o If a valid model index is specified for the parent item when an index is |
|
548 requested using \l{QAbstractItemModel::index()}{index()}, the index |
|
549 returned will refer to an item beneath that parent item in the |
|
550 model. |
|
551 The index obtained refers to a child of that item. |
|
552 \o If an invalid model index is specified for the parent item when an index |
|
553 is requested using \l{QAbstractItemModel::index()}{index()}, the index |
|
554 returned will refer to a top-level item in the model. |
|
555 \o The \l{Qt::ItemDataRole}{role} distinguishes between the |
|
556 different kinds of data associated with an item. |
|
557 \endlist |
|
558 |
|
559 \section2 Using Model Indexes |
|
560 |
|
561 To demonstrate how data can be retrieved from a model, using model |
|
562 indexes, we set up a QFileSystemModel without a view and display the |
|
563 names of files and directories in a widget. |
|
564 Although this does not show a normal way of using a model, it demonstrates |
|
565 the conventions used by models when dealing with model indexes. |
|
566 |
|
567 We construct a file system model in the following way: |
|
568 |
|
569 \snippet doc/src/snippets/simplemodel-use/main.cpp 0 |
|
570 |
|
571 In this case, we set up a default QFileSystemModel, obtain a parent index |
|
572 using a specific implementation of \l{QFileSystemModel::}{index()} |
|
573 provided by that model, and we count the number of rows in the model using |
|
574 the \l{QFileSystemModel::}{rowCount()} function. |
|
575 |
|
576 For simplicity, we are only interested in the items in the first column |
|
577 of the model. We examine each row in turn, obtaining a model index for |
|
578 the first item in each row, and read the data stored for that item |
|
579 in the model. |
|
580 |
|
581 \snippet doc/src/snippets/simplemodel-use/main.cpp 1 |
|
582 |
|
583 To obtain a model index, we specify the row number, column number (zero |
|
584 for the first column), and the appropriate model index for the parent |
|
585 of all the items that we want. |
|
586 The text stored in each item is retrieved using the model's |
|
587 \l{QFileSystemModel::}{data()} function. We specify the model index and |
|
588 the \l{Qt::ItemDataRole}{DisplayRole} to obtain data for the |
|
589 item in the form of a string. |
|
590 |
|
591 \snippet doc/src/snippets/simplemodel-use/main.cpp 2 |
|
592 \codeline |
|
593 \snippet doc/src/snippets/simplemodel-use/main.cpp 3 |
|
594 |
|
595 The above example demonstrates the basic principles used to retrieve |
|
596 data from a model: |
|
597 |
|
598 \list |
|
599 \i The dimensions of a model can be found using |
|
600 \l{QAbstractItemModel::rowCount()}{rowCount()} and |
|
601 \l{QAbstractItemModel::columnCount()}{columnCount()}. |
|
602 These functions generally require a parent model index to be |
|
603 specified. |
|
604 \i Model indexes are used to access items in the model. The row, column, |
|
605 and parent model index are needed to specify the item. |
|
606 \i To access top-level items in a model, specify a null model index |
|
607 as the parent index with \c QModelIndex(). |
|
608 \i Items contain data for different roles. To obtain the data for a |
|
609 particular role, both the model index and the role must be supplied |
|
610 to the model. |
|
611 \endlist |
|
612 |
|
613 |
|
614 \section1 Further Reading |
|
615 |
|
616 New models can be created by implementing the standard interface provided |
|
617 by QAbstractItemModel. In the \l{Creating New Models} chapter, we will |
|
618 demonstrate this by creating a convenient ready-to-use model for holding |
|
619 lists of strings. |
|
620 */ |
|
621 |
|
622 /*! |
|
623 \page model-view-view.html |
|
624 \contentspage model-view-programming.html Contents |
|
625 \previouspage Creating New Models |
|
626 \nextpage Handling Selections in Item Views |
|
627 |
|
628 \title View Classes |
|
629 |
|
630 \tableofcontents |
|
631 |
|
632 \section1 Concepts |
|
633 |
|
634 In the model/view architecture, the view obtains items of data from the |
|
635 model and presents them to the user. The way that the data is |
|
636 presented need not resemble the representation of the data provided by |
|
637 the model, and may be \e{completely different} from the underlying data |
|
638 structure used to store items of data. |
|
639 |
|
640 The separation of content and presentation is achieved by the use of a |
|
641 standard model interface provided by QAbstractItemModel, a standard view |
|
642 interface provided by QAbstractItemView, and the use of model indexes |
|
643 that represent items of data in a general way. |
|
644 Views typically manage the overall layout of the data obtained from |
|
645 models. They may render individual items of data themselves, or use |
|
646 \l{Delegate Classes}{delegates} to handle both rendering and editing |
|
647 features. |
|
648 |
|
649 As well as presenting data, views handle navigation between items, |
|
650 and some aspects of item selection. The views also implement basic |
|
651 user interface features, such as context menus and drag and drop. |
|
652 A view can provide default editing facilities for items, or it may |
|
653 work with a \l{Delegate Classes}{delegate} to provide a custom |
|
654 editor. |
|
655 |
|
656 A view can be constructed without a model, but a model must be |
|
657 provided before it can display useful information. Views keep track of |
|
658 the items that the user has selected through the use of |
|
659 \l{Handling Selections in Item Views}{selections} which can be maintained |
|
660 separately for each view, or shared between multiple views. |
|
661 |
|
662 Some views, such as QTableView and QTreeView, display headers as well |
|
663 as items. These are also implemented by a view class, QHeaderView. |
|
664 Headers usually access the same model as the view that contains them. |
|
665 They retrieve data from the model using the |
|
666 \l{QAbstractItemModel::headerData()} function, and usually display |
|
667 header information in the form of a label. New headers can be |
|
668 subclassed from the QHeaderView class to provide more specialized |
|
669 labels for views. |
|
670 |
|
671 \section1 Using an Existing View |
|
672 |
|
673 Qt provides three ready-to-use view classes that present data from |
|
674 models in ways that are familiar to most users. |
|
675 QListView can display items from a model as a simple list, or in the |
|
676 form of a classic icon view. QTreeView displays items from a |
|
677 model as a hierarchy of lists, allowing deeply nested structures to be |
|
678 represented in a compact way. QTableView presents items from a model |
|
679 in the form of a table, much like the layout of a spreadsheet |
|
680 application. |
|
681 |
|
682 \img standard-views.png |
|
683 |
|
684 The default behavior of the standard views shown above should be |
|
685 sufficient for most applications. They provide basic editing |
|
686 facilities, and can be customized to suit the needs of more specialized |
|
687 user interfaces. |
|
688 |
|
689 \section2 Using a Model |
|
690 |
|
691 We take the string list model that \l{Creating New Models}{we created as |
|
692 an example model}, set it up with some data, and construct a view to |
|
693 display the contents of the model. This can all be performed within a |
|
694 single function: |
|
695 |
|
696 \snippet doc/src/snippets/stringlistmodel/main.cpp 0 |
|
697 |
|
698 Note that the \c StringListModel is declared as a \l QAbstractItemModel. |
|
699 This allows us to use the abstract interface to the model, and |
|
700 ensures that the code will still work even if we replace the string list |
|
701 model with a different model in the future. |
|
702 |
|
703 The list view provided by \l QListView is sufficient for presenting |
|
704 the items in the string list model. We construct the view, and set up |
|
705 the model using the following lines of code: |
|
706 |
|
707 \snippet doc/src/snippets/stringlistmodel/main.cpp 2 |
|
708 \snippet doc/src/snippets/stringlistmodel/main.cpp 4 |
|
709 |
|
710 The view is shown in the normal way: |
|
711 |
|
712 \snippet doc/src/snippets/stringlistmodel/main.cpp 5 |
|
713 |
|
714 The view renders the contents of a model, accessing data via the model's |
|
715 interface. When the user tries to edit an item, the view uses a default |
|
716 delegate to provide an editor widget. |
|
717 |
|
718 \img stringlistmodel.png |
|
719 |
|
720 The above image shows how a QListView represents the data in the string |
|
721 list model. Since the model is editable, the view automatically allows |
|
722 each item in the list to be edited using the default delegate. |
|
723 |
|
724 \section2 Using Multiple Views onto the Same Model |
|
725 |
|
726 Providing multiple views onto the same model is simply a matter of |
|
727 setting the same model for each view. In the following code we create |
|
728 two table views, each using the same simple table model which we have |
|
729 created for this example: |
|
730 |
|
731 \snippet doc/src/snippets/sharedtablemodel/main.cpp 0 |
|
732 \codeline |
|
733 \snippet doc/src/snippets/sharedtablemodel/main.cpp 1 |
|
734 |
|
735 The use of signals and slots in the model/view architecture means that |
|
736 changes to the model can be propagated to all the attached views, |
|
737 ensuring that we can always access the same data regardless of the |
|
738 view being used. |
|
739 |
|
740 \img sharedmodel-tableviews.png |
|
741 |
|
742 The above image shows two different views onto the same model, each |
|
743 containing a number of selected items. Although the data from the model |
|
744 is shown consistently across view, each view maintains its own internal |
|
745 selection model. This can be useful in certain situations but, for |
|
746 many applications, a shared selection model is desirable. |
|
747 |
|
748 \section1 Handling Selections of Items |
|
749 |
|
750 The mechanism for handling selections of items within views is provided |
|
751 by the \l QItemSelectionModel class. All of the standard views construct |
|
752 their own selection models by default, and interact with them in the |
|
753 normal way. The selection model being used by a view can be obtained |
|
754 through the \l{QAbstractItemView::selectionModel()}{selectionModel()} |
|
755 function, and a replacement selection model can be specified with |
|
756 \l{QAbstractItemView::setSelectionModel()}{setSelectionModel()}. |
|
757 The ability to control the selection model used by a view is useful |
|
758 when we want to provide multiple consistent views onto the same model |
|
759 data. |
|
760 |
|
761 Generally, unless you are subclassing a model or view, you will not |
|
762 need to manipulate the contents of selections directly. However, the |
|
763 interface to the selection model can be accessed, if required, and |
|
764 this is explored in the chapter on |
|
765 \l{Handling Selections in Item Views}. |
|
766 |
|
767 \section2 Sharing Selections Between Views |
|
768 |
|
769 Although it is convenient that the view classes provide their own |
|
770 selection models by default, when we use more than one view onto the |
|
771 same model it is often desirable that both the model's data and the |
|
772 user's selection are shown consistently in all views. |
|
773 Since the view classes allow their internal selection models to be |
|
774 replaced, we can achieve a unified selection between views with the |
|
775 following line: |
|
776 |
|
777 \snippet doc/src/snippets/sharedtablemodel/main.cpp 2 |
|
778 |
|
779 The second view is given the selection model for the first view. |
|
780 Both views now operate on the same selection model, keeping both |
|
781 the data and the selected items synchronized. |
|
782 |
|
783 \img sharedselection-tableviews.png |
|
784 |
|
785 In the example shown above, two views of the same type were used to |
|
786 display the same model's data. However, if two different types of view |
|
787 were used, the selected items may be represented very differently in |
|
788 each view; for example, a contiguous selection in a table view can be |
|
789 represented as a fragmented set of highlighted items in a tree view. |
|
790 |
|
791 */ |
|
792 |
|
793 /*! |
|
794 \page model-view-delegate.html |
|
795 \contentspage model-view-programming.html Contents |
|
796 \previouspage Handling Selections in Item Views |
|
797 \nextpage Item View Convenience Classes |
|
798 |
|
799 \title Delegate Classes |
|
800 |
|
801 \tableofcontents |
|
802 |
|
803 \section1 Concepts |
|
804 |
|
805 Unlike the Model-View-Controller pattern, the model/view design does not |
|
806 include a completely separate component for managing interaction with |
|
807 the user. Generally, the view is responsible for the presentation of |
|
808 model data to the user, and for processing user input. To allow some |
|
809 flexibility in the way this input is obtained, the interaction is |
|
810 performed by delegates. These components provide input capabilities |
|
811 and are also responsible for rendering individual items in some views. |
|
812 The standard interface for controlling delegates is defined in the |
|
813 \l QAbstractItemDelegate class. |
|
814 |
|
815 Delegates are expected to be able to render their contents themselves |
|
816 by implementing the \l{QItemDelegate::paint()}{paint()} |
|
817 and \l{QItemDelegate::sizeHint()}{sizeHint()} functions. |
|
818 However, simple widget-based delegates can subclass \l QItemDelegate |
|
819 instead of \l QAbstractItemDelegate, and take advantage of the default |
|
820 implementations of these functions. |
|
821 |
|
822 Editors for delegates can be implemented either by using widgets to manage |
|
823 the editing process or by handling events directly. |
|
824 The first approach is covered later in this chapter, and it is also |
|
825 shown in the \l{Spin Box Delegate Example}{Spin Box Delegate} example. |
|
826 |
|
827 The \l{Pixelator Example}{Pixelator} example shows how to create a |
|
828 custom delegate that performs specialized rendering for a table view. |
|
829 |
|
830 \section1 Using an Existing Delegate |
|
831 |
|
832 The standard views provided with Qt use instances of \l QItemDelegate |
|
833 to provide editing facilities. This default implementation of the |
|
834 delegate interface renders items in the usual style for each of the |
|
835 standard views: \l QListView, \l QTableView, and \l QTreeView. |
|
836 |
|
837 All the standard roles are handled by the default delegate used by |
|
838 the standard views. The way these are interpreted is described in the |
|
839 QItemDelegate documentation. |
|
840 |
|
841 The delegate used by a view is returned by the |
|
842 \l{QAbstractItemView::itemDelegate()}{itemDelegate()} function. |
|
843 The \l{QAbstractItemView::setItemDelegate()}{setItemDelegate()} function |
|
844 allows you to install a custom delegate for a standard view, and it is |
|
845 necessary to use this function when setting the delegate for a custom |
|
846 view. |
|
847 |
|
848 \section1 A Simple Delegate |
|
849 |
|
850 The delegate implemented here uses a \l QSpinBox to provide editing |
|
851 facilities, and is mainly intended for use with models that display |
|
852 integers. Although we set up a custom integer-based table model for |
|
853 this purpose, we could easily have used \l QStandardItemModel instead |
|
854 since the custom delegate will control data entry. We construct a |
|
855 table view to display the contents of the model, and this will use |
|
856 the custom delegate for editing. |
|
857 |
|
858 \img spinboxdelegate-example.png |
|
859 |
|
860 We subclass the delegate from \l QItemDelegate because we do not want |
|
861 to write custom display functions. However, we must still provide |
|
862 functions to manage the editor widget: |
|
863 |
|
864 \snippet examples/itemviews/spinboxdelegate/delegate.h 0 |
|
865 |
|
866 Note that no editor widgets are set up when the delegate is |
|
867 constructed. We only construct an editor widget when it is needed. |
|
868 |
|
869 \section2 Providing an Editor |
|
870 |
|
871 In this example, when the table view needs to provide an editor, it |
|
872 asks the delegate to provide an editor widget that is appropriate |
|
873 for the item being modified. The |
|
874 \l{QAbstractItemDelegate::createEditor()}{createEditor()} function is |
|
875 supplied with everything that the delegate needs to be able to set up |
|
876 a suitable widget: |
|
877 |
|
878 \snippet examples/itemviews/spinboxdelegate/delegate.cpp 1 |
|
879 |
|
880 Note that we do not need to keep a pointer to the editor widget because |
|
881 the view takes responsibility for destroying it when it is no longer |
|
882 needed. |
|
883 |
|
884 We install the delegate's default event filter on the editor to ensure |
|
885 that it provides the standard editing shortcuts that users expect. |
|
886 Additional shortcuts can be added to the editor to allow more |
|
887 sophisticated behavior; these are discussed in the section on |
|
888 \l{#EditingHints}{Editing Hints}. |
|
889 |
|
890 The view ensures that the editor's data and geometry are set |
|
891 correctly by calling functions that we define later for these purposes. |
|
892 We can create different editors depending on the model index supplied |
|
893 by the view. For example, if we have a column of integers and a column |
|
894 of strings we could return either a \c QSpinBox or a \c QLineEdit, |
|
895 depending on which column is being edited. |
|
896 |
|
897 The delegate must provide a function to copy model data into the |
|
898 editor. In this example, we read the data stored in the |
|
899 \l{Qt::ItemDataRole}{display role}, and set the value in the |
|
900 spin box accordingly. |
|
901 |
|
902 \snippet examples/itemviews/spinboxdelegate/delegate.cpp 2 |
|
903 |
|
904 In this example, we know that the editor widget is a spin box, but we |
|
905 could have provided different editors for different types of data in |
|
906 the model, in which case we would need to cast the widget to the |
|
907 appropriate type before accessing its member functions. |
|
908 |
|
909 \section2 Submitting Data to the Model |
|
910 |
|
911 When the user has finished editing the value in the spin box, the view |
|
912 asks the delegate to store the edited value in the model by calling the |
|
913 \l{QAbstractItemDelegate::setModelData()}{setModelData()} function. |
|
914 |
|
915 \snippet examples/itemviews/spinboxdelegate/delegate.cpp 3 |
|
916 |
|
917 Since the view manages the editor widgets for the delegate, we only |
|
918 need to update the model with the contents of the editor supplied. |
|
919 In this case, we ensure that the spin box is up-to-date, and update |
|
920 the model with the value it contains using the index specified. |
|
921 |
|
922 The standard \l QItemDelegate class informs the view when it has |
|
923 finished editing by emitting the |
|
924 \l{QAbstractItemDelegate::closeEditor()}{closeEditor()} signal. |
|
925 The view ensures that the editor widget is closed and destroyed. In |
|
926 this example, we only provide simple editing facilities, so we need |
|
927 never emit this signal. |
|
928 |
|
929 All the operations on data are performed through the interface |
|
930 provided by \l QAbstractItemModel. This makes the delegate mostly |
|
931 independent from the type of data it manipulates, but some |
|
932 assumptions must be made in order to use certain types of |
|
933 editor widgets. In this example, we have assumed that the model |
|
934 always contains integer values, but we can still use this |
|
935 delegate with different kinds of models because \l{QVariant} |
|
936 provides sensible default values for unexpected data. |
|
937 |
|
938 \section2 Updating the Editor's Geometry |
|
939 |
|
940 It is the responsibility of the delegate to manage the editor's |
|
941 geometry. The geometry must be set when the editor is created, and |
|
942 when the item's size or position in the view is changed. Fortunately, |
|
943 the view provides all the necessary geometry information inside a |
|
944 \l{QStyleOptionViewItem}{view option} object. |
|
945 |
|
946 \snippet examples/itemviews/spinboxdelegate/delegate.cpp 4 |
|
947 |
|
948 In this case, we just use the geometry information provided by the |
|
949 view option in the item rectangle. A delegate that renders items with |
|
950 several elements would not use the item rectangle directly. It would |
|
951 position the editor in relation to the other elements in the item. |
|
952 |
|
953 \target EditingHints |
|
954 \section2 Editing Hints |
|
955 |
|
956 After editing, delegates should provide hints to the other components |
|
957 about the result of the editing process, and provide hints that will |
|
958 assist any subsequent editing operations. This is achieved by |
|
959 emitting the \l{QAbstractItemDelegate::closeEditor()}{closeEditor()} |
|
960 signal with a suitable hint. This is taken care of by the default |
|
961 QItemDelegate event filter which we installed on the spin box when |
|
962 it was constructed. |
|
963 |
|
964 The behavior of the spin box could be adjusted to make it more user |
|
965 friendly. In the default event filter supplied by QItemDelegate, if |
|
966 the user hits \key Return to confirm their choice in the spin box, |
|
967 the delegate commits the value to the model and closes the spin box. |
|
968 We can change this behavior by installing our own event filter on the |
|
969 spin box, and provide editing hints that suit our needs; for example, |
|
970 we might emit \l{QAbstractItemDelegate::closeEditor()}{closeEditor()} |
|
971 with the \l{QAbstractItemDelegate::EndEditHint}{EditNextItem} hint to |
|
972 automatically start editing the next item in the view. |
|
973 |
|
974 Another approach that does not require the use of an event |
|
975 filter is to provide our own editor widget, perhaps subclassing |
|
976 QSpinBox for convenience. This alternative approach would give us |
|
977 more control over how the editor widget behaves at the cost of |
|
978 writing additional code. It is usually easier to install an event |
|
979 filter in the delegate if you need to customize the behavior of |
|
980 a standard Qt editor widget. |
|
981 |
|
982 Delegates do not have to emit these hints, but those that do not will |
|
983 be less integrated into applications, and will be less usable than |
|
984 those that emit hints to support common editing actions. |
|
985 */ |
|
986 |
|
987 /*! |
|
988 \page model-view-selection.html |
|
989 \contentspage model-view-programming.html Contents |
|
990 \previouspage View Classes |
|
991 \nextpage Delegate Classes |
|
992 |
|
993 \title Handling Selections in Item Views |
|
994 |
|
995 \tableofcontents |
|
996 |
|
997 \section1 Concepts |
|
998 |
|
999 The selection model used in the item view classes offers many improvements |
|
1000 over the selection model used in Qt 3. It provides a more general |
|
1001 description of selections based on the facilities of the model/view |
|
1002 architecture. Although the standard classes for manipulating selections are |
|
1003 sufficient for the item views provided, the selection model allows you to |
|
1004 create specialized selection models to suit the requirements for your own |
|
1005 item models and views. |
|
1006 |
|
1007 Information about the items selected in a view is stored in an instance of |
|
1008 the \l QItemSelectionModel class. This maintains model indexes for items in |
|
1009 a single model, and is independent of any views. Since there can be many |
|
1010 views onto a model, it is possible to share selections between views, |
|
1011 allowing applications to show multiple views in a consistent way. |
|
1012 |
|
1013 Selections are made up of \e{selection ranges}. These efficiently maintain |
|
1014 information about large selections of items by recording only the starting |
|
1015 and ending model indexes for each range of selected items. Non-contiguous |
|
1016 selections of items are constructed by using more than one selection range |
|
1017 to describe the selection. |
|
1018 |
|
1019 Selections are applied to a collection of model indexes held by a selection |
|
1020 model. The most recent selection of items applied is known as the |
|
1021 \e{current selection}. The effects of this selection can be modified even |
|
1022 after its application through the use of certain types of selection |
|
1023 commands. These are discussed later in this section. |
|
1024 |
|
1025 |
|
1026 \section2 Current Item and Selected Items |
|
1027 |
|
1028 In a view, there is always a current item and a selected item - two |
|
1029 independent states. An item can be the current item and selected at the |
|
1030 same time. The view is responsible for ensuring that there is always a |
|
1031 current item as keyboard navigation, for example, requires a current item. |
|
1032 |
|
1033 The table below highlights the differences between current item and |
|
1034 selected items. |
|
1035 |
|
1036 \table |
|
1037 \header |
|
1038 \o Current Item |
|
1039 \o Selected Items |
|
1040 |
|
1041 \row |
|
1042 \o There can only be one current item. |
|
1043 \o There can be multiple selected items. |
|
1044 \row |
|
1045 \o The current item will be changed with key navigation or mouse |
|
1046 button clicks. |
|
1047 \o The selected state of items is set or unset, depending on several |
|
1048 pre-defined modes - e.g., single selection, multiple selection, |
|
1049 etc. - when the user interacts with the items. |
|
1050 \row |
|
1051 \o The current item will be edited if the edit key, \gui F2, is |
|
1052 pressed or the item is double-clicked (provided that editing is |
|
1053 enabled). |
|
1054 \o The current item can be used together with an anchor to specify a |
|
1055 range that should be selected or deselected (or a combination of |
|
1056 the two). |
|
1057 \row |
|
1058 \o The current item is indicated by the focus rectangle. |
|
1059 \o The selected items are indicated with the selection rectangle. |
|
1060 \endtable |
|
1061 |
|
1062 When manipulating selections, it is often helpful to think of |
|
1063 \l QItemSelectionModel as a record of the selection state of all the items |
|
1064 in an item model. Once a selection model is set up, collections of items |
|
1065 can be selected, deselected, or their selection states can be toggled |
|
1066 without the need to know which items are already selected. The indexes of |
|
1067 all selected items can be retrieved at any time, and other components can |
|
1068 be informed of changes to the selection model via the signals and slots |
|
1069 mechanism. |
|
1070 |
|
1071 |
|
1072 \section1 Using a Selection Model |
|
1073 |
|
1074 The standard view classes provide default selection models that can |
|
1075 be used in most applications. A selection model belonging to one view |
|
1076 can be obtained using the view's |
|
1077 \l{QAbstractItemView::selectionModel()}{selectionModel()} function, |
|
1078 and shared between many views with |
|
1079 \l{QAbstractItemView::setSelectionModel()}{setSelectionModel()}, |
|
1080 so the construction of new selection models is generally not required. |
|
1081 |
|
1082 A selection is created by specifying a model, and a pair of model |
|
1083 indexes to a \l QItemSelection. This uses the indexes to refer to items |
|
1084 in the given model, and interprets them as the top-left and bottom-right |
|
1085 items in a block of selected items. |
|
1086 To apply the selection to items in a model requires the selection to be |
|
1087 submitted to a selection model; this can be achieved in a number of ways, |
|
1088 each having a different effect on the selections already present in the |
|
1089 selection model. |
|
1090 |
|
1091 |
|
1092 \section2 Selecting Items |
|
1093 |
|
1094 To demonstrate some of the principal features of selections, we construct |
|
1095 an instance of a custom table model with 32 items in total, and open a |
|
1096 table view onto its data: |
|
1097 |
|
1098 \snippet doc/src/snippets/itemselection/main.cpp 0 |
|
1099 |
|
1100 The table view's default selection model is retrieved for later use. |
|
1101 We do not modify any items in the model, but instead select a few |
|
1102 items that the view will display at the top-left of the table. To do |
|
1103 this, we need to retrieve the model indexes corresponding to the |
|
1104 top-left and bottom-right items in the region to be selected: |
|
1105 |
|
1106 \snippet doc/src/snippets/itemselection/main.cpp 1 |
|
1107 |
|
1108 To select these items in the model, and see the corresponding change |
|
1109 in the table view, we need to construct a selection object then apply |
|
1110 it to the selection model: |
|
1111 |
|
1112 \snippet doc/src/snippets/itemselection/main.cpp 2 |
|
1113 |
|
1114 The selection is applied to the selection model using a command |
|
1115 defined by a combination of |
|
1116 \l{QItemSelectionModel::SelectionFlag}{selection flags}. |
|
1117 In this case, the flags used cause the items recorded in the |
|
1118 selection object to be included in the selection model, regardless |
|
1119 of their previous state. The resulting selection is shown by the view. |
|
1120 |
|
1121 \img selected-items1.png |
|
1122 |
|
1123 The selection of items can be modified using various operations that |
|
1124 are defined by the selection flags. The selection that results from |
|
1125 these operations may have a complex structure, but will be represented |
|
1126 efficiently by the selection model. The use of different selection |
|
1127 flags to manipulate the selected items is described when we examine |
|
1128 how to update a selection. |
|
1129 |
|
1130 \section2 Reading the Selection State |
|
1131 |
|
1132 The model indexes stored in the selection model can be read using |
|
1133 the \l{QItemSelectionModel::selectedIndexes()}{selectedIndexes()} |
|
1134 function. This returns an unsorted list of model indexes that we can |
|
1135 iterate over as long as we know which model they are for: |
|
1136 |
|
1137 \snippet doc/src/snippets/reading-selections/window.cpp 0 |
|
1138 |
|
1139 The above code uses Qt's convenient \l{Generic Containers}{foreach |
|
1140 keyword} to iterate over, and modify, the items corresponding to the |
|
1141 indexes returned by the selection model. |
|
1142 |
|
1143 The selection model emits signals to indicate changes in the |
|
1144 selection. These notify other components about changes to both the |
|
1145 selection as a whole and the currently focused item in the item |
|
1146 model. We can connect the |
|
1147 \l{QItemSelectionModel::selectionChanged()}{selectionChanged()} |
|
1148 signal to a slot, and examine the items in the model that are selected or |
|
1149 deselected when the selection changes. The slot is called with two |
|
1150 \l{QItemSelection} objects: one contains a list of indexes that |
|
1151 correspond to newly selected items; the other contains indexes that |
|
1152 correspond to newly deselected items. |
|
1153 |
|
1154 In the following code, we provide a slot that receives the |
|
1155 \l{QItemSelectionModel::selectionChanged()}{selectionChanged()} |
|
1156 signal, fills in the selected items with |
|
1157 a string, and clears the contents of the deselected items. |
|
1158 |
|
1159 \snippet doc/src/snippets/updating-selections/window.cpp 0 |
|
1160 \snippet doc/src/snippets/updating-selections/window.cpp 1 |
|
1161 \codeline |
|
1162 \snippet doc/src/snippets/updating-selections/window.cpp 2 |
|
1163 |
|
1164 We can keep track of the currently focused item by connecting the |
|
1165 \l{QItemSelectionModel::currentChanged()}{currentChanged()} signal |
|
1166 to a slot that is called with two model indexes. These correspond to |
|
1167 the previously focused item, and the currently focused item. |
|
1168 |
|
1169 In the following code, we provide a slot that receives the |
|
1170 \l{QItemSelectionModel::currentChanged()}{currentChanged()} signal, |
|
1171 and uses the information provided to update the status bar of a |
|
1172 \l QMainWindow: |
|
1173 |
|
1174 \snippet doc/src/snippets/updating-selections/window.cpp 3 |
|
1175 |
|
1176 Monitoring selections made by the user is straightforward with these |
|
1177 signals, but we can also update the selection model directly. |
|
1178 |
|
1179 \section2 Updating a Selection |
|
1180 |
|
1181 Selection commands are provided by a combination of selection flags, |
|
1182 defined by \l{QItemSelectionModel::SelectionFlag}. |
|
1183 Each selection flag tells the selection model how to update its |
|
1184 internal record of selected items when either of the |
|
1185 \l{QItemSelection::select()}{select()} functions are called. |
|
1186 The most commonly used flag is the |
|
1187 \l{QItemSelectionModel::SelectionFlag}{Select} flag |
|
1188 which instructs the selection model to record the specified items as |
|
1189 being selected. The |
|
1190 \l{QItemSelectionModel::SelectionFlag}{Toggle} flag causes the |
|
1191 selection model to invert the state of the specified items, |
|
1192 selecting any deselected items given, and deselecting any currently |
|
1193 selected items. The \l{QItemSelectionModel::SelectionFlag}{Deselect} |
|
1194 flag deselects all the specified items. |
|
1195 |
|
1196 Individual items in the selection model are updated by creating a |
|
1197 selection of items, and applying them to the selection model. In the |
|
1198 following code, we apply a second selection of items to the table |
|
1199 model shown above, using the |
|
1200 \l{QItemSelectionModel::SelectionFlag}{Toggle} command to invert the |
|
1201 selection state of the items given. |
|
1202 |
|
1203 \snippet doc/src/snippets/itemselection/main.cpp 3 |
|
1204 |
|
1205 The results of this operation are displayed in the table view, |
|
1206 providing a convenient way of visualizing what we have achieved: |
|
1207 |
|
1208 \img selected-items2.png |
|
1209 |
|
1210 By default, the selection commands only operate on the individual |
|
1211 items specified by the model indexes. However, the flag used to |
|
1212 describe the selection command can be combined with additional flags |
|
1213 to change entire rows and columns. For example if you call |
|
1214 \l{QItemSelectionModel::select()}{select()} with only one index, but |
|
1215 with a command that is a combination of |
|
1216 \l{QItemSelectionModel::SelectionFlag}{Select} and |
|
1217 \l{QItemSelectionModel::SelectionFlag}{Rows}, the |
|
1218 entire row containing the item referred to will be selected. |
|
1219 The following code demonstrates the use of the |
|
1220 \l{QItemSelectionModel::SelectionFlag}{Rows} and |
|
1221 \l{QItemSelectionModel::SelectionFlag}{Columns} flags: |
|
1222 |
|
1223 \snippet doc/src/snippets/itemselection/main.cpp 4 |
|
1224 |
|
1225 Although only four indexes are supplied to the selection model, the |
|
1226 use of the |
|
1227 \l{QItemSelectionModel::SelectionFlag}{Columns} and |
|
1228 \l{QItemSelectionModel::SelectionFlag}{Rows} selection flags means |
|
1229 that two columns and two rows are selected. The following image shows |
|
1230 the result of these two selections: |
|
1231 |
|
1232 \img selected-items3.png |
|
1233 |
|
1234 The commands performed on the example model have all involved |
|
1235 accumulating a selection of items in the model. It is also possible |
|
1236 to clear the selection, or to replace the current selection with |
|
1237 a new one. |
|
1238 |
|
1239 To replace the current selection with a new selection, combine |
|
1240 the other selection flags with the |
|
1241 \l{QItemSelectionModel::SelectionFlag}{Current} flag. A command using |
|
1242 this flag instructs the selection model to replace its current collection |
|
1243 of model indexes with those specified in a call to |
|
1244 \l{QItemSelectionModel::select()}{select()}. |
|
1245 To clear all selections before you start adding new ones, |
|
1246 combine the other selection flags with the |
|
1247 \l{QItemSelectionModel::SelectionFlag}{Clear} flag. This |
|
1248 has the effect of resetting the selection model's collection of model |
|
1249 indexes. |
|
1250 |
|
1251 \section2 Selecting All Items in a Model |
|
1252 |
|
1253 To select all items in a model, it is necessary to create a |
|
1254 selection for each level of the model that covers all items in that |
|
1255 level. We do this by retrieving the indexes corresponding to the |
|
1256 top-left and bottom-right items with a given parent index: |
|
1257 |
|
1258 \snippet doc/src/snippets/reading-selections/window.cpp 2 |
|
1259 |
|
1260 A selection is constructed with these indexes and the model. The |
|
1261 corresponding items are then selected in the selection model: |
|
1262 |
|
1263 \snippet doc/src/snippets/reading-selections/window.cpp 3 |
|
1264 |
|
1265 This needs to be performed for all levels in the model. |
|
1266 For top-level items, we would define the parent index in the usual way: |
|
1267 |
|
1268 \snippet doc/src/snippets/reading-selections/window.cpp 1 |
|
1269 |
|
1270 For hierarchical models, the |
|
1271 \l{QAbstractItemModel::hasChildren()}{hasChildren()} function is used to |
|
1272 determine whether any given item is the parent of another level of |
|
1273 items. |
|
1274 */ |
|
1275 |
|
1276 /*! |
|
1277 \page model-view-creating-models.html |
|
1278 \contentspage model-view-programming.html Contents |
|
1279 \previouspage Model Classes |
|
1280 \nextpage View Classes |
|
1281 |
|
1282 \title Creating New Models |
|
1283 |
|
1284 \tableofcontents |
|
1285 |
|
1286 \section1 Introduction |
|
1287 |
|
1288 The separation of functionality between the model/view components allows |
|
1289 models to be created that can take advantage of existing views. This |
|
1290 approach lets us present data from a variety of sources using standard |
|
1291 graphical user interface components, such as QListView, QTableView, and |
|
1292 QTreeView. |
|
1293 |
|
1294 The QAbstractItemModel class provides an interface that is flexible |
|
1295 enough to support data sources that arrange information in hierarchical |
|
1296 structures, allowing for the possibility that data will be inserted, |
|
1297 removed, modified, or sorted in some way. It also provides support for |
|
1298 drag and drop operations. |
|
1299 |
|
1300 The QAbstractListModel and QAbstractTableModel classes provide support |
|
1301 for interfaces to simpler non-hierarchical data structures, and are |
|
1302 easier to use as a starting point for simple list and table models. |
|
1303 |
|
1304 In this chapter, we create a simple read-only model to explore |
|
1305 the basic principles of the model/view architecture. Later in this |
|
1306 chapter, we will adapt this simple model so that items can be modified |
|
1307 by the user. |
|
1308 |
|
1309 For an example of a more complex model, see the |
|
1310 \l{itemviews/simpletreemodel}{Simple Tree Model} example. |
|
1311 |
|
1312 The requirements of QAbstractItemModel subclasses is described in more |
|
1313 detail in the \l{Model Subclassing Reference} document. |
|
1314 |
|
1315 \section1 Designing a Model |
|
1316 |
|
1317 When creating a new model for an existing data structure, it is important |
|
1318 to consider which type of model should be used to provide an interface |
|
1319 onto the data. If the data structure can be represented as a |
|
1320 list or table of items, you can subclass QAbstractListModel or |
|
1321 QAbstractTableModel since these classes provide suitable default |
|
1322 implementations for many functions. |
|
1323 |
|
1324 However, if the underlying data structure can only be represented by a |
|
1325 hierarchical tree structure, it is necessary to subclass |
|
1326 QAbstractItemModel. This approach is taken in the |
|
1327 \l{itemviews/simpletreemodel}{Simple Tree Model} example. |
|
1328 |
|
1329 In this chapter, we will implement a simple model based on a list of |
|
1330 strings, so the QAbstractListModel provides an ideal base class on |
|
1331 which to build. |
|
1332 |
|
1333 Whatever form the underlying data structure takes, it is |
|
1334 usually a good idea to supplement the standard QAbstractItemModel API |
|
1335 in specialized models with one that allows more natural access to the |
|
1336 underlying data structure. This makes it easier to populate the model |
|
1337 with data, yet still enables other general model/view components to |
|
1338 interact with it using the standard API. The model described below |
|
1339 provides a custom constructor for just this purpose. |
|
1340 |
|
1341 \section1 A Read-Only Example Model |
|
1342 |
|
1343 The model implemented here is a simple, non-hierarchical, read-only data |
|
1344 model based on the standard QStringListModel class. It has a \l QStringList |
|
1345 as its internal data source, and implements only what is needed to make a |
|
1346 functioning model. To make the implementation easier, we subclass |
|
1347 \l QAbstractListModel because it defines sensible default behavior for list |
|
1348 models, and it exposes a simpler interface than the \l QAbstractItemModel |
|
1349 class. |
|
1350 |
|
1351 When implementing a model it is important to remember that |
|
1352 \l QAbstractItemModel does not store any data itself, it merely |
|
1353 presents an interface that the views use to access the data. |
|
1354 For a minimal read-only model it is only necessary to implement a few |
|
1355 functions as there are default implementations for most of the |
|
1356 interface. The class declaration is as follows: |
|
1357 |
|
1358 |
|
1359 \snippet doc/src/snippets/stringlistmodel/model.h 0 |
|
1360 \snippet doc/src/snippets/stringlistmodel/model.h 1 |
|
1361 \codeline |
|
1362 \snippet doc/src/snippets/stringlistmodel/model.h 5 |
|
1363 |
|
1364 Apart from the model's constructor, we only need to implement two |
|
1365 functions: \l{QAbstractItemModel::rowCount()}{rowCount()} returns the |
|
1366 number of rows in the model and \l{QAbstractItemModel::data()}{data()} |
|
1367 returns an item of data corresponding to a specified model index. |
|
1368 |
|
1369 Well behaved models also implement |
|
1370 \l{QAbstractItemModel::headerData()}{headerData()} to give tree and |
|
1371 table views something to display in their headers. |
|
1372 |
|
1373 Note that this is a non-hierarchical model, so we don't have to worry |
|
1374 about the parent-child relationships. If our model was hierarchical, we |
|
1375 would also have to implement the |
|
1376 \l{QAbstractItemModel::index()}{index()} and |
|
1377 \l{QAbstractItemModel::parent()}{parent()} functions. |
|
1378 |
|
1379 The list of strings is stored internally in the \c stringList private |
|
1380 member variable. |
|
1381 |
|
1382 \section2 Dimensions of The Model |
|
1383 |
|
1384 We want the number of rows in the model to be the same as the number of |
|
1385 strings in the string list. We implement the |
|
1386 \l{QAbstractItemModel::rowCount()}{rowCount()} function with this in |
|
1387 mind: |
|
1388 |
|
1389 \snippet doc/src/snippets/stringlistmodel/model.cpp 0 |
|
1390 |
|
1391 Since the model is non-hierarchical, we can safely ignore the model index |
|
1392 corresponding to the parent item. By default, models derived from |
|
1393 QAbstractListModel only contain one column, so we do not need to |
|
1394 reimplement the \l{QAbstractItemModel::columnCount()}{columnCount()} |
|
1395 function. |
|
1396 |
|
1397 \section2 Model Headers and Data |
|
1398 |
|
1399 For items in the view, we want to return the strings in the string list. |
|
1400 The \l{QAbstractItemModel::data()}{data()} function is responsible for |
|
1401 returning the item of data that corresponds to the index argument: |
|
1402 |
|
1403 \snippet doc/src/snippets/stringlistmodel/model.cpp 1-data-read-only |
|
1404 |
|
1405 We only return a valid QVariant if the model index supplied is valid, |
|
1406 the row number is within the range of items in the string list, and the |
|
1407 requested role is one that we support. |
|
1408 |
|
1409 Some views, such as QTreeView and QTableView, are able to display headers |
|
1410 along with the item data. If our model is displayed in a view with headers, |
|
1411 we want the headers to show the row and column numbers. We can provide |
|
1412 information about the headers by subclassing the |
|
1413 \l{QAbstractItemModel::headerData()}{headerData()} function: |
|
1414 |
|
1415 \snippet doc/src/snippets/stringlistmodel/model.cpp 2 |
|
1416 |
|
1417 Again, we return a valid QVariant only if the role is one that we support. |
|
1418 The orientation of the header is also taken into account when deciding the |
|
1419 exact data to return. |
|
1420 |
|
1421 Not all views display headers with the item data, and those that do may |
|
1422 be configured to hide them. Nonetheless, it is recommended that you |
|
1423 implement the \l{QAbstractItemModel::headerData()}{headerData()} function |
|
1424 to provide relevant information about the data provided by the model. |
|
1425 |
|
1426 An item can have several roles, giving out different data depending on the |
|
1427 role specified. The items in our model only have one role, |
|
1428 \l{Qt::ItemDataRole}{DisplayRole}, so we return the data |
|
1429 for items irrespective of the role specified. |
|
1430 However, we could reuse the data we provide for the |
|
1431 \l{Qt::ItemDataRole}{DisplayRole} in |
|
1432 other roles, such as the |
|
1433 \l{Qt::ItemDataRole}{ToolTipRole} that views can use to |
|
1434 display information about items in a tooltip. |
|
1435 |
|
1436 \section1 An Editable Model |
|
1437 |
|
1438 The read-only model shows how simple choices could be presented to the |
|
1439 user but, for many applications, an editable list model is much more |
|
1440 useful. We can modify the read-only model to make the items editable |
|
1441 by changing the data() function we implemented for read-only, and |
|
1442 by implementing two extra functions: |
|
1443 \l{QAbstractItemModel::flags()}{flags()} and |
|
1444 \l{QAbstractItemModel::setData()}{setData()}. |
|
1445 The following function declarations are added to the class definition: |
|
1446 |
|
1447 \snippet doc/src/snippets/stringlistmodel/model.h 2 |
|
1448 \snippet doc/src/snippets/stringlistmodel/model.h 3 |
|
1449 |
|
1450 \section2 Making the Model Editable |
|
1451 |
|
1452 A delegate checks whether an item is editable before creating an |
|
1453 editor. The model must let the delegate know that its items are |
|
1454 editable. We do this by returning the correct flags for each item in |
|
1455 the model; in this case, we enable all items and make them both |
|
1456 selectable and editable: |
|
1457 |
|
1458 \snippet doc/src/snippets/stringlistmodel/model.cpp 3 |
|
1459 |
|
1460 Note that we do not have to know how the delegate performs the actual |
|
1461 editing process. We only have to provide a way for the delegate to set the |
|
1462 data in the model. This is achieved through the |
|
1463 \l{QAbstractItemModel::setData()}{setData()} function: |
|
1464 |
|
1465 \snippet doc/src/snippets/stringlistmodel/model.cpp 4 |
|
1466 \snippet doc/src/snippets/stringlistmodel/model.cpp 5 |
|
1467 |
|
1468 In this model, the item in the string list that corresponds to the |
|
1469 model index is replaced by the value provided. However, before we |
|
1470 can modify the string list, we must make sure that the index is |
|
1471 valid, the item is of the correct type, and that the role is |
|
1472 supported. By convention, we insist that the role is the |
|
1473 \l{Qt::ItemDataRole}{EditRole} since this is the role used by the |
|
1474 standard item delegate. For boolean values, however, you can use |
|
1475 Qt::CheckStateRole and set the Qt::ItemIsUserCheckable flag; a |
|
1476 checkbox will then be used for editing the value. The underlying |
|
1477 data in this model is the same for all roles, so this detail just |
|
1478 makes it easier to integrate the model with standard components. |
|
1479 |
|
1480 When the data has been set, the model must let the views know that some |
|
1481 data has changed. This is done by emitting the |
|
1482 \l{QAbstractItemModel::dataChanged()}{dataChanged()} signal. Since only |
|
1483 one item of data has changed, the range of items specified in the signal |
|
1484 is limited to just one model index. |
|
1485 |
|
1486 Also the data() function needs to be changed to add the Qt::EditRole test: |
|
1487 |
|
1488 \snippet doc/src/snippets/stringlistmodel/model.cpp 1 |
|
1489 |
|
1490 \section2 Inserting and Removing Rows |
|
1491 |
|
1492 It is possible to change the number of rows and columns in a model. In the |
|
1493 string list model it only makes sense to change the number of rows, so we |
|
1494 only reimplement the functions for inserting and removing rows. These are |
|
1495 declared in the class definition: |
|
1496 |
|
1497 \snippet doc/src/snippets/stringlistmodel/model.h 4 |
|
1498 |
|
1499 Since rows in this model correspond to strings in a list, the |
|
1500 \c insertRows() function inserts a number of empty strings into the string |
|
1501 list before the specified position. The number of strings inserted is |
|
1502 equivalent to the number of rows specified. |
|
1503 |
|
1504 The parent index is normally used to determine where in the model the |
|
1505 rows should be added. In this case, we only have a single top-level list |
|
1506 of strings, so we just insert empty strings into that list. |
|
1507 |
|
1508 \snippet doc/src/snippets/stringlistmodel/model.cpp 6 |
|
1509 \snippet doc/src/snippets/stringlistmodel/model.cpp 7 |
|
1510 |
|
1511 The model first calls the |
|
1512 \l{QAbstractItemModel::beginInsertRows()}{beginInsertRows()} function to |
|
1513 inform other components that the number of rows is about to change. The |
|
1514 function specifies the row numbers of the first and last new rows to be |
|
1515 inserted, and the model index for their parent item. After changing the |
|
1516 string list, it calls |
|
1517 \l{QAbstractItemModel::endInsertRows()}{endInsertRows()} to complete the |
|
1518 operation and inform other components that the dimensions of the model |
|
1519 have changed, returning true to indicate success. |
|
1520 |
|
1521 The function to remove rows from the model is also simple to write. |
|
1522 The rows to be removed from the model are specified by the position and |
|
1523 the number of rows given. |
|
1524 We ignore the parent index to simplify our implementation, and just |
|
1525 remove the corresponding items from the string list. |
|
1526 |
|
1527 \snippet doc/src/snippets/stringlistmodel/model.cpp 8 |
|
1528 \snippet doc/src/snippets/stringlistmodel/model.cpp 9 |
|
1529 |
|
1530 The \l{QAbstractItemModel::beginRemoveRows()}{beginRemoveRows()} function |
|
1531 is always called before any underlying data is removed, and specifies the |
|
1532 first and last rows to be removed. This allows other components to access |
|
1533 the data before it becomes unavailable. |
|
1534 After the rows have been removed, the model emits |
|
1535 \l{QAbstractItemModel::endRemoveRows()}{endRemoveRows()} to finish the |
|
1536 operation and let other components know that the dimensions of the model |
|
1537 have changed. |
|
1538 |
|
1539 \section1 Next Steps |
|
1540 |
|
1541 We can display the data provided by this model, or any other model, using |
|
1542 the \l QListView class to present the model's items in the form of a vertical |
|
1543 list. |
|
1544 For the string list model, this view also provides a default editor so that |
|
1545 the items can be manipulated. We examine the possibilities made available by |
|
1546 the standard view classes in the chapter on \l{View Classes}. |
|
1547 |
|
1548 The \l{Model Subclassing Reference} document discusses the requirements of |
|
1549 QAbstractItemModel subclasses in more detail, and provides a guide to the |
|
1550 virtual functions that must be implemented to enable various features in |
|
1551 different types of models. |
|
1552 */ |
|
1553 |
|
1554 /*! |
|
1555 \page model-view-convenience.html |
|
1556 \contentspage model-view-programming.html Contents |
|
1557 \previouspage Delegate Classes |
|
1558 \nextpage Using Drag and Drop with Item Views |
|
1559 |
|
1560 \title Item View Convenience Classes |
|
1561 |
|
1562 \tableofcontents |
|
1563 |
|
1564 \section1 Overview |
|
1565 |
|
1566 Alongside the model/view classes, Qt 4 also includes standard widgets to |
|
1567 provide classic item-based container widgets. These behave in a similar |
|
1568 way to the item view classes in Qt 3, but have been rewritten to use the |
|
1569 underlying model/view framework for performance and maintainability. The |
|
1570 old item view classes are still available in the compatibility library |
|
1571 (see the \l{porting4.html}{Porting Guide} for more information). |
|
1572 |
|
1573 The item-based widgets have been given names which reflect their uses: |
|
1574 \c QListWidget provides a list of items, \c QTreeWidget displays a |
|
1575 multi-level tree structure, and \c QTableWidget provides a table of cell |
|
1576 items. Each class inherits the behavior of the \c QAbstractItemView |
|
1577 class which implements common behavior for item selection and header |
|
1578 management. |
|
1579 |
|
1580 \section1 List Widgets |
|
1581 |
|
1582 Single level lists of items are typically displayed using a \c QListWidget |
|
1583 and a number of \c{QListWidgetItem}s. A list widget is constructed in the |
|
1584 same way as any other widget: |
|
1585 |
|
1586 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 0 |
|
1587 |
|
1588 List items can be added directly to the list widget when they are |
|
1589 constructed: |
|
1590 |
|
1591 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 3 |
|
1592 |
|
1593 They can also be constructed without a parent list widget and added to |
|
1594 a list at some later time: |
|
1595 |
|
1596 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 6 |
|
1597 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 7 |
|
1598 |
|
1599 Each item in a list can display a text label and an icon. The colors |
|
1600 and font used to render the text can be changed to provide a customized |
|
1601 appearance for items. Tooltips, status tips, and "What's |
|
1602 This?" help are all easily configured to ensure that the list is properly |
|
1603 integrated into the application. |
|
1604 |
|
1605 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 8 |
|
1606 |
|
1607 By default, items in a list are presented in the order of their creation. |
|
1608 Lists of items can be sorted according to the criteria given in |
|
1609 \l{Qt::SortOrder} to produce a list of items that is sorted in forward or |
|
1610 reverse alphabetical order: |
|
1611 |
|
1612 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 4 |
|
1613 \snippet doc/src/snippets/qlistwidget-using/mainwindow.cpp 5 |
|
1614 |
|
1615 |
|
1616 \section1 Tree Widgets |
|
1617 |
|
1618 Trees or hierarchical lists of items are provided by the \c QTreeWidget |
|
1619 and \c QTreeWidgetItem classes. Each item in the tree widget can have |
|
1620 child items of its own, and can display a number of columns of |
|
1621 information. Tree widgets are created just like any other widget: |
|
1622 |
|
1623 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 0 |
|
1624 |
|
1625 Before items can be added to the tree widget, the number of columns must |
|
1626 be set. For example, we could define two columns, and create a header |
|
1627 to provide labels at the top of each column: |
|
1628 |
|
1629 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 1 |
|
1630 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 2 |
|
1631 |
|
1632 The easiest way to set up the labels for each section is to supply a string |
|
1633 list. For more sophisticated headers, you can construct a tree item, |
|
1634 decorate it as you wish, and use that as the tree widget's header. |
|
1635 |
|
1636 Top-level items in the tree widget are constructed with the tree widget as |
|
1637 their parent widget. They can be inserted in an arbitrary order, or you |
|
1638 can ensure that they are listed in a particular order by specifying the |
|
1639 previous item when constructing each item: |
|
1640 |
|
1641 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 3 |
|
1642 \codeline |
|
1643 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 4 |
|
1644 |
|
1645 Tree widgets deal with top-level items slightly differently to other |
|
1646 items from deeper within the tree. Items can be removed from the top |
|
1647 level of the tree by calling the tree widget's |
|
1648 \l{QTreeWidget::takeTopLevelItem()}{takeTopLevelItem()} function, but |
|
1649 items from lower levels are removed by calling their parent item's |
|
1650 \l{QTreeWidgetItem::takeChild()}{takeChild()} function. |
|
1651 Items are inserted in the top level of the tree with the |
|
1652 \l{QTreeWidget::insertTopLevelItem()}{insertTopLevelItem()} function. |
|
1653 At lower levels in the tree, the parent item's |
|
1654 \l{QTreeWidgetItem::insertChild()}{insertChild()} function is used. |
|
1655 |
|
1656 It is easy to move items around between the top level and lower levels |
|
1657 in the tree. We just need to check whether the items are top-level items |
|
1658 or not, and this information is supplied by each item's \c parent() |
|
1659 function. For example, we can remove the current item in the tree widget |
|
1660 regardless of its location: |
|
1661 |
|
1662 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 10 |
|
1663 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 11 |
|
1664 |
|
1665 Inserting the item somewhere else in the tree widget follows the same |
|
1666 pattern: |
|
1667 |
|
1668 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 8 |
|
1669 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 9 |
|
1670 |
|
1671 |
|
1672 \section1 Table Widgets |
|
1673 |
|
1674 Tables of items similar to those found in spreadsheet applications |
|
1675 are constructed with the \c QTableWidget and \c QTableWidgetItem. These |
|
1676 provide a scrolling table widget with headers and items to use within it. |
|
1677 |
|
1678 Tables can be created with a set number of rows and columns, or these |
|
1679 can be added to an unsized table as they are needed. |
|
1680 |
|
1681 \snippet doc/src/snippets/qtablewidget-using/mainwindow.h 0 |
|
1682 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 0 |
|
1683 |
|
1684 Items are constructed outside the table before being added to the table |
|
1685 at the required location: |
|
1686 |
|
1687 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 3 |
|
1688 |
|
1689 Horizontal and vertical headers can be added to the table by constructing |
|
1690 items outside the table and using them as headers: |
|
1691 |
|
1692 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 1 |
|
1693 |
|
1694 Note that the rows and columns in the table begin at zero. |
|
1695 |
|
1696 \section1 Common Features |
|
1697 |
|
1698 There are a number of item-based features common to each of the |
|
1699 convenience classes that are available through the same interfaces |
|
1700 in each class. We present these in the following sections with some |
|
1701 examples for different widgets. |
|
1702 Look at the list of \l{Model/View Classes} for each of the widgets |
|
1703 for more details about the use of each function used. |
|
1704 |
|
1705 \section2 Hidden Items |
|
1706 |
|
1707 It is sometimes useful to be able to hide items in an item view widget |
|
1708 rather than remove them. Items for all of the above widgets can be |
|
1709 hidden and later shown again. You can determine whether an item is hidden |
|
1710 by calling the isItemHidden() function, and items can be hidden with |
|
1711 \c setItemHidden(). |
|
1712 |
|
1713 Since this operation is item-based, the same function is available for |
|
1714 all three convenience classes. |
|
1715 |
|
1716 \section2 Selections |
|
1717 |
|
1718 The way items are selected is controlled by the widget's selection mode |
|
1719 (\l{QAbstractItemView::SelectionMode}). |
|
1720 This property controls whether the user can select one or many items and, |
|
1721 in many-item selections, whether the selection must be a continuous range |
|
1722 of items. The selection mode works in the same way for all of the |
|
1723 above widgets. |
|
1724 |
|
1725 \table |
|
1726 \row |
|
1727 \i \img selection-single.png |
|
1728 \i \bold{Single item selections:} |
|
1729 Where the user needs to choose a single item from a widget, the |
|
1730 default \c SingleSelection mode is most suitable. In this mode, the |
|
1731 current item and the selected item are the same. |
|
1732 |
|
1733 \row |
|
1734 \i \img selection-multi.png |
|
1735 \i \bold{Multi-item selections:} |
|
1736 In this mode, the user can toggle the selection state of any item in the |
|
1737 widget without changing the existing selection, much like the way |
|
1738 non-exclusive checkboxes can be toggled independently. |
|
1739 |
|
1740 \row |
|
1741 \i \img selection-extended.png |
|
1742 \i \bold{Extended selections:} |
|
1743 Widgets that often require many adjacent items to be selected, such |
|
1744 as those found in spreadsheets, require the \c ExtendedSelection mode. |
|
1745 In this mode, continuous ranges of items in the widget can be selected |
|
1746 with both the mouse and the keyboard. |
|
1747 Complex selections, involving many items that are not adjacent to other |
|
1748 selected items in the widget, can also be created if modifier keys are |
|
1749 used. |
|
1750 |
|
1751 If the user selects an item without using a modifier key, the existing |
|
1752 selection is cleared. |
|
1753 \endtable |
|
1754 |
|
1755 The selected items in a widget are read using the \c selectedItems() |
|
1756 function, providing a list of relevant items that can be iterated over. |
|
1757 For example, we can find the sum of all the numeric values within a |
|
1758 list of selected items with the following code: |
|
1759 |
|
1760 \snippet doc/src/snippets/qtablewidget-using/mainwindow.cpp 4 |
|
1761 |
|
1762 Note that for the single selection mode, the current item will be in |
|
1763 the selection. In the multi-selection and extended selection modes, the |
|
1764 current item may not lie within the selection, depending on the way the |
|
1765 user formed the selection. |
|
1766 |
|
1767 \section2 Searching |
|
1768 |
|
1769 It is often useful to be able to find items within an item view widget, |
|
1770 either as a developer or as a service to present to users. All three |
|
1771 item view convenience classes provide a common \c findItems() function |
|
1772 to make this as consistent and simple as possible. |
|
1773 |
|
1774 Items are searched for by the text that they contain according to |
|
1775 criteria specified by a selection of values from Qt::MatchFlags. |
|
1776 We can obtain a list of matching items with the \c findItems() |
|
1777 function: |
|
1778 |
|
1779 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 6 |
|
1780 \snippet doc/src/snippets/qtreewidget-using/mainwindow.cpp 7 |
|
1781 |
|
1782 The above code causes items in a tree widget to be selected if they |
|
1783 contain the text given in the search string. This pattern can also be |
|
1784 used in the list and table widgets. |
|
1785 */ |
|
1786 |
|
1787 /*! |
|
1788 \page model-view-dnd.html |
|
1789 \contentspage model-view-programming.html Contents |
|
1790 \previouspage Item View Convenience Classes |
|
1791 \nextpage Proxy Models |
|
1792 |
|
1793 \title Using Drag and Drop with Item Views |
|
1794 |
|
1795 \tableofcontents |
|
1796 |
|
1797 \section1 Overview |
|
1798 |
|
1799 Qt's drag and drop infrastructure is fully supported by the model/view framework. |
|
1800 Items in lists, tables, and trees can be dragged within the views, and data can be |
|
1801 imported and exported as MIME-encoded data. |
|
1802 |
|
1803 The standard views automatically support internal drag and drop, where items are |
|
1804 moved around to change the order in which they are displayed. By default, drag and |
|
1805 drop is not enabled for these views because they are configured for the simplest, |
|
1806 most common uses. To allow items to be dragged around, certain properties of the |
|
1807 view need to be enabled, and the items themselves must also allow dragging to occur. |
|
1808 |
|
1809 The requirements for a model that only allows items to be exported from a |
|
1810 view, and which does not allow data to be dropped into it, are fewer than |
|
1811 those for a fully-enabled drag and drop model. |
|
1812 |
|
1813 See also the \l{Model Subclassing Reference} for more information about |
|
1814 enabling drag and drop support in new models. |
|
1815 |
|
1816 \section1 Using Convenience Views |
|
1817 |
|
1818 Each of the types of item used with QListWidget, QTableWidget, and QTreeWidget |
|
1819 is configured to use a different set of flags by default. For example, each |
|
1820 QListWidgetItem or QTreeWidgetItem is initially enabled, checkable, selectable, |
|
1821 and can be used as the source of a drag and drop operation; each QTableWidgetItem |
|
1822 can also be edited and used as the target of a drag and drop operation. |
|
1823 |
|
1824 Although all of the standard items have one or both flags set for drag and drop, |
|
1825 you generally need to set various properties in the view itself to take advantage |
|
1826 of the built-in support for drag and drop: |
|
1827 |
|
1828 \list |
|
1829 \o To enable item dragging, set the view's |
|
1830 \l{QAbstractItemView::dragEnabled}{dragEnabled} property to \c true. |
|
1831 \o To allow the user to drop either internal or external items within the view, |
|
1832 set the view's \l{QAbstractScrollArea::}{viewport()}'s |
|
1833 \l{QWidget::acceptDrops}{acceptDrops} property to \c true. |
|
1834 \o To show the user where the item currently being dragged will be placed if |
|
1835 dropped, set the view's \l{QAbstractItemView::showDropIndicator}{showDropIndicator} |
|
1836 property. This provides the user with continuously updating information about |
|
1837 item placement within the view. |
|
1838 \endlist |
|
1839 |
|
1840 For example, we can enable drag and drop in a list widget with the following lines |
|
1841 of code: |
|
1842 |
|
1843 \snippet doc/src/snippets/qlistwidget-dnd/mainwindow.cpp 0 |
|
1844 |
|
1845 The result is a list widget which allows the items to be copied |
|
1846 around within the view, and even lets the user drag items between |
|
1847 views containing the same type of data. In both situations, the |
|
1848 items are copied rather than moved. |
|
1849 |
|
1850 To enable the user to move the items around within the view, we |
|
1851 must set the list widget's \l {QAbstractItemView::}{dragDropMode}: |
|
1852 |
|
1853 \snippet doc/src/snippets/qlistwidget-dnd/mainwindow.cpp 1 |
|
1854 |
|
1855 \section1 Using Model/View Classes |
|
1856 |
|
1857 Setting up a view for drag and drop follows the same pattern used with the |
|
1858 convenience views. For example, a QListView can be set up in the same way as a |
|
1859 QListWidget: |
|
1860 |
|
1861 \snippet doc/src/snippets/qlistview-dnd/mainwindow.cpp 0 |
|
1862 |
|
1863 Since access to the data displayed by the view is controlled by a model, the |
|
1864 model used also has to provide support for drag and drop operations. The |
|
1865 actions supported by a model can be specified by reimplementing the |
|
1866 QAbstractItemModel::supportedDropActions() function. For example, copy and |
|
1867 move operations are enabled with the following code: |
|
1868 |
|
1869 \snippet doc/src/snippets/qlistview-dnd/model.cpp 10 |
|
1870 |
|
1871 Although any combination of values from Qt::DropActions can be given, the |
|
1872 model needs to be written to support them. For example, to allow Qt::MoveAction |
|
1873 to be used properly with a list model, the model must provide an implementation |
|
1874 of QAbstractItemModel::removeRows(), either directly or by inheriting the |
|
1875 implementation from its base class. |
|
1876 |
|
1877 \section2 Enabling Drag and Drop for Items |
|
1878 |
|
1879 Models indicate to views which items can be dragged, and which will accept drops, |
|
1880 by reimplementing the QAbstractItemModel::flags() function to provide suitable |
|
1881 flags. |
|
1882 |
|
1883 For example, a model which provides a simple list based on QAbstractListModel |
|
1884 can enable drag and drop for each of the items by ensuring that the flags |
|
1885 returned contain the \l Qt::ItemIsDragEnabled and \l Qt::ItemIsDropEnabled |
|
1886 values: |
|
1887 |
|
1888 \snippet doc/src/snippets/qlistview-dnd/model.cpp 7 |
|
1889 |
|
1890 Note that items can be dropped into the top level of the model, but dragging is |
|
1891 only enabled for valid items. |
|
1892 |
|
1893 In the above code, since the model is derived from QStringListModel, we |
|
1894 obtain a default set of flags by calling its implementation of the flags() |
|
1895 function. |
|
1896 |
|
1897 \section2 Encoding Exported Data |
|
1898 |
|
1899 When items of data are exported from a model in a drag and drop operation, they |
|
1900 are encoded into an appropriate format corresponding to one or more MIME types. |
|
1901 Models declare the MIME types that they can use to supply items by reimplementing |
|
1902 the QAbstractItemModel::mimeTypes() function, returning a list of standard MIME |
|
1903 types. |
|
1904 |
|
1905 For example, a model that only provides plain text would provide the following |
|
1906 implementation: |
|
1907 |
|
1908 \snippet doc/src/snippets/qlistview-dnd/model.cpp 9 |
|
1909 |
|
1910 The model must also provide code to encode data in the advertised format. This |
|
1911 is achieved by reimplementing the QAbstractItemModel::mimeData() function to |
|
1912 provide a QMimeData object, just as in any other drag and drop operation. |
|
1913 |
|
1914 The following code shows how each item of data, corresponding to a given list of |
|
1915 indexes, is encoded as plain text and stored in a QMimeData object. |
|
1916 |
|
1917 \snippet doc/src/snippets/qlistview-dnd/model.cpp 8 |
|
1918 |
|
1919 Since a list of model indexes is supplied to the function, this approach is general |
|
1920 enough to be used in both hierarchical and non-heirarchical models. |
|
1921 |
|
1922 Note that custom datatypes must be declared as \l{QMetaObject}{meta objects} |
|
1923 and that stream operators must be implemented for them. See the QMetaObject |
|
1924 class description for details. |
|
1925 |
|
1926 \section2 Inserting Dropped Data into a Model |
|
1927 |
|
1928 The way that any given model handles dropped data depends on both its type |
|
1929 (list, table, or tree) and the way its contents is likely to be presented to |
|
1930 the user. Generally, the approach taken to accommodate dropped data should |
|
1931 be the one that most suits the model's underlying data store. |
|
1932 |
|
1933 Different types of model tend to handle dropped data in different ways. List |
|
1934 and table models only provide a flat structure in which items of data are |
|
1935 stored. As a result, they may insert new rows (and columns) when data is |
|
1936 dropped on an existing item in a view, or they may overwrite the item's |
|
1937 contents in the model using some of the data supplied. Tree models are |
|
1938 often able to add child items containing new data to their underlying data |
|
1939 stores, and will therefore behave more predictably as far as the user |
|
1940 is concerned. |
|
1941 |
|
1942 Dropped data is handled by a model's reimplementation of |
|
1943 QAbstractItemModel::dropMimeData(). For example, a model that handles a |
|
1944 simple list of strings can provide an implementation that handles data |
|
1945 dropped onto existing items separately to data dropped into the top level |
|
1946 of the model (i.e., onto an invalid item). |
|
1947 |
|
1948 The model first has to make sure that the operation should be acted on, |
|
1949 the data supplied is in a format that can be used, and that its destination |
|
1950 within the model is valid: |
|
1951 |
|
1952 \snippet doc/src/snippets/qlistview-dnd/model.cpp 0 |
|
1953 \snippet doc/src/snippets/qlistview-dnd/model.cpp 1 |
|
1954 |
|
1955 A simple one column string list model can indicate failure if the data |
|
1956 supplied is not plain text, or if the column number given for the drop |
|
1957 is invalid. |
|
1958 |
|
1959 The data to be inserted into the model is treated differently depending on |
|
1960 whether it is dropped onto an existing item or not. In this simple example, |
|
1961 we want to allow drops between existing items, before the first item in the |
|
1962 list, and after the last item. |
|
1963 |
|
1964 When a drop occurs, the model index corresponding to the parent item will |
|
1965 either be valid, indicating that the drop occurred on an item, or it will |
|
1966 be invalid, indicating that the drop occurred somewhere in the view that |
|
1967 corresponds to top level of the model. |
|
1968 |
|
1969 \snippet doc/src/snippets/qlistview-dnd/model.cpp 2 |
|
1970 |
|
1971 We initially examine the row number supplied to see if we can use it |
|
1972 to insert items into the model, regardless of whether the parent index is |
|
1973 valid or not. |
|
1974 |
|
1975 \snippet doc/src/snippets/qlistview-dnd/model.cpp 3 |
|
1976 |
|
1977 If the parent model index is valid, the drop occurred on an item. In this |
|
1978 simple list model, we find out the row number of the item and use that |
|
1979 value to insert dropped items into the top level of the model. |
|
1980 |
|
1981 \snippet doc/src/snippets/qlistview-dnd/model.cpp 4 |
|
1982 |
|
1983 When a drop occurs elsewhere in the view, and the row number is unusable, |
|
1984 we append items to the top level of the model. |
|
1985 |
|
1986 In hierarchical models, when a drop occurs on an item, it would be better to |
|
1987 insert new items into the model as children of that item. In the simple |
|
1988 example shown here, the model only has one level, so this approach is not |
|
1989 appropriate. |
|
1990 |
|
1991 \section2 Decoding Imported Data |
|
1992 |
|
1993 Each implementation of \l{QAbstractItemModel::dropMimeData()}{dropMimeData()} must |
|
1994 also decode the data and insert it into the model's underlying data structure. |
|
1995 |
|
1996 For a simple string list model, the encoded items can be decoded and streamed |
|
1997 into a QStringList: |
|
1998 |
|
1999 \snippet doc/src/snippets/qlistview-dnd/model.cpp 5 |
|
2000 |
|
2001 The strings can then be inserted into the underlying data store. For consistency, |
|
2002 this can be done through the model's own interface: |
|
2003 |
|
2004 \snippet doc/src/snippets/qlistview-dnd/model.cpp 6 |
|
2005 |
|
2006 Note that the model will typically need to provide implementations of the |
|
2007 QAbstractItemModel::insertRows() and QAbstractItemModel::setData() functions. |
|
2008 |
|
2009 \sa {Item Views Puzzle Example} |
|
2010 */ |
|
2011 |
|
2012 /*! |
|
2013 \page model-view-proxy-models.html |
|
2014 \contentspage model-view-programming.html Contents |
|
2015 \previouspage Using Drag and Drop with Item Views |
|
2016 \nextpage Model Subclassing Reference |
|
2017 |
|
2018 \title Proxy Models |
|
2019 |
|
2020 \tableofcontents |
|
2021 |
|
2022 \section1 Overview |
|
2023 |
|
2024 In the model/view framework, items of data supplied by a single model can be shared |
|
2025 by any number of views, and each of these can possibly represent the same information |
|
2026 in completely different ways. |
|
2027 Custom views and delegates are effective ways to provide radically different |
|
2028 representations of the same data. However, applications often need to provide |
|
2029 conventional views onto processed versions of the same data, such as differently-sorted |
|
2030 views onto a list of items. |
|
2031 |
|
2032 Although it seems appropriate to perform sorting and filtering operations as internal |
|
2033 functions of views, this approach does not allow multiple views to share the results |
|
2034 of such potentially costly operations. The alternative approach, involving sorting |
|
2035 within the model itself, leads to the similar problem where each view has to display |
|
2036 items of data that are organized according to the most recent processing operation. |
|
2037 |
|
2038 To solve this problem, the model/view framework uses proxy models to manage the |
|
2039 information supplied between individual models and views. Proxy models are components |
|
2040 that behave like ordinary models from the perspective of a view, and access data from |
|
2041 source models on behalf of that view. The signals and slots used by the model/view |
|
2042 framework ensure that each view is updated appropriately no matter how many proxy models |
|
2043 are placed between itself and the source model. |
|
2044 |
|
2045 \section1 Using Proxy Models |
|
2046 |
|
2047 Proxy models can be inserted between an existing model and any number of views. |
|
2048 Qt is supplied with a standard proxy model, QSortFilterProxyModel, that is usually |
|
2049 instantiated and used directly, but can also be subclassed to provide custom filtering |
|
2050 and sorting behavior. The QSortFilterProxyModel class can be used in the following way: |
|
2051 |
|
2052 \snippet doc/src/snippets/qsortfilterproxymodel/main.cpp 0 |
|
2053 \codeline |
|
2054 \snippet doc/src/snippets/qsortfilterproxymodel/main.cpp 1 |
|
2055 |
|
2056 Since proxy models are inherit from QAbstractItemModel, they can be connected to |
|
2057 any kind of view, and can be shared between views. They can also be used to |
|
2058 process the information obtained from other proxy models in a pipeline arrangement. |
|
2059 |
|
2060 The QSortFilterProxyModel class is designed to be instantiated and used directly |
|
2061 in applications. More specialized proxy models can be created by subclassing this |
|
2062 classes and implementing the required comparison operations. |
|
2063 |
|
2064 \section1 Customizing Proxy Models |
|
2065 |
|
2066 Generally, the type of processing used in a proxy model involves mapping each item of |
|
2067 data from its original location in the source model to either a different location in |
|
2068 the proxy model. In some models, some items may have no corresponding location in the |
|
2069 proxy model; these models are \e filtering proxy models. Views access items using |
|
2070 model indexes provided by the proxy model, and these contain no information about the |
|
2071 source model or the locations of the original items in that model. |
|
2072 |
|
2073 QSortFilterProxyModel enables data from a source model to be filtered before |
|
2074 being supplied to views, and also allows the contents of a source model to |
|
2075 be supplied to views as pre-sorted data. |
|
2076 |
|
2077 \section2 Custom Filtering Models |
|
2078 |
|
2079 The QSortFilterProxyModel class provides a filtering model that is fairly versatile, |
|
2080 and which can be used in a variety of common situations. For advanced users, |
|
2081 QSortFilterProxyModel can be subclassed, providing a mechanism that enables custom |
|
2082 filters to be implemented. |
|
2083 |
|
2084 Subclasses of QSortFilterProxyModel can reimplement two virtual functions that are |
|
2085 called whenever a model index from the proxy model is requested or used: |
|
2086 |
|
2087 \list |
|
2088 \o \l{QSortFilterProxyModel::filterAcceptsColumn()}{filterAcceptsColumn()} is used to |
|
2089 filter specific columns from part of the source model. |
|
2090 \o \l{QSortFilterProxyModel::filterAcceptsRow()}{filterAcceptsRow()} is used to filter |
|
2091 specific rows from part of the source model. |
|
2092 \endlist |
|
2093 |
|
2094 The default implementations of the above functions in QSortFilterProxyModel |
|
2095 return true to ensure that all items are passed through to views; reimplementations |
|
2096 of these functions should return false to filter out individual rows and columns. |
|
2097 |
|
2098 \section2 Custom Sorting Models |
|
2099 |
|
2100 QSortFilterProxyModel instances use Qt's built-in qStableSort() function to set up |
|
2101 mappings between items in the source model and those in the proxy model, allowing a |
|
2102 sorted hierarchy of items to be exposed to views without modifying the structure of the |
|
2103 source model. To provide custom sorting behavior, reimplement the |
|
2104 \l{QSortFilterProxyModel::lessThan()}{lessThan()} function to perform custom |
|
2105 comparisons. |
|
2106 */ |
|
2107 |
|
2108 /*! |
|
2109 \page model-view-model-subclassing.html |
|
2110 \contentspage model-view-programming.html Contents |
|
2111 \previouspage Proxy Models |
|
2112 |
|
2113 \title Model Subclassing Reference |
|
2114 |
|
2115 \tableofcontents |
|
2116 |
|
2117 \section1 Introduction |
|
2118 |
|
2119 Model subclasses need to provide implementations of many of the virtual functions |
|
2120 defined in the QAbstractItemModel base class. The number of these functions that need |
|
2121 to be implemented depends on the type of model - whether it supplies views with |
|
2122 a simple list, a table, or a complex hierarchy of items. Models that inherit from |
|
2123 QAbstractListModel and QAbstractTableModel can take advantage of the default |
|
2124 implementations of functions provided by those classes. Models that expose items |
|
2125 of data in tree-like structures must provide implementations for many of the |
|
2126 virtual functions in QAbstractItemModel. |
|
2127 |
|
2128 The functions that need to be implemented in a model subclass can be divided into three |
|
2129 groups: |
|
2130 |
|
2131 \list |
|
2132 \o \bold{Item data handling:} All models need to implement functions to enable views and |
|
2133 delegates to query the dimensions of the model, examine items, and retrieve data. |
|
2134 \o \bold{Navigation and index creation:} Hierarchical models need to provide functions |
|
2135 that views can call to navigate the tree-like structures they expose, and obtain |
|
2136 model indexes for items. |
|
2137 \o \bold{Drag and drop support and MIME type handling:} Models inherit functions that |
|
2138 control the way that internal and external drag and drop operations are performed. |
|
2139 These functions allow items of data to be described in terms of MIME types that |
|
2140 other components and applications can understand. |
|
2141 \endlist |
|
2142 |
|
2143 For more information, see the \l |
|
2144 {"Item View Classes" Chapter of C++ GUI Programming with Qt 4}. |
|
2145 |
|
2146 \section1 Item Data Handling |
|
2147 |
|
2148 Models can provide varying levels of access to the data they provide: They can be |
|
2149 simple read-only components, some models may support resizing operations, and |
|
2150 others may allow items to be edited. |
|
2151 |
|
2152 \section2 Read-Only Access |
|
2153 |
|
2154 To provide read-only access to data provided by a model, the following functions |
|
2155 \e{must} be implemented in the model's subclass: |
|
2156 |
|
2157 \table 90% |
|
2158 \row \o \l{QAbstractItemModel::flags()}{flags()} |
|
2159 \o Used by other components to obtain information about each item provided by |
|
2160 the model. In many models, the combination of flags should include |
|
2161 Qt::ItemIsEnabled and Qt::ItemIsSelectable. |
|
2162 \row \o \l{QAbstractItemModel::data()}{data()} |
|
2163 \o Used to supply item data to views and delegates. Generally, models only |
|
2164 need to supply data for Qt::DisplayRole and any application-specific user |
|
2165 roles, but it is also good practice to provide data for Qt::ToolTipRole, |
|
2166 Qt::AccessibleTextRole, and Qt::AccessibleDescriptionRole. |
|
2167 See the Qt::ItemDataRole enum documentation for information about the types |
|
2168 associated with each role. |
|
2169 \row \o \l{QAbstractItemModel::headerData()}{headerData()} |
|
2170 \o Provides views with information to show in their headers. The information is |
|
2171 only retrieved by views that can display header information. |
|
2172 \row \o \l{QAbstractItemModel::rowCount()}{rowCount()} |
|
2173 \o Provides the number of rows of data exposed by the model. |
|
2174 \endtable |
|
2175 |
|
2176 These four functions must be implemented in all types of model, including list models |
|
2177 (QAbstractListModel subclasses) and table models (QAbstractTableModel subclasses). |
|
2178 |
|
2179 Additionally, the following functions \e{must} be implemented in direct subclasses |
|
2180 of QAbstractTableModel and QAbstractItemModel: |
|
2181 |
|
2182 \table 90% |
|
2183 \row \o \l{QAbstractItemModel::columnCount()}{columnCount()} |
|
2184 \o Provides the number of columns of data exposed by the model. List models do not |
|
2185 provide this function because it is already implemented in QAbstractListModel. |
|
2186 \endtable |
|
2187 |
|
2188 \section2 Editable Items |
|
2189 |
|
2190 Editable models allow items of data to be modified, and may also provide |
|
2191 functions to allow rows and columns to be inserted and removed. To enable |
|
2192 editing, the following functions must be implemented correctly: |
|
2193 |
|
2194 \table 90% |
|
2195 \row \o \l{QAbstractItemModel::flags()}{flags()} |
|
2196 \o Must return an appropriate combination of flags for each item. In particular, |
|
2197 the value returned by this function must include \l{Qt::ItemIsEditable} in |
|
2198 addition to the values applied to items in a read-only model. |
|
2199 \row \o \l{QAbstractItemModel::setData()}{setData()} |
|
2200 \o Used to modify the item of data associated with a specified model index. |
|
2201 To be able to accept user input, provided by user interface elements, this |
|
2202 function must handle data associated with Qt::EditRole. |
|
2203 The implementation may also accept data associated with many different kinds |
|
2204 of roles specified by Qt::ItemDataRole. After changing the item of data, |
|
2205 models must emit the \l{QAbstractItemModel::dataChanged()}{dataChanged()} |
|
2206 signal to inform other components of the change. |
|
2207 \row \o \l{QAbstractItemModel::setHeaderData()}{setHeaderData()} |
|
2208 \o Used to modify horizontal and vertical header information. After changing |
|
2209 the item of data, models must emit the |
|
2210 \l{QAbstractItemModel::headerDataChanged()}{headerDataChanged()} |
|
2211 signal to inform other components of the change. |
|
2212 \endtable |
|
2213 |
|
2214 \section2 Resizable Models |
|
2215 |
|
2216 All types of model can support the insertion and removal of rows. Table models |
|
2217 and hierarchical models can also support the insertion and removal of columns. |
|
2218 It is important to notify other components about changes to the model's dimensions |
|
2219 both \e before and \e after they occur. As a result, the following functions |
|
2220 can be implemented to allow the model to be resized, but implementations must |
|
2221 ensure that the appropriate functions are called to notify attached views and |
|
2222 delegates: |
|
2223 |
|
2224 \table 90% |
|
2225 \row \o \l{QAbstractItemModel::insertRows()}{insertRows()} |
|
2226 \o Used to add new rows and items of data to all types of model. |
|
2227 Implementations must call |
|
2228 \l{QAbstractItemModel::beginInsertRows()}{beginInsertRows()} \e before |
|
2229 inserting new rows into any underlying data structures, and call |
|
2230 \l{QAbstractItemModel::endInsertRows()}{endInsertRows()} |
|
2231 \e{immediately afterwards}. |
|
2232 \row \o \l{QAbstractItemModel::removeRows()}{removeRows()} |
|
2233 \o Used to remove rows and the items of data they contain from all types of model. |
|
2234 Implementations must call |
|
2235 \l{QAbstractItemModel::beginRemoveRows()}{beginRemoveRows()} |
|
2236 \e before inserting new columns into any underlying data structures, and call |
|
2237 \l{QAbstractItemModel::endRemoveRows()}{endRemoveRows()} |
|
2238 \e{immediately afterwards}. |
|
2239 \row \o \l{QAbstractItemModel::insertColumns()}{insertColumns()} |
|
2240 \o Used to add new columns and items of data to table models and hierarchical models. |
|
2241 Implementations must call |
|
2242 \l{QAbstractItemModel::beginInsertColumns()}{beginInsertColumns()} \e before |
|
2243 rows are removed from any underlying data structures, and call |
|
2244 \l{QAbstractItemModel::endInsertColumns()}{endInsertColumns()} |
|
2245 \e{immediately afterwards}. |
|
2246 \row \o \l{QAbstractItemModel::removeColumns()}{removeColumns()} |
|
2247 \o Used to remove columns and the items of data they contain from table models and |
|
2248 hierarchical models. |
|
2249 Implementations must call |
|
2250 \l{QAbstractItemModel::beginRemoveColumns()}{beginRemoveColumns()} |
|
2251 \e before columns are removed from any underlying data structures, and call |
|
2252 \l{QAbstractItemModel::endRemoveColumns()}{endRemoveColumns()} |
|
2253 \e{immediately afterwards}. |
|
2254 \endtable |
|
2255 |
|
2256 Generally, these functions should return true if the operation was successful. |
|
2257 However, there may be cases where the operation only partly succeeded; for example, |
|
2258 if less than the specified number of rows could be inserted. In such cases, the |
|
2259 model should return false to indicate failure to enable any attached components to |
|
2260 handle the situation. |
|
2261 |
|
2262 The signals emitted by the functions called in implementations of the resizing |
|
2263 API give attached components the chance to take action before any data becomes |
|
2264 unavailable. The encapsulation of insert and remove operations with begin and end |
|
2265 functions also enable the model to manage |
|
2266 \l{QPersistentModelIndex}{persistent model indexes} correctly. |
|
2267 |
|
2268 Normally, the begin and end functions are capable of informing other components |
|
2269 about changes to the model's underlying structure. For more complex changes to the |
|
2270 model's structure, perhaps involving internal reorganization or sorting of data, |
|
2271 it is necessary to emit the \l{QAbstractItemModel::layoutChanged()}{layoutChanged()} |
|
2272 signal to cause any attached views to be updated. |
|
2273 |
|
2274 \section2 Lazy Population of Model Data |
|
2275 |
|
2276 Lazy population of model data effectively allows requests for information |
|
2277 about the model to be deferred until it is actually needed by views. |
|
2278 |
|
2279 Some models need to obtain data from remote sources, or must perform |
|
2280 time-consuming operations to obtain information about the way the |
|
2281 data is organized. Since views generally request as much information |
|
2282 as possible in order to accurately display model data, it can be useful |
|
2283 to restrict the amount of information returned to them to reduce |
|
2284 unnecessary follow-up requests for data. |
|
2285 |
|
2286 In hierarchical models where finding the number of children of a given |
|
2287 item is an expensive operation, it is useful to ensure that the model's |
|
2288 \l{QAbstractItemModel::}{rowCount()} implementation is only called when |
|
2289 necessary. In such cases, the \l{QAbstractItemModel::}{hasChildren()} |
|
2290 function can be reimplemented to provide an inexpensive way for views to |
|
2291 check for the presence of children and, in the case of QTreeView, draw |
|
2292 the appropriate decoration for their parent item. |
|
2293 |
|
2294 Whether the reimplementation of \l{QAbstractItemModel::}{hasChildren()} |
|
2295 returns \c true or \c false, it may not be necessary for the view to call |
|
2296 \l{QAbstractItemModel::}{rowCount()} to find out how many children are |
|
2297 present. For example, QTreeView does not need to know how many children |
|
2298 there are if the parent item has not been expanded to show them. |
|
2299 |
|
2300 If it is known that many items will have children, reimplementing |
|
2301 \l{QAbstractItemModel::}{hasChildren()} to unconditionally return \c true |
|
2302 is sometimes a useful approach to take. This ensures that each item can |
|
2303 be later examined for children while making initial population of model |
|
2304 data as fast as possible. The only disadvantage is that items without |
|
2305 children may be displayed incorrectly in some views until the user |
|
2306 attempts to view the non-existent child items. |
|
2307 |
|
2308 |
|
2309 \section1 Navigation and Model Index Creation |
|
2310 |
|
2311 Hierarchical models need to provide functions that views can call to navigate the |
|
2312 tree-like structures they expose, and obtain model indexes for items. |
|
2313 |
|
2314 \section2 Parents and Children |
|
2315 |
|
2316 Since the structure exposed to views is determined by the underlying data |
|
2317 structure, it is up to each model subclass to create its own model indexes |
|
2318 by providing implementations of the following functions: |
|
2319 |
|
2320 \table 90% |
|
2321 \row \o \l{QAbstractItemModel::index()}{index()} |
|
2322 \o Given a model index for a parent item, this function allows views and delegates |
|
2323 to access children of that item. If no valid child item - corresponding to the |
|
2324 specified row, column, and parent model index, can be found, the function |
|
2325 must return QModelIndex(), which is an invalid model index. |
|
2326 \row \o \l{QAbstractItemModel::parent()}{parent()} |
|
2327 \o Provides a model index corresponding to the parent of any given child item. |
|
2328 If the model index specified corresponds to a top-level item in the model, or if |
|
2329 there is no valid parent item in the model, the function must return |
|
2330 an invalid model index, created with the empty QModelIndex() constructor. |
|
2331 \endtable |
|
2332 |
|
2333 Both functions above use the \l{QAbstractItemModel::createIndex()}{createIndex()} |
|
2334 factory function to generate indexes for other components to use. It is normal for |
|
2335 models to supply some unique identifier to this function to ensure that |
|
2336 the model index can be re-associated with its corresponding item later on. |
|
2337 |
|
2338 \section1 Drag and Drop Support and MIME Type Handling |
|
2339 |
|
2340 The model/view classes support drag and drop operations, providing default behavior |
|
2341 that is sufficient for many applications. However, it is also possible to customize |
|
2342 the way items are encoded during drag and drop operations, whether they are copied |
|
2343 or moved by default, and how they are inserted into existing models. |
|
2344 |
|
2345 Additionally, the convenience view classes implement specialized behavior that |
|
2346 should closely follow that expected by existing developers. |
|
2347 The \l{#Convenience Views}{Convenience Views} section provides an overview of this |
|
2348 behavior. |
|
2349 |
|
2350 \section2 MIME Data |
|
2351 |
|
2352 By default, the built-in models and views use an internal MIME type |
|
2353 (\c{application/x-qabstractitemmodeldatalist}) to pass around information about |
|
2354 model indexes. This specifies data for a list of items, containing the row and |
|
2355 column numbers of each item, and information about the roles that each item |
|
2356 supports. |
|
2357 |
|
2358 Data encoded using this MIME type can be obtained by calling |
|
2359 QAbstractItemModel::mimeData() with a QModelIndexList containing the items to |
|
2360 be serialized. |
|
2361 \omit |
|
2362 The following types are used to store information about |
|
2363 each item as it is streamed into a QByteArray and stored in a QMimeData object: |
|
2364 |
|
2365 \table 90% |
|
2366 \header \o Description \o Type |
|
2367 \row \o Row \o int |
|
2368 \row \o Column \o int |
|
2369 \row \o Data for each role \o QMap<int, QVariant> |
|
2370 \endtable |
|
2371 |
|
2372 This information can be retrieved for use in non-model classes by calling |
|
2373 QMimeData::data() with the \c{application/x-qabstractitemmodeldatalist} MIME |
|
2374 type and streaming out the items one by one. |
|
2375 \endomit |
|
2376 |
|
2377 When implementing drag and drop support in a custom model, it is possible to |
|
2378 export items of data in specialized formats by reimplementing the following |
|
2379 function: |
|
2380 |
|
2381 \table 90% |
|
2382 \row \o \l{QAbstractItemModel::mimeData()}{mimeData()} |
|
2383 \o This function can be reimplemented to return data in formats other |
|
2384 than the default \c{application/x-qabstractitemmodeldatalist} internal |
|
2385 MIME type. |
|
2386 |
|
2387 Subclasses can obtain the default QMimeData object from the base class |
|
2388 and add data to it in additional formats. |
|
2389 \endtable |
|
2390 |
|
2391 For many models, it is useful to provide the contents of items in common format |
|
2392 represented by MIME types such as \c{text/plain} and \c{image/png}. Note that |
|
2393 images, colors and HTML documents can easily be added to a QMimeData object with |
|
2394 the QMimeData::setImageData(), QMimeData::setColorData(), and |
|
2395 QMimeData::setHtml() functions. |
|
2396 |
|
2397 \section2 Accepting Dropped Data |
|
2398 |
|
2399 When a drag and drop operation is performed over a view, the underlying model is |
|
2400 queried to determine which types of operation it supports and the MIME types |
|
2401 it can accept. This information is provided by the |
|
2402 QAbstractItemModel::supportedDropActions() and QAbstractItemModel::mimeTypes() |
|
2403 functions. Models that do not override the implementations provided by |
|
2404 QAbstractItemModel support copy operations and the default internal MIME type |
|
2405 for items. |
|
2406 |
|
2407 When serialized item data is dropped onto a view, the data is inserted into |
|
2408 the current model using its implementation of QAbstractItemModel::dropMimeData(). |
|
2409 The default implementation of this function will never overwrite any data in the |
|
2410 model; instead, it tries to insert the items of data either as siblings of an |
|
2411 item, or as children of that item. |
|
2412 |
|
2413 To take advantage of QAbstractItemModel's default implementation for the built-in |
|
2414 MIME type, new models must provide reimplementations of the following functions: |
|
2415 |
|
2416 \table 90% |
|
2417 \row \o \l{QAbstractItemModel::insertRows()}{insertRows()} |
|
2418 \o {1, 2} These functions enable the model to automatically insert new data using |
|
2419 the existing implementation provided by QAbstractItemModel::dropMimeData(). |
|
2420 \row \o \l{QAbstractItemModel::insertColumns()}{insertColumns()} |
|
2421 \row \o \l{QAbstractItemModel::setData()}{setData()} |
|
2422 \o Allows the new rows and columns to be populated with items. |
|
2423 \row \o \l{QAbstractItemModel::setItemData()}{setItemData()} |
|
2424 \o This function provides more efficient support for populating new items. |
|
2425 \endtable |
|
2426 |
|
2427 To accept other forms of data, these functions must be reimplemented: |
|
2428 |
|
2429 \table 90% |
|
2430 \row \o \l{QAbstractItemModel::supportedDropActions()}{supportedDropActions()} |
|
2431 \o Used to return a combination of \l{Qt::DropActions}{drop actions}, |
|
2432 indicating the types of drag and drop operations that the model accepts. |
|
2433 \row \o \l{QAbstractItemModel::mimeTypes()}{mimeTypes()} |
|
2434 \o Used to return a list of MIME types that can be decoded and handled by |
|
2435 the model. Generally, the MIME types that are supported for input into |
|
2436 the model are the same as those that it can use when encoding data for |
|
2437 use by external components. |
|
2438 \row \o \l{QAbstractItemModel::dropMimeData()}{dropMimeData()} |
|
2439 \o Performs the actual decoding of the data transferred by drag and drop |
|
2440 operations, determines where in the model it will be set, and inserts |
|
2441 new rows and columns where necessary. How this function is implemented |
|
2442 in subclasses depends on the requirements of the data exposed by each |
|
2443 model. |
|
2444 \endtable |
|
2445 |
|
2446 If the implementation of the \l{QAbstractItemModel::dropMimeData()}{dropMimeData()} |
|
2447 function changes the dimensions of a model by inserting or removing rows or |
|
2448 columns, or if items of data are modified, care must be taken to ensure that |
|
2449 all relevant signals are emitted. It can be useful to simply call |
|
2450 reimplementations of other functions in the subclass, such as |
|
2451 \l{QAbstractItemModel::setData()}{setData()}, |
|
2452 \l{QAbstractItemModel::insertRows()}{insertRows()}, and |
|
2453 \l{QAbstractItemModel::insertColumns()}{insertColumns()}, to ensure that the |
|
2454 model behaves consistently. |
|
2455 |
|
2456 In order to ensure drag operations work properly, it is important to |
|
2457 reimplement the following functions that remove data from the model: |
|
2458 |
|
2459 \list |
|
2460 \o \l{QAbstractItemModel::}{removeRows()} |
|
2461 \o \l{QAbstractItemModel::}{removeRow()} |
|
2462 \o \l{QAbstractItemModel::}{removeColumns()} |
|
2463 \o \l{QAbstractItemModel::}{removeColumn()} |
|
2464 \endlist |
|
2465 |
|
2466 For more information about drag and drop with item views, refer to |
|
2467 \l{Using Drag and Drop with Item Views}. |
|
2468 |
|
2469 \section2 Convenience Views |
|
2470 |
|
2471 The convenience views (QListWidget, QTableWidget, and QTreeWidget) override |
|
2472 the default drag and drop functionality to provide less flexible, but more |
|
2473 natural behavior that is appropriate for many applications. For example, |
|
2474 since it is more common to drop data into cells in a QTableWidget, replacing |
|
2475 the existing contents with the data being transferred, the underlying model |
|
2476 will set the data of the target items rather than insert new rows and columns |
|
2477 into the model. For more information on drag and drop in convenience views, |
|
2478 you can see \l{Using Drag and Drop with Item Views}. |
|
2479 |
|
2480 \section1 Performance Optimization for Large Amounts of Data |
|
2481 |
|
2482 The \l{QAbstractItemModel::}{canFetchMore()} function checks if the parent |
|
2483 has more data available and returns true or false accordingly. The |
|
2484 \l{QAbstractItemModel::}{fetchMore()} function fetches data based on the |
|
2485 parent specified. Both these functions can be combined, for example, in a |
|
2486 database query involving incremental data to populate a QAbstractItemModel. |
|
2487 We reimplement \l{QAbstractItemModel::}{canFetchMore()} to indicate if there |
|
2488 is more data to be fetched and \l{QAbstractItemModel::}{fetchMore()} to |
|
2489 populate the model as required. |
|
2490 |
|
2491 Another example would be dynamically populated tree models, where we |
|
2492 reimplement \l{QAbstractItemModel::}{fetchMore()} when a branch in the tree |
|
2493 model is expanded. |
|
2494 |
|
2495 If your reimplementation of \l{QAbstractItemModel::}{fetchMore()} adds rows |
|
2496 to the model, you need to call \l{QAbstractItemModel::}{beginInsertRows()} |
|
2497 and \l{QAbstractItemModel::}{endInsertRows()}. Also, both |
|
2498 \l{QAbstractItemModel::}{canFetchMore()} and \l{QAbstractItemModel::} |
|
2499 {fetchMore()} must be reimplemented as their default implementation returns |
|
2500 false and does nothing. |
|
2501 */ |