gpt4 book ai didi

qt - 在不破坏 DropArea 的情况下拒绝拖放到 DropArea 中的外部文件

转载 作者:行者123 更新时间:2023-12-04 12:21:14 28 4
gpt4 key购买 nike

在我的应用程序中,我正在显示音频文件列表,用户可以拖动外部文件将其添加到列表中。如果我的应用程序不支持列表中的文件,我希望能够拒绝拖动。

问题是当我调用 drag.accepted = false;onEntered我的DropArea然后它变得对任何其他事件完全没有反应。

这是一些显示问题的示例代码。如果您在窗口中拖动 MP3,您会看到它可以正常工作。然后,如果您拖动任何其他文件,它将无法正常工作,正如预期的那样。但随后拖了一个MP3文件返回也不起作用。

import QtQuick 2.1
import QtQuick.Window 2.0

ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480

DropArea {
anchors.fill: parent
onEntered: {
console.log("[Droparea] entered");

// Ensure at least one file is supported before accepted the drag
var validFile = false;
for(var i = 0; i < drag.urls.length; i++) {
if(validateFileExtension(drag.urls[i])) {
validFile = true;
break;
}
}

if(!validFile) {
console.log("No valid files, refusing drag event");
drag.accepted = false;
return false;
}
}

onExited: {
console.log("[Droparea] entered");

}

onDropped: {
console.log("[Droparea] dropped");
}

// Only MP3s
function validateFileExtension(filePath) {
var extension = filePath.split('.').pop();
var valid = false;

if(extension == "mp3") {
valid = true;
}

return valid;
}
}

Text {
id: textDrop
anchors.centerIn: parent
text: "Please drag element"
}

}
DropArea 中是否有错误?还是我误解了什么?我知道我可以过滤 onDropped 中的文件,但是当您将文件拖动到不接受它们的区域时,您会失去在 OSX 上获得的视觉反馈。

最佳答案

一直是 known bug需很长时间。已经提交了一个补丁,经过几个月的停滞,现在是 merged into 5.6 branch .

任何想要使用此功能的人都必须升级到 Qt 5.6 或 MANULLY 将可用补丁集成到他/她的 Qt 版本中。

QQuickDropAreaPrivate , 包含在 DropArea ,更新 containsDrag 标记为 true当一个 dragEnterEvent发生,发出 entered 信号。它更新 containsDragfalse当一个 dragLeaveEvent发生,发出 exited 信号。但是,当拖动事件不被接受时dragLeaveEvent永远不会被调用,从而使私有(private)对象处于不一致的状态。随后的每个 dragEnterEventcontainsDrag 后被丢弃仍然是 true ,即之前的拖动事件仍然被认为是事件的,entered不再发射。

由于该问题与私有(private) API 之间的交互和公共(public) API 的使用有关,因此该问题不影响使用 keys 进行过滤。 .不幸的是,这种方法似乎不适合所呈现的用例。

一个 相当偏解决方法是使用 MouseArea连同 DropArea .后者在发生拒绝时自行禁用,而前者启用 DropArea为下一滴。此解决方法涵盖了将错误项目放入 DropArea 的常见情况。 ,这对于最终用户来说是最常见和最直观的。在 DropArea 之外发布错误的项目使机制无效(直到下一次下降)。

这是代码:

import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0

ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true

MouseArea {
anchors.fill: parent
hoverEnabled: true
enabled: !drop.enabled
onContainsMouseChanged: drop.enabled = true
}

DropArea {
id: drop
anchors.fill: parent

onEntered: {
console.log("[Droparea] entered");
// Ensure at least one file is supported before accepted the drag
for(var i = 0; i < drag.urls.length; i++)
if(validateFileExtension(drag.urls[i]))
return
console.log("No valid files, refusing drag event")
drag.accept()
drop.enabled = false
}

onExited: console.log("[Droparea] exited")

onDropped: console.log("[Droparea] dropped")

// Only MP3s
function validateFileExtension(filePath) {
return filePath.split('.').pop() == "mp3"
}
}

Text {
id: textDrop
anchors.centerIn: parent
text: "Please drag element"
}
}

关于qt - 在不破坏 DropArea 的情况下拒绝拖放到 DropArea 中的外部文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22787242/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com