![]() |
Home · Examples |
[Previous: Porting to Qt 4 - Virtual Functions][Porting Guides][Next: Porting .ui Files to Qt 4]
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.
void MyQt3Widget::customStartDragFunction() { QDragObject *d = new QTextDrag( myHighlightedText(), this ); d->dragCopy(); // do NOT delete d. }Similarly, in Qt 4, drag operations are also initiated when a QDrag object is constructed and its 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 exec().
protected void mousePressEvent(QMouseEvent event) { if (event.button().equals(Qt.MouseButton.LeftButton)) { QDrag drag = new QDrag(this); QMimeData mimeData = new QMimeData(); mimeData.setText(text); mimeData.setImageData(image); drag.setMimeData(mimeData); drag.setPixmap(iconPixmap); Qt.DropAction dropAction = drag.exec(); ... event.accept(); } }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 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.
In Qt 3, the drag enter event is handled by checking whether each of the standard QDragObject subclasses can decode the data supplied, and indicating success or failure of these checks via the event's accept() function, as shown in this simple example:
void MyQt3Widget::dragEnterEvent(QDragEnterEvent* event) { event->accept( QTextDrag::canDecode(event) || QImageDrag::canDecode(event) ); }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:
protected void dragEnterEvent(QDragEnterEvent event) { if (event.mimeData().hasText() || event.mimeData().hasImage()) event.acceptProposedAction(); }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 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 dropEvent() that looks like the following:
void MyQt3Widget::dropEvent(QDropEvent* event) { QImage image; QString text; if ( QImageDrag::decode(event, image) ) { insertImageAt(image, event->pos()); } else if ( QTextDrag::decode(event, text) ) { insertTextAt(text, event->pos()); } }In Qt 4, the event is handled in a similar way:
protected void dropEvent(QDropEvent event) { if (event.mimeData().hasText()) dataLabel.setText(event.mimeData().text()); else if (event.mimeData().hasImage()) { Object imageData = event.mimeData().imageData(); dataLabel.setPixmap((QPixmap) imageData); } event.acceptProposedAction(); }It is also possible to extract data stored for a particular MIME type if it was specified by the drag source.
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.
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) | Trademarks | Qt Jambi 4.5.2_01 |