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…