此代码来自某群,并不是自己写,供给各位学习参考。
废话不多说,直接先看效果图。有兴趣的小伙伴可以学习一下。

这个只是简单的 通过标签打开一个文件,然后可以拖拽一个文件进入框内,然后进行操作。
这里各位可以看到实际上的内容并不是很多,实际里面代码量也不大,可以简单上手学习一下,这里先讲一下用了二个头文件。
在这个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;
}
这里分析一下程序里面的一些有价值和不好看懂的部分

这两个部分是联系在一起的

resizeEvent事件 是可以触发把你窗口大小得拖动,或者你打开运行的时候会调用的。

这个就是打开文件的 ,当我们打开文件选中了文件以后,会变成一个字符串连接,这里qDebug可以打印出来。

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

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

这个代码总体并不复杂,可以作为一些简单熟悉代码开发的文件,慢慢学习,品位其中的一些代码。
有不懂的我们可以相互讨论学习,后续小编也会继续发一些简单的代码 ,供大家学习,也是供自己学习。
这篇博客介绍了如何在Qt中实现文件拖放和打开功能,通过一个简单的示例程序,展示了如何利用resizeEvent和paintEvent事件,以及QMimeData处理拖放事件。内容包括文件选择、画布更新和拖放判断等关键代码解析。
&spm=1001.2101.3001.5002&articleId=103915381&d=1&t=3&u=aaa74abd1edd40109fbec42ae855c7e8)
225

被折叠的 条评论
为什么被折叠?



