QT 实现windows系统文件拖拽

4 篇文章 0 订阅
3 篇文章 0 订阅

效果预览:

2023-07-05 14-29-11

功能描述:

1.首先实现了根据文件的路径获取了文件的信息,通过 QFileIconProvider 获取图标信息,并在界面上进行展示。

2.dropEvent 是实现拖拽功能的核心。重新此事件函数,并将窗口设置为接受拖拽

setAcceptDrops(true);  /* 允许拖放 */

3.对文件进行类型判断,为了后续功能的使用。进行了简单的分类,图片,音频,视频,APP以及其他。并非判断文件后缀,而是使用QMimeType进行类别判断。

Qt的拖放操作

拖放操作分为拖动Drag和放下Drop,Qt提供了强大的拖放机制,可在帮助文档中通过Drag and Drop关键字查看

在Qt中,数据拖动时会被存储为MIME类型(Multipurpose Internet Mail Extensions)。Qt提供QMimeData类表示MIME类型的数据,并使用QDrag类完成数据的转移,整个拖放操作是在几个鼠标事件和拖放事件中完成的。

拖放事件:

dragEnterEvent() 拖动进入事件;
dropEvent()放下事件

核心代码:

.h
void dragEnterEvent(QDragEnterEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
    void dragLeaveEvent(QDragLeaveEvent *event);
    void dropEvent(QDropEvent *event);
    void mousePressEvent(QMouseEvent* event);
.cpp
void Widget::dragEnterEvent(QDragEnterEvent *event)
{
    // 拖动进入事件
    if(event->mimeData()->hasUrls())  // 数据中是否包含URL
    {
        event->acceptProposedAction();  // 如果数据中包含URL,就接收动作
    }
    else
    {
        event->ignore();  // 如果数据中不包含URL,就忽略该事件
    }
}

void Widget::dropEvent(QDropEvent *event)
{
    // 放下事件
    const QMimeData *mimeData = event->mimeData();  // 获取MIME数据
    if(mimeData->hasUrls())  // 如果数据中包含URL
    {
        QList<QUrl> urlList = mimeData->urls();  // 获取URL列表
        // 将其中的第一个URL表示为本地文件路径
        QString fileName = urlList.at(0).toLocalFile();  // toLocalFile()转换未本地文件路径
        if(!fileName.isEmpty())
        {
            // 文件路径不为空
            QFile file(fileName);
            if(!file.open(QIODevice::ReadOnly))
                return;
            QTextStream in(&file);
            ui->textEdit->setText(in.readAll());  // 将文件中的所有内容读入到控件中
        }
    }
}

ui文件

主要用来展示文件信息,图标以及名称

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>LS_Files</class>
 <widget class="QWidget" name="LS_Files">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>75</width>
    <height>120</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <property name="toolTip">
   <string>假装是文件信息</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <property name="leftMargin">
    <number>0</number>
   </property>
   <property name="topMargin">
    <number>0</number>
   </property>
   <property name="rightMargin">
    <number>0</number>
   </property>
   <property name="bottomMargin">
    <number>0</number>
   </property>
   <property name="spacing">
    <number>0</number>
   </property>
   <item row="0" column="0">
    <layout class="QVBoxLayout" name="verticalLayout">
     <property name="spacing">
      <number>0</number>
     </property>
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <property name="spacing">
        <number>0</number>
       </property>
       <item>
        <spacer name="horizontalSpacer">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>40</width>
           <height>20</height>
          </size>
         </property>
        </spacer>
       </item>
       <item>
        <widget class="QLabel" name="label_pic">
         <property name="minimumSize">
          <size>
           <width>50</width>
           <height>50</height>
          </size>
         </property>
         <property name="maximumSize">
          <size>
           <width>50</width>
           <height>50</height>
          </size>
         </property>
         <property name="styleSheet">
          <string notr="true"/>
         </property>
         <property name="text">
          <string/>
         </property>
        </widget>
       </item>
       <item>
        <spacer name="horizontalSpacer_2">
         <property name="orientation">
          <enum>Qt::Horizontal</enum>
         </property>
         <property name="sizeHint" stdset="0">
          <size>
           <width>40</width>
           <height>20</height>
          </size>
         </property>
        </spacer>
       </item>
      </layout>
     </item>
     <item>
      <spacer name="verticalSpacer">
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20</width>
         <height>4</height>
        </size>
       </property>
      </spacer>
     </item>
    </layout>
   </item>
   <item row="1" column="0">
    <widget class="QLabel" name="label_name">
     <property name="minimumSize">
      <size>
       <width>75</width>
       <height>65</height>
      </size>
     </property>
     <property name="maximumSize">
      <size>
       <width>75</width>
       <height>16777215</height>
      </size>
     </property>
     <property name="styleSheet">
      <string notr="true"/>
     </property>
     <property name="text">
      <string>文件名</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignHCenter|Qt::AlignTop</set>
     </property>
     <property name="wordWrap">
      <bool>true</bool>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

源码:

 https://download.csdn.net/download/scz653037148/88001158https://download.csdn.net/download/scz653037148/88001158GitHub - Qtea653037148/demo_drag_file: windows下拖拽文件windows下拖拽文件. Contribute to Qtea653037148/demo_drag_file development by creating an account on GitHub.https://github.com/Qtea653037148/demo_drag_file

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值