Qt拖放事件与拖放操作

        一、拖放操作相关事件

        启动拖动操作需要创建一个QDrag对象描述拖动操作,以及创建一个QMimeData类的对象用于存储拖动操作的格式信息和数据,并将其赋值为QDrag对象的mimeData属性。当拖动操作移动到放置点时,首先触发dragEnterEvent()事件处理函数,此函数中一般要通过QDrag对象的mimeData数据判断拖动操作的来源和参数,以确定是否接受放置操作。在接受放置后,触发dropEvent()事件处理函数。

        是否接受拖动操作(组件):

void setAcceptDrops(bool on);

        QMimeData对象可能用多种格式存储同一数据。用于记录有关其MIME类型的信息的数据提供容器。使用函数:

QStringList QMimeData::formats() const;

        返回对象支持的格式列表。formats()能够返回合适数据的 MIME 类型列表,列表中的格式按优先级排序。执行效果:

application/x-qt-windows-mime;value="Shell IDList Array"
application/x-qt-windows-mime;value="DragImageBits"
application/x-qt-windows-mime;value="DragContext"
application/x-qt-windows-mime;value="DragSourceHelperFlags"
application/x-qt-windows-mime;value="InShellDragLoop"
text/uri-list //是标准的MIME格式,表示URL或本机上的文件来源
application/x-qt-windows-mime;value="FileName"
application/x-qt-windows-mime;value="FileContents"
application/x-qt-windows-mime;value="FileNameW"
application/x-qt-windows-mime;value="FileGroupDescriptorW"

        在得知MIME的数据格式是text/uri-list后,可使用QMimeData的函数urls()获取一个列表。

QList<QUrl> QMimeData::urls() const;//返回一个QUel的列表数据,函数QUrl::path()可返回URL的路径

二、实现

        1、在widget.h中重新实现事件处理函数

protected:
    void dragEnterEvent(QDragEnterEvent* event);//拖拽文件进入窗口时触发的事件处理函数
    void resizeEvent(QResizeEvent* event);//窗口改变大小时触发的事件处理函数
    void dropEvent(QDropEvent* event);//窗口文件在窗口上放置时触发的事件处理函数

        2、widget构造函数

//设置背景色
    ui->lab_3_4->setStyleSheet("background-color:rgb(204,255,255)");
    ui->lab_4_3->setStyleSheet("background-color:rgb(204,255,255)");
    ui->plainTextEdit->setStyleSheet(("background-color:rgb(192,192,192)"));
    this->setStyleSheet("background-color:rgb(0,0,0)");
    //设置文本
    ui->lab_3_4->setText("3:4.png");
    ui->lab_3_4->setAlignment(Qt::AlignCenter);
    ui->lab_4_3->setText("4:3.png");
    ui->lab_4_3->setAlignment(Qt::AlignCenter);
    //设置图片适应组件大小
    ui->lab_3_4->setScaledContents(true);
    ui->lab_4_3->setScaledContents(true);
    //组件是否接受放置操作?
    this->setAcceptDrops(true);//窗口接受
    ui->plainTextEdit->setAcceptDrops(false);
    ui->lab_3_4->setAcceptDrops(false);//lab不接受,交给窗口处理
    ui->lab_4_3->setAcceptDrops(false);//lab不接受,交给窗口处理

        3、dragEnterEvent()实现

                acceptProposedAction()函数表示接受拖动操作,允许后续的放置操作。

                ignore()函数表示不接受拖动操作,不允许后续的放置操作。

                QUrl::path()返回的路径,返回“/C:/Users/Leo/Desktop/飞机.jpg”,需要注意的是开头有一个额外的“/”。(URL统一资源定位符)

ui->plainTextEdit->clear();
    qDebug()<<"放置事件触发";

    //清空lab状态
    ui->lab_3_4->clear();
    ui->lab_4_3->clear();

    for(int i=0;i<event->mimeData()->formats().size();i++)
        ui->plainTextEdit->appendPlainText(event->mimeData()->formats().at(i));
    //formats():
    //返回对象支持的格式列表。这是一个MIME类型列表,对象可以为其返回合适的数据。列表中的格式按优先级顺序排列。
    //对于最常见的数据类型,您可以调用更高级的函数hasText()、hashhtml()、hasUrls()、hasImage()和hasColor()。
    for(int i=0;i<event->mimeData()->urls().size();i++)
    {
        QUrl url=event->mimeData()->urls().at(i);//带路径的文件名
        ui->plainTextEdit->appendPlainText(url.path());
    }
    if(event->mimeData()->hasUrls())//Returns true if the object can return a list of urls; otherwise returns false.
    {
        QString filename=event->mimeData()->urls().at(0).fileName();//获取文件名
        QFileInfo fileinfo(filename);//湖片区文件信息
        QString ext=fileinfo.suffix().toUpper();//获取文件后缀
        if(ext=="JPG"||ext=="PNG")
        {
            event->acceptProposedAction();//接受拖拽操作
            qDebug()<<"acceptProposedAction 接受拖拽事件";
        }
        else
        {
            event->ignore();//忽略事件
            qDebug()<<"ignore 忽略拖拽事件";
        }
    }

        4、dropEvent()实现

    QString filename=event->mimeData()->urls().at(0).path();//获取完整文件名
    filename=filename.right(filename.length()-1);//去掉最左边的 '/'
    QPixmap pixmap(filename);
    int width=pixmap.width();
    int hight=pixmap.height();
    int ratio=width/hight;
    qDebug()<<ratio;
    if(ratio==0)
        ui->lab_4_3->setPixmap(pixmap);
    else if(ratio==1)
        ui->lab_3_4->setPixmap(pixmap);
    event->accept();

        5、resizeEvent()实现

    QSize sz=ui->plainTextEdit->size();
    QSize szwidget=this->size();
    qDebug()<<"szwidget="<<szwidget.width();
    ui->plainTextEdit->resize(szwidget.width()-23,sz.height());
    event->accept();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值