드래그 가능한 아이콘 예제
'드래그 가능한 아이콘' 예제는 동일한 애플리케이션 내의 위젯 간, 그리고 서로 다른 애플리케이션 간에 이미지 데이터를 드래그 앤 드롭하는 방법을 보여줍니다.
![]()
드래그 앤 드롭이 사용되는 많은 상황에서, 사용자는 특정 위젯에서 드래그를 시작하여 다른 위젯에 페이로드를 드롭합니다. 이 예제에서는 ` QLabel `을 상속하여 드래그 소스로 사용할 레이블을 생성하고, 이를 컨테이너이자 드롭 대상 역할을 하는 ` QWidget` 내부에 배치합니다.
또한, 드래그 앤 드롭 작업이 발생할 때 단순히 이미지 파일만 전송하는 것 이상을 원합니다. 사용자가 드롭 대상에 이미지를 정확하게 배치할 수 있도록, 사용자가 이미지 내 어디를 클릭했는지에 대한 정보도 함께 전송하고자 합니다. 이러한 세부 정보를 포함하려면 데이터에 대한 사용자 정의 MIME 유형을 생성해야 합니다.
DragWidget 클래스 정의
아이콘을 표시하는 데 사용하는 아이콘 위젯은 ` QLabel` 클래스의 서브클래스입니다:
class DragWidget : public QFrame
{
public:
explicit DragWidget(QWidget *parent = nullptr);
protected:
void dragEnterEvent(QDragEnterEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override;
void dropEvent(QDropEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
};QLabel 클래스가 아이콘에 필요한 대부분의 기능을 제공하므로, 드래그 앤 드롭 기능을 구현하기 위해서는 QWidget::mousePressEvent() 메서드만 재정의하면 됩니다.
DragWidget 클래스 구현
DragWidget 의 생성자는 위젯이 닫힐 때 삭제되도록 보장하는 속성을 설정합니다:
DragWidget::DragWidget(QWidget *parent)
: QFrame(parent)
{
setMinimumSize(200, 200);
setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
setAcceptDrops(true);
QLabel *boatIcon = new QLabel(this);
boatIcon->setPixmap(QPixmap(":/images/boat.png"));
boatIcon->move(10, 10);
boatIcon->show();
boatIcon->setAttribute(Qt::WA_DeleteOnClose);
QLabel *carIcon = new QLabel(this);
carIcon->setPixmap(QPixmap(":/images/car.png"));
carIcon->move(100, 10);
carIcon->show();
carIcon->setAttribute(Qt::WA_DeleteOnClose);
QLabel *houseIcon = new QLabel(this);
houseIcon->setPixmap(QPixmap(":/images/house.png"));
houseIcon->move(10, 80);
houseIcon->show();
houseIcon->setAttribute(Qt::WA_DeleteOnClose);
}아이콘에서 드래그를 가능하게 하려면 마우스 클릭 이벤트에 대응해야 합니다. 이를 위해 QWidget::mousePressEvent() 메서드를 재정의하고 QDrag 객체를 설정합니다.
void DragWidget::mousePressEvent(QMouseEvent *event)
{
QLabel *child = static_cast<QLabel*>(childAt(event->position().toPoint()));
if (!child)
return;
QPixmap pixmap = child->pixmap();
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->position().toPoint() - child->pos());아이콘에 대한 픽스맵 데이터와 아이콘 위젯에서 사용자의 클릭에 대한 정보를 전송할 예정이므로, ` QByteArray `를 생성하고 ` QDataStream`를 사용하여 세부 정보를 묶어줍니다.
상호 운용성을 위해 드래그 앤 드롭 작업은 MIME 유형을 사용하여 포함된 데이터를 설명합니다. Qt에서는 QMimeData 객체를 사용하여 이 데이터를 설명합니다:
이를 위해 비공식 MIME 유형을 선택하고, QByteArray 를 MIME 데이터 객체에 전달합니다.
드래그 앤 드롭 작업 자체는 QDrag 객체에 의해 처리됩니다:
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->position().toPoint() - child->pos());여기서는 데이터를 드래그 객체에 전달하고, 작업 중에 커서 옆에 표시될 픽스맵을 설정하며, 이 픽스맵의 위치를 커서 바로 아래에 배치하는 핫스팟의 위치를 정의합니다.
© 2026 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.