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,
DropAreaandDropSiteWindow, and amain()function in this example. ADropAreaobject is instantiated inDropSiteWindow; aDropSiteWindowobject is then invoked in themain()function.
DropArea Class Definition¶
The
DropAreaclass is a subclass ofQLabelwith 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,
DropAreaalso contains a private instance ofQLabeland reimplementations of fourQWidgetevent handlers:
dragEnterEvent()
dragMoveEvent()
dragLeaveEvent()
dropEvent()These event handlers are further explained in the implementation of the
DropAreaclass.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
DropAreaconstructor, we set theminimum sizeto 200x200 pixels, theframe styleto bothSunkenandStyledPanel, 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
DropAreaby setting theacceptDropsproperty totrue. Then, we enable theautoFillBackgroundproperty and invoke theclear()function.The
dragEnterEvent()event handler is called when a drag is in progress and the mouse enters theDropAreaobject. For theDropSiteexample, 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 proposedQDragMoveEventobject,event, withacceptProposedAction().<Code snippet "draganddrop/dropsite/droparea.cpp:dragMoveEvent() function" not found>The
DropAreaclass’s implementation ofdropEvent()extracts theevent‘s mime data and displays it accordingly.<Code snippet "draganddrop/dropsite/droparea.cpp:dropEvent() function part1" not found>The
mimeDataobject 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
mimeDatacontains an image, we display it inDropAreawithsetPixmap().If
mimeDatacontains HTML, we display it withsetText()and setDropArea’s text format asRichText.If
mimeDatacontains plain text, we display it withsetText()and setDropArea’s text format asPlainText. In the event thatmimeDatacontains URLs, we iterate through the list of URLs to display them on individual lines.If
mimeDatacontains other types of objects, we setDropArea’s text, withsetText()to “Cannot display data” to inform the user.We then set
DropArea‘sbackgroundRoletoDarkand 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 inDropAreato “<drop content>” and sets thebackgroundRoletoDark. Lastly, it emits thechanged()signal.<Code snippet "draganddrop/dropsite/droparea.cpp:clear() function" not found>
DropSiteWindow Class Definition¶
The
DropSiteWindowclass 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 twoQPushButtonobjects,clearButtonandquitButton.
DropSiteWindow Class Implementation¶
In the constructor of
DropSiteWindow, we instantiateabstractLabeland set itswordWrapproperty 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
dropAreaand connect itschanged()signal toDropSiteWindow‘supdateFormatsTable()slot.dropArea = new DropArea; connect(dropArea, &DropArea::changed, this, &DropSiteWindow::updateFormatsTable);We now set up the
QTableWidgetobject,formatsTable. Its horizontal header is set using aQStringListobject,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
QPushButtonobjects,clearButton,copyButton, andquitButton, are instantiated and added tobuttonBox- aQDialogButtonBoxobject. We useQDialogButtonBoxhere 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, andquitButtonare 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 theDropAreaobject. First, we setQTableWidget‘srowCountproperty to 0. Then, we validate to ensure that theQMimeDataobject passed in is a valid object.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part1" not found>Once we are sure that
mimeDatais valid, we iterate through its supported formats.Note
The
formats()function returns aQStringListobject, containing all the formats supported by themimeData.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part2" not found>Within each iteration, we create a
QTableWidgetItem,formatItemand we set itsflagstoItemIsEnabled, and itstext alignmenttoAlignTopandAlignLeft.A
QStringobject,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
formatcontains a list of URLs, we iterate through them, using spaces to separate them. On the other hand, ifformatcontains an image, we display the data by converting the text to hexadecimal.<Code snippet "draganddrop/dropsite/dropsitewindow.cpp:updateFormatsTable() part4" not found>Once
texthas been customized to contain the appropriate data, we insert bothformatandtextintoformatsTablewithsetItem(). Lastly, we invokeresizeColumnToContents()onformatsTable‘s first column.
The main() Function¶
Within the
main()function, we instantiateDropSiteWindowand 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.