0
点赞
收藏
分享

微信扫一扫

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


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…


举报

相关推荐

0 条评论