• Qt | 拖放、拖动的使用、将文件拖入使用示例


    Qt | 拖放、拖动的使用、将文件拖入使用示例


    1、窗体的拖动

    Qt的控件本身支持了很强大拖放、拖动功能,对于窗体的拖动,例如QDialog,可以覆写这四个函数:

    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dropEvent(QDropEvent *event);
    
    • 1
    • 2
    • 3
    • 4

    分别是:拖入事件、在Dialog上拖动事件、拖出事件、放下事件。

    另外,还需要设置窗口允许拖动:

        setAcceptDrops(true);  /* 允许拖放 */
        setWindowFlag(Qt::WindowStaysOnTopHint);  /* 置顶窗口 */
    
    • 1
    • 2

    重写拖放事件:

    #include 
    #include 
    
    protected:
        void dragEnterEvent(QDragEnterEvent *event);
        void dragMoveEvent(QDragMoveEvent *event);
        void dragLeaveEvent(QDragLeaveEvent *event);
        void dropEvent(QDropEvent *event);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    /* 拖放过程鼠标进入触发 */
    void Dialog::dragEnterEvent(QDragEnterEvent *event)
    {
        if (event->mimeData()->hasUrls())  /* 有效数据触发接下来的事件 */
        {
            event->acceptProposedAction();
        }else {
            event->ignore();  /* 无效数据直接忽略 */
        }
        qDebug() << "进入拖放区";
    }
    
    /* 正在窗口内拖动时触发 */
    void Dialog::dragMoveEvent(QDragMoveEvent *event)
    {
        qDebug() << "正在拖动";
    }
    
    /* 鼠标离开时触发 */
    void Dialog::dragLeaveEvent(QDragLeaveEvent *event)
    {
        qDebug() << "离开拖放区";
    }
    
    /* 拖动放下触发 */
    void Dialog::dropEvent(QDropEvent *event)
    {
        qDebug() << "在拖放区放下";
        if(event->mimeData()->hasUrls())
        {
            foreach (const QUrl &url, event->mimeData()->urls())
            {
                qDebug() << url.path();
            }
            event->acceptProposedAction();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    2、控件的拖动

    对于控件的拖动,例如使用QLabel拖入文件进行文本显示或者图片显示,那么需要将QLabel的允许拖放打开,并为其安装事件过滤器:

    ui->label->installEventFilter(this);   /* 安装事件过滤器 */
    ui->label->setAcceptDrops(true);       /* 允许label拖放 */
    
    • 1
    • 2

    然后重写QLabel所依附窗口的事件过滤函数:

    protected:
        bool eventFilter(QObject *obj, QEvent *event) override;
    
    bool Dialog::eventFilter(QObject *obj, QEvent *event)
    {
        if(obj == ui->label)
        {
            switch ((int)event->type())
            {
            case QEvent::DragEnter:
            {
                QDragEnterEvent* d = dynamic_cast<QDragEnterEvent *>(event);
                if (d->mimeData()->hasUrls())  /* 有效数据触发接下来的事件 */
                {
                    d->acceptProposedAction();
                }else {
                    event->ignore();  /* 无效数据直接忽略 */
                }
                qDebug() << "拖入";
                break;
            }
    
            case QEvent::DragMove:
            {
                qDebug() << "移动";
                break;
            }
    
            case QEvent::DragLeave:
            {
                qDebug() << "拖离";
                break;
            }
    
            case QEvent::Drop:
            {
                qDebug() << "放下";
                QDropEvent* d = dynamic_cast<QDropEvent *>(event);
                if(d->mimeData()->hasUrls())
                {
                    foreach (const QUrl &url, d->mimeData()->urls())
                    {
                        qDebug() << url.path();  /* 打印出拖入的文件的文件路径 */
                    }
                }
                break;
            }
    
            default:break;
            }
        }
    
        return QDialog::eventFilter(obj, event);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    ends…

  • 相关阅读:
    【手把手带你刷好题】Java刷题记录 01—>>08
    汽车一键启动点火开关按键一键启动按钮型号规格
    js-学习链表
    Mysql的JDBC增删改查
    使用 Node.js 和 Azure Function App 自动更新 Elasticsearch 索引
    深度学习小工具:Linux 环境下的用户命令和脚本顺序执行器
    MySQL详细学习教程(建议收藏)
    Spark大数据实战之五:Spark安装
    HIve数仓新零售项目DWD层的构建
    [附源码]计算机毕业设计JAVAjsp学校失物招领系统
  • 原文地址:https://blog.csdn.net/qq153471503/article/details/127807873