summaryrefslogtreecommitdiffstats
path: root/doc/src/dnd.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/dnd.qdoc')
-rw-r--r--doc/src/dnd.qdoc543
1 files changed, 0 insertions, 543 deletions
diff --git a/doc/src/dnd.qdoc b/doc/src/dnd.qdoc
deleted file mode 100644
index c185f06..0000000
--- a/doc/src/dnd.qdoc
+++ /dev/null
@@ -1,543 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page dnd.html
- \title Drag and Drop
- \ingroup architecture
- \brief An overview of the drag and drop system provided by Qt.
-
- Drag and drop provides a simple visual mechanism which users can use
- to transfer information between and within applications. (In the
- literature this is referred to as a "direct manipulation model".) Drag
- and drop is similar in function to the clipboard's cut and paste
- mechanism.
-
- \tableofcontents
-
- This document describes the basic drag and drop mechanism and
- outlines the approach used to enable it in custom widgets. Drag
- and drop operations are also supported by Qt's item views and by
- the graphics view framework; more information is available in the
- \l{Using Drag and Drop with Item Views} and \l{The Graphics View
- Framework} documents.
-
- \section1 Configuration
-
- The QApplication object provides some properties that are related
- to drag and drop operations:
-
- \list
- \i \l{QApplication::startDragTime} describes the amount of time in
- milliseconds that the user must hold down a mouse button over an
- object before a drag will begin.
- \i \l{QApplication::startDragDistance} indicates how far the user has to
- move the mouse while holding down a mouse button before the movement
- will be interpreted as dragging. Use of high values for this quantity
- prevents accidental dragging when the user only meant to click on an
- object.
- \endlist
-
- These quantities provide sensible default values for you to use if you
- provide drag and drop support in your widgets.
-
- \section1 Dragging
-
- To start a drag, create a QDrag object, and call its
- exec() function. In most applications, it is a good idea to begin a drag
- and drop operation only after a mouse button has been pressed and the
- cursor has been moved a certain distance. However, the simplest way to
- enable dragging from a widget is to reimplement the widget's
- \l{QWidget::mousePressEvent()}{mousePressEvent()} and start a drag
- and drop operation:
-
- \snippet doc/src/snippets/dragging/mainwindow.cpp 0
- \dots 8
- \snippet doc/src/snippets/dragging/mainwindow.cpp 2
-
- Although the user may take some time to complete the dragging operation,
- as far as the application is concerned the exec() function is a blocking
- function that returns with \l{Qt::DropActions}{one of several values}.
- These indicate how the operation ended, and are described in more detail
- below.
-
- Note that the exec() function does not block the main event loop.
-
- For widgets that need to distinguish between mouse clicks and drags, it
- is useful to reimplement the widget's
- \l{QWidget::mousePressEvent()}{mousePressEvent()} function to record to
- start position of the drag:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 6
-
- Later, in \l{QWidget::mouseMoveEvent()}{mouseMoveEvent()}, we can determine
- whether a drag should begin, and construct a drag object to handle the
- operation:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
- \dots
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
-
- This particular approach uses the \l QPoint::manhattanLength() function
- to get a rough estimate of the distance between where the mouse click
- occurred and the current cursor position. This function trades accuracy
- for speed, and is usually suitable for this purpose.
-
- \section1 Dropping
-
- To be able to receive media dropped on a widget, call
- \l{QWidget::setAcceptDrops()}{setAcceptDrops(true)} for the widget,
- and reimplement the \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
- \l{QWidget::dropEvent()}{dropEvent()} event handler functions.
-
- For example, the following code enables drop events in the constructor of
- a QWidget subclass, making it possible to usefully implement drop event
- handlers:
-
- \snippet doc/src/snippets/dropevents/window.cpp 0
- \dots
- \snippet doc/src/snippets/dropevents/window.cpp 1
- \snippet doc/src/snippets/dropevents/window.cpp 2
-
- The dragEnterEvent() function is typically used to inform Qt about the
- types of data that the widget accepts.
- You must reimplement this function if you want to receive either
- QDragMoveEvent or QDropEvent in your reimplementations of
- \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and dropEvent().
-
- The following code shows how dragEnterEvent() can be reimplemented to
- tell the drag and drop system that we can only handle plain text:
-
- \snippet doc/src/snippets/dropevents/window.cpp 3
-
- The dropEvent() is used to unpack dropped data and handle it in way that
- is suitable for your application.
-
- In the following code, the text supplied in the event is passed to a
- QTextBrowser and a QComboBox is filled with the list of MIME types that
- are used to describe the data:
-
- \snippet doc/src/snippets/dropevents/window.cpp 4
-
- In this case, we accept the proposed action without checking what it is.
- In a real world application, it may be necessary to return from the
- dropEvent() function without accepting the proposed action or handling
- the data if the action is not relevant. For example, we may choose to
- ignore Qt::LinkAction actions if we do not support
- links to external sources in our application.
-
- \section2 Overriding Proposed Actions
-
- We may also ignore the proposed action, and perform some other action on
- the data. To do this, we would call the event object's
- \l{QDropEvent::setDropAction()}{setDropAction()} with the preferred
- action from Qt::DropAction before calling \l{QEvent::}{accept()}.
- This ensures that the replacement drop action is used instead of the
- proposed action.
-
- For more sophisticated applications, reimplementing
- \l{QWidget::dragMoveEvent()}{dragMoveEvent()} and
- \l{QWidget::dragLeaveEvent()}{dragLeaveEvent()} will let you make
- certain parts of your widgets sensitive to drop events, and give you more
- control over drag and drop in your application.
-
- \section2 Subclassing Complex Widgets
-
- Certain standard Qt widgets provide their own support for drag and drop.
- When subclassing these widgets, it may be necessary to reimplement
- \l{QWidget::dragMoveEvent()}{dragMoveEvent()} in addition to
- \l{QWidget::dragEnterEvent()}{dragEnterEvent()} and
- \l{QWidget::dropEvent()}{dropEvent()} to prevent the base class from
- providing default drag and drop handling, and to handle any special
- cases you are interested in.
-
- \section1 Drag and Drop Actions
-
- In the simplest case, the target of a drag and drop action receives a
- copy of the data being dragged, and the source decides whether to
- delete the original. This is described by the \c CopyAction action.
- The target may also choose to handle other actions, specifically the
- \c MoveAction and \c LinkAction actions. If the source calls
- QDrag::exec(), and it returns \c MoveAction, the source is responsible
- for deleting any original data if it chooses to do so. The QMimeData
- and QDrag objects created by the source widget \e{should not be deleted}
- - they will be destroyed by Qt. The target is responsible for taking
- ownership of the data sent in the drag and drop operation; this is
- usually done by keeping references to the data.
-
- If the target understands the \c LinkAction action, it should
- store its own reference to the original information; the source
- does not need to perform any further processing on the data. The
- most common use of drag and drop actions is when performing a
- Move within the same widget; see the section on \l{Drop Actions}
- for more information about this feature.
-
- The other major use of drag actions is when using a reference type
- such as text/uri-list, where the dragged data are actually references
- to files or objects.
-
- \section1 Adding New Drag and Drop Types
-
- Drag and drop is not limited to text and images. Any type of information
- can be transferred in a drag and drop operation. To drag information
- between applications, the applications must be able to indicate to each
- other which data formats they can accept and which they can produce.
- This is achieved using
- \l{http://www.rfc-editor.org/rfc/rfc1341.txt}{MIME types}. The QDrag
- object constructed by the source contains a list of MIME types that it
- uses to represent the data (ordered from most appropriate to least
- appropriate), and the drop target uses one of these to access the data.
- For common data types, the convenience functions handle the MIME types
- used transparently but, for custom data types, it is necessary to
- state them explicitly.
-
- To implement drag and drop actions for a type of information that is
- not covered by the QDrag convenience functions, the first and most
- important step is to look for existing formats that are appropriate:
- The Internet Assigned Numbers Authority (\l{http://www.iana.org}{IANA})
- provides a
- \l{http://www.iana.org/assignments/media-types/}{hierarchical
- list of MIME media types} at the Information Sciences Institute
- (\l{http://www.isi.edu}{ISI}).
- Using standard MIME types maximizes the interoperability of
- your application with other software now and in the future.
-
- To support an additional media type, simply set the data in the QMimeData
- object with the \l{QMimeData::setData()}{setData()} function, supplying
- the full MIME type and a QByteArray containing the data in the appropriate
- format. The following code takes a pixmap from a label and stores it
- as a Portable Network Graphics (PNG) file in a QMimeData object:
-
- \snippet doc/src/snippets/separations/finalwidget.cpp 0
-
- Of course, for this case we could have simply used
- \l{QMimeData::setImageData()}{setImageData()} instead to supply image data
- in a variety of formats:
-
- \snippet doc/src/snippets/separations/finalwidget.cpp 1
-
- The QByteArray approach is still useful in this case because it provides
- greater control over the amount of data stored in the QMimeData object.
-
- Note that custom datatypes used in item views must be declared as
- \l{QMetaObject}{meta objects} and that stream operators for them
- must be implemented.
-
- \section1 Drop Actions
-
- In the clipboard model, the user can \e cut or \e copy the source
- information, then later paste it. Similarly in the drag and drop
- model, the user can drag a \e copy of the information or they can drag
- the information itself to a new place (\e moving it). The
- drag and drop model has an additional complication for the programmer:
- The program doesn't know whether the user wants to cut or copy the
- information until the operation is complete. This often makes no
- difference when dragging information between applications, but within
- an application it is important to check which drop action was used.
-
- We can reimplement the mouseMoveEvent() for a widget, and start a drag
- and drop operation with a combination of possible drop actions. For
- example, we may want to ensure that dragging always moves objects in
- the widget:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 7
- \dots
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 8
-
- The action returned by the exec() function may default to a
- \c CopyAction if the information is dropped into another application
- but, if it is dropped in another widget in the same application, we
- may obtain a different drop action.
-
- The proposed drop actions can be filtered in a widget's dragMoveEvent()
- function. However, it is possible to accept all proposed actions in
- the dragEnterEvent() and let the user decide which they want to accept
- later:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 0
-
- When a drop occurs in the widget, the dropEvent() handler function is
- called, and we can deal with each possible action in turn. First, we
- deal with drag and drop operations within the same widget:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 1
-
- In this case, we refuse to deal with move operations. Each type of drop
- action that we accept is checked and dealt with accordingly:
-
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 2
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 3
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 4
- \dots
- \snippet doc/src/snippets/draganddrop/dragwidget.cpp 5
-
- Note that we checked for individual drop actions in the above code.
- As mentioned above in the section on
- \l{#Overriding Proposed Actions}{Overriding Proposed Actions}, it is
- sometimes necessary to override the proposed drop action and choose a
- different one from the selection of possible drop actions.
- To do this, you need to check for the presence of each action in the value
- supplied by the event's \l{QDropEvent::}{possibleActions()}, set the drop
- action with \l{QDropEvent::}{setDropAction()}, and call
- \l{QEvent::}{accept()}.
-
- \section1 Drop Rectangles
-
- The widget's dragMoveEvent() can be used to restrict drops to certain parts
- of the widget by only accepting the proposed drop actions when the cursor
- is within those areas. For example, the following code accepts any proposed
- drop actions when the cursor is over a child widget (\c dropFrame):
-
- \snippet doc/src/snippets/droprectangle/window.cpp 0
-
- The dragMoveEvent() can also be used if you need to give visual
- feedback during a drag and drop operation, to scroll the window, or
- whatever is appropriate.
-
- \section1 The Clipboard
-
- Applications can also communicate with each other by putting data on
- the clipboard. To access this, you need to obtain a QClipboard object
- from the QApplication object:
-
- \snippet examples/widgets/charactermap/mainwindow.cpp 3
-
- The QMimeData class is used to represent data that is transferred to and
- from the clipboard. To put data on the clipboard, you can use the
- setText(), setImage(), and setPixmap() convenience functions for common
- data types. These functions are similar to those found in the QMimeData
- class, except that they also take an additional argument that controls
- where the data is stored: If \l{QClipboard::Mode}{Clipboard} is
- specified, the data is placed on the clipboard; if
- \l{QClipboard::Mode}{Selection} is specified, the data is placed in the
- mouse selection (on X11 only). By default, data is put on the clipboard.
-
- For example, we can copy the contents of a QLineEdit to the clipboard
- with the following code:
-
- \snippet examples/widgets/charactermap/mainwindow.cpp 11
-
- Data with different MIME types can also be put on the clipboard.
- Construct a QMimeData object and set data with setData() function in
- the way described in the previous section; this object can then be
- put on the clipboard with the
- \l{QClipboard::setMimeData()}{setMimeData()} function.
-
- The QClipboard class can notify the application about changes to the
- data it contains via its \l{QClipboard::dataChanged()}{dataChanged()}
- signal. For example, we can monitor the clipboard by connecting this
- signal to a slot in a widget:
-
- \snippet doc/src/snippets/clipboard/clipwindow.cpp 0
-
- The slot connected to this signal can read the data on the clipboard
- using one of the MIME types that can be used to represent it:
-
- \snippet doc/src/snippets/clipboard/clipwindow.cpp 1
- \dots
- \snippet doc/src/snippets/clipboard/clipwindow.cpp 2
-
- The \l{QClipboard::selectionChanged()}{selectionChanged()} signal can
- be used on X11 to monitor the mouse selection.
-
- \section1 Examples
-
- \list
- \o \l{draganddrop/draggableicons}{Draggable Icons}
- \o \l{draganddrop/draggabletext}{Draggable Text}
- \o \l{draganddrop/dropsite}{Drop Site}
- \o \l{draganddrop/fridgemagnets}{Fridge Magnets}
- \o \l{draganddrop/puzzle}{Drag and Drop Puzzle}
- \endlist
-
- \section1 Interoperating with Other Applications
-
- On X11, the public \l{http://www.newplanetsoftware.com/xdnd/}{XDND
- protocol} is used, while on Windows Qt uses the OLE standard, and
- Qt for Mac OS X uses the Carbon Drag Manager. On X11, XDND uses MIME,
- so no translation is necessary. The Qt API is the same regardless of
- the platform. On Windows, MIME-aware applications can communicate by
- using clipboard format names that are MIME types. Already some
- Windows applications use MIME naming conventions for their
- clipboard formats. Internally, Qt uses QWindowsMime and
- QMacPasteboardMime for translating proprietary clipboard formats
- to and from MIME types.
-
- On X11, Qt also supports drops via the Motif Drag & Drop Protocol. The
- implementation incorporates some code that was originally written by
- Daniel Dardailler, and adapted for Qt by Matt Koss <koss@napri.sk>
- and Trolltech. Here is the original copyright notice:
-
- \legalese
- Copyright 1996 Daniel Dardailler.
-
- Permission to use, copy, modify, distribute, and sell this software
- for any purpose is hereby granted without fee, provided that the above
- copyright notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting documentation,
- and that the name of Daniel Dardailler not be used in advertising or
- publicity pertaining to distribution of the software without specific,
- written prior permission. Daniel Dardailler makes no representations
- about the suitability of this software for any purpose. It is
- provided "as is" without express or implied warranty.
-
- Modifications Copyright 1999 Matt Koss, under the same license as
- above.
- \endlegalese
- \omit NOTE: The copyright notice is from qmotifdnd_x11.cpp. \endomit
-
- Note: The Motif Drag \& Drop Protocol only allows receivers to
- request data in response to a QDropEvent. If you attempt to
- request data in response to e.g. a QDragMoveEvent, an empty
- QByteArray is returned.
-*/
-
-/*!
- \page porting4-dnd.html
- \title Porting to Qt 4 - Drag and Drop
- \contentspage {Porting Guides}{Contents}
- \previouspage Porting to Qt 4 - Virtual Functions
- \nextpage Porting .ui Files to Qt 4
- \ingroup porting
- \brief An overview of the porting process for applications that use drag and drop.
-
- Qt 4 introduces a new set of classes to handle drag and drop operations
- that aim to be easier to use than their counterparts in Qt 3. As a result,
- the way that drag and drop is performed is quite different to the way
- developers of Qt 3 applications have come to expect. In this guide, we
- show the differences between the old and new APIs and indicate where
- applications need to be changed when they are ported to Qt 4.
-
- \tableofcontents
-
- \section1 Dragging
-
- In Qt 3, drag operations are encapsulated by \c QDragObject (see Q3DragObject)
- and its subclasses. These objects are typically constructed on the heap in
- response to mouse click or mouse move events, and ownership of them is
- transferred to Qt so that they can be deleted when the corresponding drag and
- drop operations have been completed. The drag source has no control over how
- the drag and drop operation is performed once the object's
- \l{Q3DragObject::}{drag()} function is called, and it receives no information
- about how the operation ended.
-
- \snippet doc/src/snippets/code/doc_src_dnd.qdoc 0
-
- Similarly, in Qt 4, drag operations are also initiated when a QDrag object
- is constructed and its \l{QDrag::}{exec()} function is called. In contrast,
- these objects are typically constructed on the stack rather than the heap
- since each drag and drop operation is performed synchronously as far as the
- drag source is concerned. One key benefit of this is that the drag source
- can receive information about how the operation ended from the value returned
- by \l{QDrag::}{exec()}.
-
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 2
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 3
- \dots 8
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 4
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 5
-
- A key difference in the above code is the use of the QMimeData class to hold
- information about the data that is transferred. Qt 3 relies on subclasses
- of \c QDragObject to provide support for specific MIME types; in Qt 4, the
- use of QMimeData as a generic container for data makes the relationship
- between MIME type and data more tranparent. QMimeData is described in more
- detail later in this document.
-
- \section1 Dropping
-
- In both Qt 3 and Qt 4, it is possible to prepare a custom widget to accept
- dropped data by enabling the \l{QWidget::}{acceptDrops} property of a widget,
- usually in the widget's constructor. As a result, the widget will receive
- drag enter events that can be handled by its \l{QWidget::}{dragEnterEvent()}
- function.
- As in Qt 3, custom widgets in Qt 4 handle these events by determining
- whether the data supplied by the drag and drop operation can be dropped onto
- the widget. Since the classes used to encapsulate MIME data are different in
- Qt 3 and Qt 4, the exact implementations differ.
-
- In Qt 3, the drag enter event is handled by checking whether each of the
- standard \c QDragObject subclasses can decode the data supplied, and
- indicating success or failure of these checks via the event's
- \l{QDragEnterEvent::}{accept()} function, as shown in this simple example:
-
- \snippet doc/src/snippets/code/doc_src_dnd.qdoc 1
-
- In Qt 4, you can examine the MIME type describing the data to determine
- whether the widget should accept the event or, for common data types, you
- can use convenience functions:
-
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 0
-
- The widget has some control over the type of drag and drop operation to be
- performed. In the above code, the action proposed by the drag source is
- accepted, but
- \l{Drag and Drop#Overriding Proposed Actions}{this can be overridden} if
- required.
-
- In both Qt 3 and Qt 4, it is necessary to accept a given drag event in order
- to receive the corresponding drop event. A custom widget in Qt 3 that can
- accept dropped data in the form of text or images might provide an
- implementation of \l{QWidget::}{dropEvent()} that looks like the following:
-
- \snippet doc/src/snippets/code/doc_src_dnd.qdoc 2
-
- In Qt 4, the event is handled in a similar way:
-
- \snippet doc/src/snippets/porting4-dropevents/window.cpp 1
-
- It is also possible to extract data stored for a particular MIME type if it
- was specified by the drag source.
-
- \section1 MIME Types and Data
-
- In Qt 3, data to be transferred in drag and drop operations is encapsulated
- in instances of \c QDragObject and its subclasses, representing specific
- data formats related to common MIME type and subtypes.
-
- In Qt 4, only the QMimeData class is used to represent data, providing a
- container for data stored in multiple formats, each associated with
- a relevant MIME type. Since arbitrary MIME types can be specified, there is
- no need for an extensive class hierarchy to represent different kinds of
- information. Additionally, QMimeData it provides some convenience functions
- to allow the most common data formats to be stored and retrieved with less
- effort than for arbitrary MIME types.
-*/