1 | /****************************************************************************
|
---|
2 | **
|
---|
3 | ** Copyright (C) 2011 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:FDL$
|
---|
10 | ** Commercial Usage
|
---|
11 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
---|
12 | ** accordance with the Qt Commercial License Agreement provided with the
|
---|
13 | ** Software or, alternatively, in accordance with the terms contained in a
|
---|
14 | ** written agreement between you and Nokia.
|
---|
15 | **
|
---|
16 | ** GNU Free Documentation License
|
---|
17 | ** Alternatively, this file may be used under the terms of the GNU Free
|
---|
18 | ** Documentation License version 1.3 as published by the Free Software
|
---|
19 | ** Foundation and appearing in the file included in the packaging of this
|
---|
20 | ** file.
|
---|
21 | **
|
---|
22 | ** If you have questions regarding the use of this file, please contact
|
---|
23 | ** Nokia at qt-info@nokia.com.
|
---|
24 | ** $QT_END_LICENSE$
|
---|
25 | **
|
---|
26 | ****************************************************************************/
|
---|
27 |
|
---|
28 | /*!
|
---|
29 | \page porting4-dnd.html
|
---|
30 | \title Porting to Qt 4 - Drag and Drop
|
---|
31 | \contentspage {Porting Guides}{Contents}
|
---|
32 | \previouspage Porting to Qt 4 - Virtual Functions
|
---|
33 | \nextpage Porting UI Files to Qt 4
|
---|
34 | \ingroup porting
|
---|
35 | \brief An overview of the porting process for applications that use drag and drop.
|
---|
36 |
|
---|
37 | Qt 4 introduces a new set of classes to handle drag and drop operations
|
---|
38 | that aim to be easier to use than their counterparts in Qt 3. As a result,
|
---|
39 | the way that drag and drop is performed is quite different to the way
|
---|
40 | developers of Qt 3 applications have come to expect. In this guide, we
|
---|
41 | show the differences between the old and new APIs and indicate where
|
---|
42 | applications need to be changed when they are ported to Qt 4.
|
---|
43 |
|
---|
44 | \tableofcontents
|
---|
45 |
|
---|
46 | \section1 Dragging
|
---|
47 |
|
---|
48 | In Qt 3, drag operations are encapsulated by \c QDragObject (see Q3DragObject)
|
---|
49 | and its subclasses. These objects are typically constructed on the heap in
|
---|
50 | response to mouse click or mouse move events, and ownership of them is
|
---|
51 | transferred to Qt so that they can be deleted when the corresponding drag and
|
---|
52 | drop operations have been completed. The drag source has no control over how
|
---|
53 | the drag and drop operation is performed once the object's
|
---|
54 | \l{Q3DragObject::}{drag()} function is called, and it receives no information
|
---|
55 | about how the operation ended.
|
---|
56 |
|
---|
57 | \snippet doc/src/snippets/code/doc_src_dnd.qdoc 0
|
---|
58 |
|
---|
59 | Similarly, in Qt 4, drag operations are also initiated when a QDrag object
|
---|
60 | is constructed and its \l{QDrag::}{exec()} function is called. In contrast,
|
---|
61 | these objects are typically constructed on the stack rather than the heap
|
---|
62 | since each drag and drop operation is performed synchronously as far as the
|
---|
63 | drag source is concerned. One key benefit of this is that the drag source
|
---|
64 | can receive information about how the operation ended from the value returned
|
---|
65 | by \l{QDrag::}{exec()}.
|
---|
66 |
|
---|
67 | \snippet doc/src/snippets/porting4-dropevents/window.cpp 2
|
---|
68 | \snippet doc/src/snippets/porting4-dropevents/window.cpp 3
|
---|
69 | \dots 8
|
---|
70 | \snippet doc/src/snippets/porting4-dropevents/window.cpp 4
|
---|
71 | \snippet doc/src/snippets/porting4-dropevents/window.cpp 5
|
---|
72 |
|
---|
73 | A key difference in the above code is the use of the QMimeData class to hold
|
---|
74 | information about the data that is transferred. Qt 3 relies on subclasses
|
---|
75 | of \c QDragObject to provide support for specific MIME types; in Qt 4, the
|
---|
76 | use of QMimeData as a generic container for data makes the relationship
|
---|
77 | between MIME type and data more tranparent. QMimeData is described in more
|
---|
78 | detail later in this document.
|
---|
79 |
|
---|
80 | \section1 Dropping
|
---|
81 |
|
---|
82 | In both Qt 3 and Qt 4, it is possible to prepare a custom widget to accept
|
---|
83 | dropped data by enabling the \l{QWidget::}{acceptDrops} property of a widget,
|
---|
84 | usually in the widget's constructor. As a result, the widget will receive
|
---|
85 | drag enter events that can be handled by its \l{QWidget::}{dragEnterEvent()}
|
---|
86 | function.
|
---|
87 | As in Qt 3, custom widgets in Qt 4 handle these events by determining
|
---|
88 | whether the data supplied by the drag and drop operation can be dropped onto
|
---|
89 | the widget. Since the classes used to encapsulate MIME data are different in
|
---|
90 | Qt 3 and Qt 4, the exact implementations differ.
|
---|
91 |
|
---|
92 | In Qt 3, the drag enter event is handled by checking whether each of the
|
---|
93 | standard \c QDragObject subclasses can decode the data supplied, and
|
---|
94 | indicating success or failure of these checks via the event's
|
---|
95 | \l{QDragEnterEvent::}{accept()} function, as shown in this simple example:
|
---|
96 |
|
---|
97 | \snippet doc/src/snippets/code/doc_src_dnd.qdoc 1
|
---|
98 |
|
---|
99 | In Qt 4, you can examine the MIME type describing the data to determine
|
---|
100 | whether the widget should accept the event or, for common data types, you
|
---|
101 | can use convenience functions:
|
---|
102 |
|
---|
103 | \snippet doc/src/snippets/porting4-dropevents/window.cpp 0
|
---|
104 |
|
---|
105 | The widget has some control over the type of drag and drop operation to be
|
---|
106 | performed. In the above code, the action proposed by the drag source is
|
---|
107 | accepted, but
|
---|
108 | \l{Drag and Drop#Overriding Proposed Actions}{this can be overridden} if
|
---|
109 | required.
|
---|
110 |
|
---|
111 | In both Qt 3 and Qt 4, it is necessary to accept a given drag event in order
|
---|
112 | to receive the corresponding drop event. A custom widget in Qt 3 that can
|
---|
113 | accept dropped data in the form of text or images might provide an
|
---|
114 | implementation of \l{QWidget::}{dropEvent()} that looks like the following:
|
---|
115 |
|
---|
116 | \snippet doc/src/snippets/code/doc_src_dnd.qdoc 2
|
---|
117 |
|
---|
118 | In Qt 4, the event is handled in a similar way:
|
---|
119 |
|
---|
120 | \snippet doc/src/snippets/porting4-dropevents/window.cpp 1
|
---|
121 |
|
---|
122 | It is also possible to extract data stored for a particular MIME type if it
|
---|
123 | was specified by the drag source.
|
---|
124 |
|
---|
125 | \section1 MIME Types and Data
|
---|
126 |
|
---|
127 | In Qt 3, data to be transferred in drag and drop operations is encapsulated
|
---|
128 | in instances of \c QDragObject and its subclasses, representing specific
|
---|
129 | data formats related to common MIME type and subtypes.
|
---|
130 |
|
---|
131 | In Qt 4, only the QMimeData class is used to represent data, providing a
|
---|
132 | container for data stored in multiple formats, each associated with
|
---|
133 | a relevant MIME type. Since arbitrary MIME types can be specified, there is
|
---|
134 | no need for an extensive class hierarchy to represent different kinds of
|
---|
135 | information. Additionally, QMimeData it provides some convenience functions
|
---|
136 | to allow the most common data formats to be stored and retrieved with less
|
---|
137 | effort than for arbitrary MIME types.
|
---|
138 | */
|
---|