Drop Site Example¶
The example shows how to distinguish the various MIME formats available in a drag and drop operation.
The Drop Site example accepts drops from other applications, and displays the MIME formats provided by the drag object.
There are two classes,
DropArea
andDropSiteWindow
, and amain()
function in this example. ADropArea
object is instantiated inDropSiteWindow
; aDropSiteWindow
object is then invoked in themain()
function.
DropArea Class Definition¶
The
DropArea
class is a subclass ofQLabel
with a public slot,clear()
, and achanged()
signal.class DropArea : public QLabel { Q_OBJECT public: explicit DropArea(QWidget *parent = nullptr); public slots: void clear(); signals: void changed(const QMimeData *mimeData = nullptr);In addition,
DropArea
also contains a private instance ofQLabel
and reimplementations of fourQWidget
event handlers:
dragEnterEvent()
dragMoveEvent()
dragLeaveEvent()
dropEvent()
These event handlers are further explained in the implementation of the
DropArea
class.protected: void dragEnterEvent(QDragEnterEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; void dropEvent(QDropEvent *event) override; private: QLabel *label; };
DropArea Class Implementation¶
In the
DropArea
constructor, we set theminimum size
to 200x200 pixels, theframe style
to bothSunken
andStyledPanel
, and we align its contents to the center.DropArea::DropArea(QWidget *parent) : QLabel(parent) { setMinimumSize(200, 200); setFrameStyle(QFrame::Sunken | QFrame::StyledPanel); setAlignment(Qt::AlignCenter); setAcceptDrops(true); setAutoFillBackground(true); clear(); }Also, we enable drop events in
DropArea
by setting theacceptDrops
property totrue
. Then, we enable theautoFillBackground
property and invoke theclear()
function.The
dragEnterEvent()
event handler is called when a drag is in progress and the mouse enters theDropArea
object. For theDropSite
example, when the mouse entersDropArea
, we set its text to “<drop content>” and highlight its background.<Code snippet "draganddrop/dropsite/droparea.cpp:dragEnterEvent() function" not found>Then, we invoke
acceptProposedAction()
onevent
, setting the drop action to the one proposed. Lastly, we emit thechanged()
signal, with the data that was dropped and its MIME type information as a parameter.For
dragMoveEvent()
, we just accept the proposedQDragMoveEvent
object,event
, withacceptProposedAction()
.<Code snippet "draganddrop/dropsite/droparea.cpp:dragMoveEvent() function" not found>The
DropArea
class’s implementation ofdropEvent()
extracts theevent
‘s mime data and displays it accordingly.<Code snippet "draganddrop/dropsite/droparea.cpp:dropEvent() function part1" not found>The
mimeData
object can contain one of the following objects: an image, HTML text, plain text, or a list of URLs.<Code snippet "draganddrop/dropsite/droparea.cpp:dropEvent() function part2" not found>
If
mimeData
contains an image, we display it inDropArea
withsetPixmap()
.If
mimeData
contains HTML, we display it withsetText()
and setDropArea
’s text format asRichText
.If
mimeData
contains plain text, we display it withsetText()
and setDropArea
’s text format asPlainText
. In the event thatmimeData
contains URLs, we iterate through the list of URLs to display them on individual lines.If
mimeData
contains other types of objects, we setDropArea
’s text, withsetText()
to “Cannot display data” to inform the user.We then set
DropArea
‘sbackgroundRole
toDark
and we acceptevent
‘s proposed action.<Code snippet "draganddrop/dropsite/droparea.cpp:dropEvent() function part3" not found>The
dragLeaveEvent()
event handler is called when a drag is in progress and the mouse leaves the widget.<Code snippet "draganddrop/dropsite/droparea.cpp:dragLeaveEvent() function" not found>For
DropArea
‘s implementation, we clear invokeclear()
and then accept the proposed event.The
clear()
function sets the text inDropArea
to “<drop content>” and sets thebackgroundRole
toDark
. Lastly, it emits thechanged()
signal.<Code snippet "draganddrop/dropsite/droparea.cpp:clear() function" not found>
DropSiteWindow Class Definition¶
The
DropSiteWindow
class contains a constructor and a public slot,updateFormatsTable()
.class DropSiteWindow : public QWidget { Q_OBJECT public: DropSiteWindow(); public slots: void updateFormatsTable(const QMimeData *mimeData); void copy(); private: DropArea *dropArea; QLabel *abstractLabel; QTableWidget *formatsTable; QPushButton *clearButton; QPushButton *copyButton; QPushButton *quitButton; QDialogButtonBox *buttonBox; };The class also contains a private instance of
DropArea
,dropArea
,QLabel
,abstractLabel
,QTableWidget
,formatsTable
,QDialogButtonBox
,buttonBox
, and twoQPushButton
objects,clearButton
andquitButton
.
DropSiteWindow Class Implementation¶
In the constructor of
DropSiteWindow
, we instantiateabstractLabel
and set itswordWrap
property totrue
. We also call theadjustSize()
function to adjustabstractLabel
‘s size according to its contents.DropSiteWindow::DropSiteWindow() { abstractLabel = new QLabel(tr("This example accepts drags from other " "applications and displays the MIME types " "provided by the drag object.")); abstractLabel->setWordWrap(true); abstractLabel->adjustSize();Then we instantiate
dropArea
and connect itschanged()
signal toDropSiteWindow
‘supdateFormatsTable()
slot.dropArea = new DropArea; connect(dropArea, &DropArea::changed, this, &DropSiteWindow::updateFormatsTable);We now set up the
QTableWidget
object,formatsTable
. Its horizontal header is set using aQStringList
object,labels
. The number of columms are set to two and the table is not editable. Also, theformatTable
‘s horizontal header is formatted to ensure that its second column stretches to occupy additional space available.QStringList labels; labels << tr("Format") << tr("Content"); formatsTable = new QTableWidget; formatsTable->setColumnCount(2); formatsTable->setEditTriggers(QAbstractItemView::NoEditTriggers); formatsTable->setHorizontalHeaderLabels(labels); formatsTable->horizontalHeader()->setStretchLastSection(true);Three
QPushButton
objects,clearButton
,copyButton
, andquitButton
, are instantiated and added tobuttonBox
- aQDialogButtonBox
object. We useQDialogButtonBox
here to ensure that the push buttons are presented in a layout that conforms to the platform’s style.clearButton = new QPushButton(tr("Clear")); copyButton = new QPushButton(tr("Copy")); quitButton = new QPushButton(tr("Quit")); buttonBox = new QDialogButtonBox; buttonBox->addButton(clearButton, QDialogButtonBox::ActionRole); buttonBox->addButton(copyButton, QDialogButtonBox::ActionRole); #if !QT_CONFIG(clipboard) copyButton->setVisible(false); #endif buttonBox->addButton(quitButton, QDialogButtonBox::RejectRole); connect(quitButton, &QAbstractButton::clicked, this, &QWidget::close); connect(clearButton, &QAbstractButton::clicked, dropArea, &DropArea::clear); connect(copyButton, &QAbstractButton::clicked, this, &DropSiteWindow::copy);The
clicked()
signals forcopyButton
,clearButton
, andquitButton
are connected tocopy()
,clear()
andclose()
, respectively.For the layout, we use a
QVBoxLayout
,mainLayout
, to arrange our widgets vertically. We also set the window title to “Drop Site” and the minimum size to 350x500 pixels.QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(abstractLabel); mainLayout->addWidget(dropArea); mainLayout->addWidget(formatsTable); mainLayout->addWidget(buttonBox); setWindowTitle(tr("Drop Site")); setMinimumSize(350, 500); }We move on to the
updateFormatsTable()
function. This function updates theformatsTable
, displaying the MIME formats of the object dropped onto theDropArea
object. First, we setQTableWidget
‘srowCount
property to 0. Then, we validate to ensure that theQMimeData
object passed in is a valid object.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part1" not found>Once we are sure that
mimeData
is valid, we iterate through its supported formats.Note
The
formats()
function returns aQStringList
object, containing all the formats supported by themimeData
.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part2" not found>Within each iteration, we create a
QTableWidgetItem
,formatItem
and we set itsflags
toItemIsEnabled
, and itstext alignment
toAlignTop
andAlignLeft
.A
QString
object,text
, is customized to display data according to the contents offormat
. We invokeQString
‘ssimplified()
function ontext
, to obtain a string that has no additional space before, after or in between words.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part3" not found>If
format
contains a list of URLs, we iterate through them, using spaces to separate them. On the other hand, ifformat
contains an image, we display the data by converting the text to hexadecimal.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part4" not found>Once
text
has been customized to contain the appropriate data, we insert bothformat
andtext
intoformatsTable
withsetItem()
. Lastly, we invokeresizeColumnToContents()
onformatsTable
‘s first column.
The main() Function¶
Within the
main()
function, we instantiateDropSiteWindow
and invoke itsshow()
function.<Code snippet "draganddrop/dropsite/main.cpp:main() function" not found>
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.