zoukankan      html  css  js  c++  java
  • qt5--拖放

    基本原理

    拖放操作包括两个动作:拖动(drag)和放下(drop 或称为放置)
    当被拖动时拖动的数据会被存储为 MIME 类型的对象,MIME 类型使用 QMimeData 类来描述。MIME 类型通常由剪贴板和拖放系统使用,以识别不同类型的数据
    事件产生的顺序为:QDragEnterEvent、QDragMoveEvnet、QDropEvent   
    编写拖放程序的步骤
    1)、在需要接受放下数据的部件上调用 QWidget::setAcceptDrops()函数以使该部件能接受拖放事件。
    2)、启动拖放:通常在 mousePressEvent()或 mouseMoveEvent()函数中启动拖放,记住启动拖放就是调用 QDrag 对象的 exec()函数,因此也可以在 keyPressEvent()等函数中启动拖放(因很少这样做,所以本文不介绍这种情况下的拖放)。在此步把需要拖动的数据保存在 QMimeData 对象中。
    3)、重新实现需要接受放下数据的部件的 dragEnterEvent()事件处理函数。
    4)、根据需要重新实现 dragMoveEvent 或 dropEvent()函数

    文件拖放 

    win.h

    #ifndef WIN_H
    #define WIN_H
    
    #include <QWidget>
    #include <QDragEnterEvent>
    #include <QDebug>
    #include <QMimeData>
    #include <QList>
    #include <QUrl>  //地址
    #include <QFile>
    
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Win; }
    QT_END_NAMESPACE
    
    class Win : public QWidget
    {
        Q_OBJECT
    
    public:
        Win(QWidget *parent = nullptr);
        ~Win();
    
    private:
        Ui::Win *ui;
    
        bool readfile(const QString& filename);
    
    protected:
        void dragEnterEvent(QDragEnterEvent*);//鼠标拖拽进入事件
        //需要 #include <QDragEnterEvent>
        void dropEvent(QDropEvent *event); //拖拽放下事件
        //当drag为accept状态,然后释放鼠标,就会产生dropEvent。我们可以在这个事件里处理本次拖拽附带的Mime信息
    
        //dragMoveEvent  在控件内拖拽移动事件
        //dragLeaveEvent  鼠标拖拽离开控件事件
    
    
    };
    #endif // WIN_H

    win.cpp

    #include "win.h"
    #include "ui_win.h"
    
    Win::Win(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Win)
    {
        ui->setupUi(this);
        ui->textEdit->setAcceptDrops(false);//禁止拖放
        this->setAcceptDrops(true); //允许拖放
    //必须使部件接受放置事件,才会产生以下事件
    
    
    }
    
    Win::~Win()
    {
        delete ui;
    }
    
    bool Win::readfile(const QString &filename)
    {
        QFile file(filename);
       if( file.open(QIODevice::ReadOnly | QIODevice::Text)){
            ui->textEdit->setText("请自己读取文件内容,放到textEdie中");
        }
    
    }
    
    void Win::dragEnterEvent(QDragEnterEvent *e)
    {
        qDebug()<<e->mimeData()->text();   //返回文本
        //拖入文件时返回文件路径QString:"file:///C:/Users/asus/Desktop/aa.png
    file:///C:/Users/asus/Desktop/linsi.txt
    "
        //拖入网络图片时:"https://dss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2152875490,582858957&fm=26&gp=0.jpg"
    
    
    
        if(e->mimeData()->hasFormat("text/uri-list")){
            //hasFormat("text/uri-list")   是指定的类型,返回true
            //MIME类型为 text/uri-list 通常用来描述一个URI的列表。这些URI可以是文件名,可以是URL或者其他的资源描述符
    
    
            e->acceptProposedAction();  //接受拖放-可以继续拖放
            //特别注意:只有接受才会产生dropEvent事件
            //如果没有这句指令,是不会产生dropEvent事件的
    
        }else{
            qDebug()<<"不是URL";
        }
    
    }
    
    void Win::dropEvent(QDropEvent *e)
    {
    QList<QUrl> urls=e->mimeData()->urls();  //返回拖放时所有文件的路径--QUrl数据类型
    //(QUrl("file:///C:/Users/asus/Desktop/aa.png"), QUrl("file:///C:/Users/asus/Desktop/linsi.txt"))
    if(urls.empty()){return;}
    QString str=urls.first().toLocalFile();  //从列表中返回第一个地址,并转化为本地文件地址
    //"C:/Users/asus/Desktop/aa.png"
    ui->lineEdit->setText(str);
    
    readfile(str);
    
    }

    上面工程下载地址:链接:https://pan.baidu.com/s/1YLNAD8D_MO-7uuxnHzZ7SQ    提取码:6666    

  • 相关阅读:
    IOS开发银行系统的四舍五入的算法
    线程通信之初认识
    多线程同步机制练习之银行存钱
    解决线程安全问题方式三:loke锁
    使用同步机制解决单例模式中的懒汉式的线程安全问题
    (对于继承Thread类)线程安全问题解决方式二:同步静态方法
    (对于实现Runnable接口)线程安全问题解决方式二:同步方法
    (对于继承Thread类)线程安全问题解决方式一:同步代码块
    (对于实现Runnable接口)线程安全问题解决方式一:同步代码块
    三个窗口卖票(实现Runnable方式创建线程)之线程安全问题
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13765418.html
Copyright © 2011-2022 走看看