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

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


1、窗体的拖动

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

void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dragLeaveEvent(QDragLeaveEvent *event);
void dropEvent(QDropEvent *event);

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

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

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

重写拖放事件:

#include <QDropEvent>
#include <QMimeData>

protected:
    void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dropEvent(QDropEvent *event);
/* 拖放过程鼠标进入触发 */
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();
    }
}


2、控件的拖动

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

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

然后重写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);
}

ends…

猜你喜欢

转载自blog.csdn.net/qq153471503/article/details/127807873
今日推荐