Qt_GUI_IM_5_3 - 8BitsCoding/RobotMentor GitHub Wiki

목차


QMimeData란?

The QMimeData class provides a container for data that records information about its MIME type.


widget.h

#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

widget.cpp

#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();
}

DragDropLabel.h

#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

DragDropLabel.cpp

#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();
}
⚠️ **GitHub.com Fallback** ⚠️