Qt拖拽事件简单实现

1.相关说明

重写resizeEvent(这个按需重写)、dragEnterEvent(拖拽事件函数)、dropEvent(放下事件函数),可以将本地图片拖拽到label标签中

2.相关界面

 

3.相关代码

#include "widget.h"
#include "ui_widget.h"
#include <QDragEnterEvent>
#include <QMimeData>
#include <QFileInfo>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setAcceptDrops(true);
    ui->plainTextEdit->setAcceptDrops(false);
    ui->label->setAcceptDrops(false);
    ui->label->setScaledContents(true);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::resizeEvent(QResizeEvent *event)
{
    QSize sz = ui->plainTextEdit->size();
    ui->plainTextEdit->move(5, 5);
    ui->label->move(5, sz.height()+10);
    ui->plainTextEdit->resize(this->width()-10, sz.height());
    ui->label->resize(this->width()-10, this->height()-sz.height()-20);
    event->accept();
}

void Widget::dropEvent(QDropEvent *event)
{
    QString fullPath = event->mimeData()->urls().at(0).path();
    fullPath = fullPath.right(fullPath.length()-1);
    QPixmap pixmap(fullPath);
    ui->label->setPixmap(pixmap);
    event->accept();
}

void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    ui->plainTextEdit->clear();
    ui->plainTextEdit->appendPlainText("dragEvent事件,mimeData的format:");
    for(auto &item : event->mimeData()->formats()){
        ui->plainTextEdit->appendPlainText(item);
    }
    ui->plainTextEdit->appendPlainText("dragEvent事件,mimeData的urls:");
    for(auto &item : event->mimeData()->urls()){
        ui->plainTextEdit->appendPlainText(item.path());
    }
    if(event->mimeData()->hasUrls()){
        QString filename = event->mimeData()->urls().at(0).fileName();
        QFileInfo fileInfo(filename);
        QString ex = fileInfo.suffix().toUpper();
        if(ex == "JPG"){
            event->acceptProposedAction();
        } else {
            event->ignore();
        }
    } else {
        event->ignore();
    }
}

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT中,拖拽事件通常由QDrag和QDropEvent类处理。以下是一个简单的例子,演示如何在窗口上拖拽一个文本字符串。 1. 在需要支持拖拽的控件(例如QWidget)中,重写mousePressEvent()事件。在此事件中,我们将实例化一个QDrag对象并设置拖拽数据。 void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData(); mimeData->setText("Hello World!"); drag->setMimeData(mimeData); drag->exec(); } } 2. 接下来,我们需要重写dragEnterEvent()和dropEvent()事件。dragEnterEvent()事件拖拽进入控件时触发,我们可以在此事件中检查拖拽的数据类型是否符合我们的要求。如果符合,则调用acceptProposedAction()函数接受拖拽事件。dropEvent()事件在释放拖拽时触发,我们可以在此事件中获取拖拽数据并进行处理。 void MyWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void MyWidget::dropEvent(QDropEvent *event) { QString text = event->mimeData()->text(); // 处理拖拽数据 } 3. 最后,我们需要启用控件的拖拽功能。可以通过设置setDragEnabled()函数来实现。 MyWidget *widget = new MyWidget(); widget->setDragEnabled(true); 这样,我们就完成了一个简单拖拽功能的实现。当用户在窗口上点击左键并拖动时,我们将创建一个拖拽对象并设置数据。当拖拽进入控件时,我们将检查拖拽数据类型是否正确,并接受拖拽事件。当拖拽释放时,我们将获取拖拽数据并进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值