qt拖拽事件重写

1.qt中的拖拽事件步骤

1设置接受拖拽

2重写事件就可以了

3其他的控件如何要可以套模板

2.例子

c 复制代码
#include <QGroupBox>
#include <QObject>
#include <QDragEnterEvent>
#include <QFileInfo>
#include <QMimeData>

//重写,指出拖拽指定的文件进来,可以自己命名什么文件可以拖进来

class DGroupBox : public QGroupBox
{
    Q_OBJECT
public:
    DGroupBox(){
        setAcceptDrops(true);
    }
    
protected:
    void dragEnterEvent(QDragEnterEvent *event) override
    {
        QList<QUrl> urls = event->mimeData()->urls();
        bool acceptDrop = false;
        for (const QUrl &url : urls) {
            QString filePath = url.toLocalFile();
            //if (filePath.endsWith(".txt", Qt::CaseInsensitive))
            if(QFileInfo(filePath).fileName() == m_acceptFileName)
            {
                acceptDrop = true;
                event->setDropAction(Qt::CopyAction);
                event->accept();
                break;
            }
        }
        if (!acceptDrop) {
            event->setDropAction(Qt::IgnoreAction);
            event->ignore();
        }
    }
    
    void dragMoveEvent(QDragMoveEvent *event) override
    {
        switch (event->dropAction()) {
        case Qt::CopyAction:
            event->accept();
            setCursor(Qt::CursorShape::DragCopyCursor);
            break;
        default:
            event->ignore();
            setCursor(Qt::ForbiddenCursor);
            break;
        }
    }
    
    void dropEvent(QDropEvent *event) override
    {
        QList<QUrl> urls = event->mimeData()->urls();
        if (!urls.isEmpty()) {
            for (const QUrl &url : urls) {
                QString filePath = url.toLocalFile();
                //if (filePath.endsWith(".txt", Qt::CaseInsensitive))
                if(QFileInfo(filePath).fileName() == m_acceptFileName)
                {
                    // 将文件路径设置为QLabel的文本
                    emit accpetFile(filePath);
                }
            }
        }
        event->acceptProposedAction();
    }
signals:
    void accpetFile(QString filePath);
    
public:
    void setAcceptFileName(QString name){m_acceptFileName = name;}
private:
    QString m_acceptFileName = "encrypted_data.dat";
    
};

#endif // DGROUPBOX_H
相关推荐
axban1 小时前
QT M/V架构开发实战:QStandardItemModel介绍
开发语言·数据库·qt
油炸自行车2 小时前
【Qt】编写Qt自定义Ui控件步骤
开发语言·c++·qt·ui·自定义ui控件·qt4 自定义ui控件
酷飞飞3 小时前
PyQt 界面布局与交互组件使用指南
python·qt·交互·pyqt
应用市场5 小时前
Qt C++ 图形绘制完全指南:从基础到进阶实战
开发语言·c++·qt
大可门耳7 小时前
Qt第一课:Qt是什么?相对于其他框架的优劣势是什么
开发语言·qt
axban10 小时前
QT M/V架构开发实战:QFileSystemModel介绍
开发语言·qt·架构
another heaven16 小时前
【Qt VS2022调试时无法查看QString等Qt变量信息】解决方法
开发语言·qt
axban17 小时前
QT M/V架构开发实战:QStringListModel介绍
开发语言·数据库·qt
doll ~CJ18 小时前
基于QVTKOpenGLNativeWidget的三维点云可视化实现
c++·qt·软件开发·三维点云可视化
axban21 小时前
QT M/V架构开发实战:M/V架构的初步认识
开发语言·数据库·qt