Qt 文件拖动和打开文件(新手练习程序)

这篇博客介绍了如何在Qt中实现文件拖放和打开功能,通过一个简单的示例程序,展示了如何利用resizeEvent和paintEvent事件,以及QMimeData处理拖放事件。内容包括文件选择、画布更新和拖放判断等关键代码解析。

此代码来自某群,并不是自己写,供给各位学习参考。
废话不多说,直接先看效果图。有兴趣的小伙伴可以学习一下。
在这里插入图片描述
这个只是简单的 通过标签打开一个文件,然后可以拖拽一个文件进入框内,然后进行操作。
工程图这里各位可以看到实际上的内容并不是很多,实际里面代码量也不大,可以简单上手学习一下,这里先讲一下用了二个头文件。
在这个widget.ui界面设计里面有2个框在这里插入图片描述
大家可以看到界面里面有两个框,一个是建立QT的时候 生成的一个UI ,另外一个是提升的,当然这里假设各位已经会的, 如果不会可以私聊我,提升来源于头文件里面的在这里插入图片描述各位可以看到类名是一致的。
这样得话 就可以通过我们自己建立的UI 和新生成的类联系在了一起(刚开始自己看的时候不是特别理解,这里给各位讲一下,少走一点弯路)。好了,该上代码了,各位最关心的。

在这里插入图片描述

在这里插入图片描述
这个是我刚建立文件的时候 我没有改文件名 自己生成的带UI的文件,这里大家可以看到并没有代码在里面,而都在另外一个filedropcomponent里面,这就说明,在UI里面通过提升,就像实例化了一样 可以供我们使用里面的功能。

在这里插入图片描述
关键文件就是这个 ,重点会讲解方框里面的4个部分。

#include "filedropcomponent.h"
#include <QDebug>
#include <QDragEnterEvent>
#include <QFileInfo>
#include <QTextCodec>
#include <QMimeData>
#include <QStyleOption>
#include <QPainter>
#include <QFileDialog>


FileDropComponent::FileDropComponent(QWidget *parent) : QWidget(parent)
{   
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

    setAcceptDrops(true);
    m_filenameLabel = new QLabel(this);
    m_filenameLabel->setObjectName("filenameLabel");
    m_filenameLabel->setStyleSheet("QLabel#filenameLabel{font-size:12px;color:#666666;}");
    const QString&& filelabelText = QString("选择文件 %1").arg(QString("<style> a{ text-decoration: none;}</style><a href = '#'>点我</a>"));
    m_filenameLabel->setText(filelabelText);
    m_filenameLabel->setScaledContents(true);
    m_filenameLabel->adjustSize();
    connect(m_filenameLabel,SIGNAL(linkActivated(const QString&)),this,SLOT(onFilenameLabelClicked(const QString &)));

}

void FileDropComponent::updateFileLabelPosition()
{
    m_filenameLabel->move((this->width() - m_filenameLabel->width()) / 2, this->height() - 60);
}

void FileDropComponent::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasUrls()){
        const auto&& fileUrllst = event->mimeData()->urls();
        for (const auto& url : fileUrllst) {
            if (url.isLocalFile()){
                qDebug() << url.toLocalFile();
            }
        }
    }
    else{
        event->ignore();
    }
}

void FileDropComponent::paintEvent(QPaintEvent *event)
{
    QWidget::paintEvent(event);
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

void FileDropComponent::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls())
    {
        const auto && fileUrllst=event->mimeData()->urls();
        if (fileUrllst.isEmpty() || fileUrllst.size() > 1){
            event->ignore();
            return;
        }
        else if (QFileInfo(fileUrllst.first().toLocalFile()).isDir())
        {

            event->ignore();
            return;
        }
        event->acceptProposedAction();
    }

}

void FileDropComponent::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event);
    updateFileLabelPosition();
}

void FileDropComponent::onFilenameLabelClicked(const QString &)
{
    QString fileName = QFileDialog::getOpenFileName(this, QString("选择文件"));
    qDebug() << "-------" << fileName;
}

这里分析一下程序里面的一些有价值和不好看懂的部分
在这里插入图片描述
在这里插入图片描述这两个部分是联系在一起的

点我这个部分就是生成蓝色的可点的代码。 前面text-decoration是去掉蓝色下面的下划线,假设你们不用 只用后面部分 就会有下划线,这段代码其实是两段字符拼在了一起,用法可F1 ,假设不熟悉 可以写两个QString进去。

在这里插入图片描述
resizeEvent事件 是可以触发把你窗口大小得拖动,或者你打开运行的时候会调用的。
在这里插入图片描述
这个就是打开文件的 ,当我们打开文件选中了文件以后,会变成一个字符串连接,这里qDebug可以打印出来。

在这里插入图片描述
paintEvent事件是画图,调用了repaint()或update(),小部件已被隐藏,现在已被发现,或者
还有很多其他原因。(小编这里用的不好,但是当你没有这个的时候,你就少了一个图层,你就显示不了,这里就相当于是给了你一个画板,然后在上面画了图,没有这个就没有画板,在你后面写的头文件里面 就没法)。

在这里插入图片描述
当我们拖动框到我们的部件的时候就会触发这个,event->mimeData()->hasUrls() 中mimeData(),
QMimeData类提为数据提供一个容器,用来记录关于MIME类型数据的信息
QMimeData常用来描述保存在剪切板里信息,或者拖拽原理
QMimeData对象把它所保存的信息和正确的MIME类型连接起来来保证信息可以被安全的在应用程序之间转移
然后得到我们文件的urls 。
fileUrllst.first().toLocalFile()).isDir() 这段代码看拖进来的文件是不是目录URL,如果是目录就返回false。
在这里插入图片描述这段代码比较关键,当我们确定了这个是我们要得一般文件以后。使用这个acceptProposeAction(),就相当于可以启动dropEvent ,当我们在程序里 释放我们拖动的文件 就会调用这个

在这里插入图片描述
这个代码总体并不复杂,可以作为一些简单熟悉代码开发的文件,慢慢学习,品位其中的一些代码。
有不懂的我们可以相互讨论学习,后续小编也会继续发一些简单的代码 ,供大家学习,也是供自己学习。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值