如果在应用程序之外取消拖动
Cancel drag if outside the application
我一直在网上搜索,但我找不到一种方法来将我的拖动范围仅限于我的应用程序。
这是我创建 QDrag 的方法:
void mouseMoveEvent(QMouseEvent *event)
{
if (!(event->buttons() & Qt::LeftButton))
return;
if ((event->pos() - this->_dragStartPos).manhattanLength()
< QApplication::startDragDistance())
return;
if (this->topLevelItemCount() < 1)
return;
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
QList<QTreeWidgetItem*> list = this->selectedItems();
QList<QUrl> urlList;
for (int i = 0; i < list.size(); i++)
{
QFileInfo fileToAdd(list.at(i)->data(0, CustomRole::Path).toString());
QUrl add(QUrl::fromLocalFile(fileToAdd.absoluteFilePath()));
urlList.append(add);
}
mimeData->setUrls(urlList);
drag->setMimeData(mimeData);
drag->setPixmap(QPixmap(":/icons/grey-folder-opened"));
Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
qDebug() << "finish dragging" << dropAction;
delete drag;
}
有targetChanged signal but regarding Qt doc about the exec函数:"On Windows, the Qt event loop is blocked during the operation."
我还设置了所有其他小部件以禁用拖动。
我尝试覆盖 QMainWindow 的 dragLeaveEvent
以忽略所有这些但是不,没有任何改变......
我最终决定通过将其添加到之前的代码来创建我自己的 MIME 类型:
[...]
QByteArray ba;
QDataStream ds(&ba, QIODevice::WriteOnly);
ds << urlList;
mimeData->setData("application/x-fc-windows", ba);
[...]
像魅力一样工作!
我一直在网上搜索,但我找不到一种方法来将我的拖动范围仅限于我的应用程序。 这是我创建 QDrag 的方法:
void mouseMoveEvent(QMouseEvent *event)
{
if (!(event->buttons() & Qt::LeftButton))
return;
if ((event->pos() - this->_dragStartPos).manhattanLength()
< QApplication::startDragDistance())
return;
if (this->topLevelItemCount() < 1)
return;
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
QList<QTreeWidgetItem*> list = this->selectedItems();
QList<QUrl> urlList;
for (int i = 0; i < list.size(); i++)
{
QFileInfo fileToAdd(list.at(i)->data(0, CustomRole::Path).toString());
QUrl add(QUrl::fromLocalFile(fileToAdd.absoluteFilePath()));
urlList.append(add);
}
mimeData->setUrls(urlList);
drag->setMimeData(mimeData);
drag->setPixmap(QPixmap(":/icons/grey-folder-opened"));
Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
qDebug() << "finish dragging" << dropAction;
delete drag;
}
有targetChanged signal but regarding Qt doc about the exec函数:"On Windows, the Qt event loop is blocked during the operation."
我还设置了所有其他小部件以禁用拖动。
我尝试覆盖 QMainWindow 的 dragLeaveEvent
以忽略所有这些但是不,没有任何改变......
我最终决定通过将其添加到之前的代码来创建我自己的 MIME 类型:
[...]
QByteArray ba;
QDataStream ds(&ba, QIODevice::WriteOnly);
ds << urlList;
mimeData->setData("application/x-fc-windows", ba);
[...]
像魅力一样工作!