Qt_GUI_IM_5_3 - 8BitsCoding/RobotMentor GitHub Wiki
The QMimeData class provides a container for data that records information about its MIME type.
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "dragdroplabel.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void mimeChanged(const QMimeData * mimedata);
void on_clearButton_clicked();
private:
Ui::Widget *ui;
DragDropLabel * dragDropLabel;
};
#endif // WIDGET_H#include "widget.h"
#include "ui_widget.h"
#include <QMimeData>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
dragDropLabel = new DragDropLabel(this);
connect(dragDropLabel,&DragDropLabel::mimeChanged,this,&Widget::mimeChanged);
ui->labelLayout->addWidget(dragDropLabel);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mimeChanged(const QMimeData *mimedata)
{
ui->textEdit->clear();
if(!mimedata)
return;
QStringList formats = mimedata->formats();
for( int i= 0; i < formats.size();i++){
QString text;
if (formats[i] == QString("text/plain")) {
text = mimedata->text().simplified();
} else if (formats[i] == QString("text/html")) {
text = mimedata->html().simplified();
}else if (formats[i] == QString("text/uri-list")) {
QList<QUrl> urlList = mimedata->urls();
for (int i = 0; i < urlList.size(); ++i)
text.append(urlList.at(i).toString() + " -/- ");
} else {
QByteArray data = mimedata->data(formats[i]);
for (int i = 0; i < data.size() ; ++i)
text.append(QString("%1 ").arg(uchar(data[i])));
}
QString dataString = QString("%1 | Format : %2 \n | Data : %3 \n------------")
.arg(i)
.arg(formats[i])
.arg(text);
ui->textEdit->append(dataString);
}
}
void Widget::on_clearButton_clicked()
{
ui->textEdit->clear();
}#ifndef DRAGDROPLABEL_H
#define DRAGDROPLABEL_H
#include <QLabel>
#include <QMimeData>
class DragDropLabel : public QLabel
{
Q_OBJECT
public:
explicit DragDropLabel(QWidget *parent = nullptr);
signals:
void mimeChanged(const QMimeData *mimeData = nullptr);
public slots:
// QWidget interface
protected:
void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override;
void dragLeaveEvent(QDragLeaveEvent *event) override;
void dropEvent(QDropEvent *event) override;
private:
void clear();
};
#endif // DRAGDROPLABEL_H#include "dragdroplabel.h"
#include <QDragEnterEvent>
DragDropLabel::DragDropLabel(QWidget *parent) : QLabel(parent)
{
setMinimumSize(100,100);
setAlignment(Qt::AlignCenter);
setAcceptDrops(true);
setText("DROP SPACE");
setAutoFillBackground(true);
}
void DragDropLabel::dragEnterEvent(QDragEnterEvent *event)
{
setText(tr("DROP YOUR DATA HERE"));
setBackgroundRole(QPalette::Highlight);
event->acceptProposedAction();
emit mimeChanged(event->mimeData());
}
void DragDropLabel::dragMoveEvent(QDragMoveEvent *event)
{
event->acceptProposedAction();
}
void DragDropLabel::dragLeaveEvent(QDragLeaveEvent *event)
{
clear();
}
void DragDropLabel::dropEvent(QDropEvent *event)
{
const QMimeData * mimeData = event->mimeData();
if(mimeData->hasText()){
setText(mimeData->text());
setTextFormat(Qt::PlainText);
}else if(mimeData->hasImage()){
setPixmap(qvariant_cast<QPixmap>(mimeData->imageData()));
}else if(mimeData->hasHtml()) {
setText(mimeData->html());
setTextFormat(Qt::RichText);
}else if(mimeData->hasUrls()){
QList<QUrl> urlList = mimeData->urls();
QString text;
for (int i = 0; i < urlList.size(); ++i)
text += urlList.at(i).path() + "-----";
setText(text);
}else{
setText(tr("Data cannot be displayed"));
}
}
void DragDropLabel::clear()
{
setText("DROP SPACE");
setBackgroundRole(QPalette::Dark);
emit mimeChanged();
}