首页 > 其他分享 >Qt | 拖放、拖动的使用、将文件拖入使用示例

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

时间:2023-02-01 21:33:22浏览次数:47  
标签:Qt 示例 拖动 void QEvent qDebug event 拖放


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…


标签:Qt,示例,拖动,void,QEvent,qDebug,event,拖放
From: https://blog.51cto.com/u_15950551/6031873

相关文章

  • QTableView的样式设置和常用函数
    QTableView用于显示二维数据,常常与QStandardItemModel结合使用。目录样式设置表头样式设置表头样式设置注意事项表格样式设置常用函数model相关tableView相关headerView......
  • Qt | QDialogButtonBox使用示例
    Qt|QDialogButtonBox使用示例1、简介QDialogButtonBox类,该类包含很多按钮控件,在窗体(widget)或者对话框(dialog)有多个按钮的时候,为方便管理就可以使用该类成组进行管理。......
  • Qt | QListWidgetItem返回错误的背景颜色(始终返回颜色值为0)问题解决
    Qt|QListWidgetItem返回错误的背景颜色(始终返回颜色值为0)问题解决使用场景:程序使用QListWidget显示一个列表,这个列表具有点击选择和再次点击取消选择的功能,点击之后需要更......
  • ifc4x3 附录E示例-Georeference_Tiny_Survey_1
    ifc4x3 附录E示例-Georeference_Tiny_Survey_1示例概述意图IFC4x3RC1测量字符串和点及其属性集是项目初始数据的基础,用于任何线性项目的放样,并用于机器控制。因此,如......
  • 【嵌入式】微芯旺KungFu32A156MQT点灯程序
    编译器:ChipON32IDEKF32首先添加A156MQT启动代码然后添加库 然后在项目设置内添加编译路径  以下是点灯代码:#include"system_init.h"#include"kf32a156_gp......
  • QT(9)-QStyleOption及其子类
    1QStyleOptionQStyleOption及其子类包含QStyle函数绘制图形元素所需的所有信息。出于性能考虑,成员函数很少,对成员变量的访问是直接的(即使用。或者->运算符)。这种低级的......
  • QT(9)-QStyleOption及其子类
    1QStyleOptionQStyleOption及其子类包含QStyle函数绘制图形元素所需的所有信息。出于性能考虑,成员函数很少,对成员变量的访问是直接的(即使用。或者->运算符)。这种低级......
  • Qt 事件循环
    一、QT消息/事件循环机制Qt作为一个可视化GUI界面操作系统,是基于事件驱动的,我们程序执行的顺序不再是线性的,而是由一个个应用程序内部或外部的事件进行驱动的,无事件时......
  • 通用usb驱动libusb介绍和使用示例
    小知识:sudoinsmod/lib/modules/2.6.22-14-generic/kernel/drivers/usb/serial/usbserial.kovendor=0x8086product=0xd001同时插上ttyUSB0和ttyUSB1(ch341),obm可以将dkb......
  • Qt QString::contains() QString::startsWith() 在字符串中检索字符串
    函数QString::startsWith()判断一个字符串是否以某个字符串开头。此函数具有两个参数,第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏......