Qt拖放:启用复制时无法移动(Ubuntu Gnome)

     2023-05-08     211

关键词:

【中文标题】Qt拖放:启用复制时无法移动(Ubuntu Gnome)【英文标题】:Qt drag/drop: cannot move when copy is enabled (Ubuntu Gnome) 【发布时间】:2012-07-04 12:55:16 【问题描述】:

我正在实现一个视图和一个模型,我希望在其中支持在内部移动项目(通过拖动)和复制项目(通过在拖动时按 Ctrl)。我已经按照说明完成了我需要做的所有事情。我已经设置了 mime 函数,我已经实现了 removeRows() 和 flags()。问题是当我拖动时,它默认为复制操作(我得到带有加号的箭头光标,它确实通过在模型中创建一个新项目来复制项目)。

我能看到的唯一区别是:如果我在supportedDropActions() 中只返回Qt::MoveAction,它只会移动。如果我返回 (Qt::CopyAction | Qt::MoveAction),它只会复制。

有什么想法吗?我希望它像 Nautilus (Gnome) 或 Windows 文件资源管理器中的文件一样工作:拖动移动图标,ctrl+drag 复制它们。

【问题讨论】:

同样的问题出现在 Windows 上,但Qt::MoveAction 是首选。 如果有人愿意,我可以发布一些示例代码来演示问题。 既然这最终没有回答我的问题,谁觉得他们应该得到赏金? 我是在 Qt 4.7 中将 setDefaultDropAction() 添加到 QAbstractItemView 的人,这是否意味着我应该得到赏金? :-) 大卫,我会考虑给你赏金,但我没有发布它,我什至不知道它,而且它看起来在发布一个月后就结束了。无论如何,感谢您对 Qt 和 KDE 的贡献! (附带说明一下,它仍然困扰着我——有 SIX (6) 个与项目视图的拖放相关的属性!六个!acceptDrops、showDropIndicator、dragEnabled、dragDropOverwriteMode、dragDropMode 和您的defaultDropAction。当然还有一连串代码要编写来执行 MIME 类型,使用 removeRows()、flags() ——就像我说我喜欢 Qt 但哇,拖放很复杂!) 【参考方案1】:

很抱歉,当我发现我做错了什么时,我没有回答这个问题。把我搞砸的代码在QAbstractItemView::startDrag()

if (d->defaultDropAction != Qt::IgnoreAction && (supportedActions & d->defaultDropAction))
        defaultDropAction = d->defaultDropAction;
    else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove)
        defaultDropAction = Qt::CopyAction;

问题是我没有像setDefaultDropAction( Qt::MoveAction ); 那样在小部件上设置 defaultDropAction 属性,因此 startDrag() 默认为 CopyAction。如果 defaultDropAction 是 Qt::MoveAction,那么您可以使用键盘 Ctrl 将正在进行的拖动切换到复制操作,这是我想要的行为。

我喜欢 Qt,但肯定有很多与拖放相关的令人困惑且有些相互交织的属性。很容易得不到正确的属性组合。

底线:确保将 defaultDropAction 设置为 Qt::MoveAction

【讨论】:

只是为了提供更多信息,我必须在 listView 上更改的属性如下:acceptDrops:true,dragEnabled:true,defaultDropAction:MoveAction(这是大的!),selectionMode : ExtendedSelection(也是预期的 Windows Explorer 行为,但不是 QListView 的默认行为)。同样在模型中:setSupportedDragActions(Qt::CopyAction | Qt::MoveAction);,返回 Qt::CopyAction | MyModel::Model::supportedDropActions() 中的 Qt::MoveAction,将 Qt::ItemIsDragEnabled 添加到 MyModel::flags(),实现 MyModel::mimeTypes()、mimeData() 和 dropMimeData。希望有帮助! 这意味着我遇到的错误实际上与您遇到的不同。它看起来像 Windows 上的 Qt 错误。 DK,我很好奇——它是通常基于mingw的Qt SDK(创建者),还是使用Visual Studio编译的Qt(基于WinAPI ?)。另外,我的问题是,使用 Copy 作为默认行为,我根本无法实现 Move,因为没有键盘修饰符可以将 Copy 更改为 Move。你说你Move有问题--那能不能不按住Ctrl改成Copy? 经过更多的实验,似乎 Qt 正在强制外部放置目标决定它想对文件做什么。如果我将文件拖到资源管理器中的任何位置,它会强制使用Qt::TargetMoveAction,但如果我将它拖到 Chromium 上,它会强制使用Qt::CopyAction。键盘修饰符确实有效,但理想情况下,它们不应该是实现正确放置动作所必需的。我正在使用PySide,我相信它会基于mingw。 这看起来确实很奇怪——我不确定为什么放置目标会决定(至少对于默认值)源应该保留其副本(如在 CopyAction 中)还是删除它(如在 MoveAction 中)。看起来这对放置目标没有任何影响。【参考方案2】:

如果你尝试这种方式会怎样 先写一个keyPressEvent,设置是否按下ctrl键 '

keyPressEvent(QKeyEvent *e)
    
        if(e->key() == Qt::Key_Control)
            bControlKeyPressed = true;
    
    keyReleaseEvent (QKeyEvent *e)
    
       if(e->key() == Qt::Key_Control)
          bControlKeyPressed = false;
    

并在鼠标按下事件中检查是否按下了 ctrl 键

`mousePressEvent()
 
  if (bControlKeyPressed) 
    //enable Qt::CopyAction 
else 
    //enable  Qt::MoveAction 
` 

【讨论】:

这样简单的答案是理想的,但 Ubuntu/Windows 只是忽略指定的操作(以及默认操作)。【参考方案3】:

这就是我会做的:

启用复制操作。然后收听拖放信号或覆盖虚拟方法(或任何 Qt 提供的,我没有检查),如果您的意思是移动,请“手动”删除该行。放下后,保存您喜欢的操作。

如果无法从 Qt 数据中确定所需的操作,请检查 Ctrl 键状态并保存一个布尔值,说明它是复制还是移动。现在,当 Qt 发出信号被删除时,检查您选择的操作,然后自己删除移动的行。

(我个人使用 gtkmm,copy-if-Ctrl-is-pressed 效果很好)

【讨论】:

这个解决方案确实有些工作,但有两个问题: a) 拖动图标不正确。 b) 如果选择了多个项目,在它们之间拖动它们会删除一些并复制其他的。 那么我看到了两个选项。 1)just-get-rid-of-it 方法:手动设置图标。对于多选,请自行处理 drop。决定如何移动/复制每个节点。它可能很复杂,这取决于 Qt 如何让您访问拖放数据...... 2)严肃的工程师方法:找出为什么这不能像他们应该的那样工作。 Qt 是免费软件,所以如果有错误,请调查是否可以解决。因此,您为 Qt 的所有用户和使用 Qt 编写的任何应用程序做出了贡献。并且永远不需要任何变通方法。 如果 Windows 内部有问题,您能做的最好的事情就是向他们发送电子邮件。 Windows 是专有软件,所以我认为这是他们的问题,而不是我的问题或你的问题,如果 D&D 不能正常工作的话。或在您的代码中添加临时解决方法,仅适用于 Windows

在触摸屏移动设备上启用拖放

】在触摸屏移动设备上启用拖放【英文标题】:enablingdraganddroponatouchscreenmobiledevice【发布时间】:2010-01-0918:06:19【问题描述】:我最近刚买了一部安卓手机,发现我网站上的拖放不起作用!我明白为什么它不会,但是有没有人找... 查看详情

如何区分 importData 中的复制/移动

...ata【发布时间】:2020-01-1503:57:11【问题描述】:我需要在拖放或复制/剪切和粘贴(复制与移动)期间获取操作类型。这是一个Swing应用程序,实现了TransferHandle。我在操作结束时需要此信息,在importData方法中。对于拖放,似乎可... 查看详情

qt拖拽时复制文字可以修改吗

参考技术A根据应用的区域的不同提供了复制或移动文字两种实现方式: 在同一窗口中移动或复制项 选定要移动或复制的项。 2.请执行下列操作之一: ●若要进行移动,请单击“常用”工具栏上的“剪切”或用快... 查看详情

无法在 AEM 新页面上拖放组件

】无法在AEM新页面上拖放组件【英文标题】:UnabletodragdropcomponentsonAEMnewpage【发布时间】:2021-07-2511:41:10【问题描述】:我正在关注AEM教程wkndtutorial。我已经使用原型创建了项目并将其安装在本地AEM实例上。与创建新页面时的教... 查看详情

无法读取未定义的属性 - cdkDropListData 拖放角材料

】无法读取未定义的属性-cdkDropListData拖放角材料【英文标题】:Cannotreadpropertyofundefined-cdkDropListDatadrag-dropAngularMaterial【发布时间】:2019-05-2113:52:37【问题描述】:我正在使用新的Angular7MaterialCDK拖放功能将项目从一个列表移动到... 查看详情

ubuntu22.04在vmware17无法实现拖放复制操作解决办法(代码片段)

Ubuntu22.04LTS使用open-vm-tools无法实现拖放复制环境:主机:Windows10虚拟机软件:VMwareWorkstationPro17.0虚拟机系统:UbuntuDesktop22.04LTS软件:open-vm-tools(open-vm-tools-desktop)前段时间在VMware17上安装ubuntu22.04LTS后,使用vm... 查看详情

启用复制粘贴[关闭]时无法连接到virtualbox内核服务(代码片段)

我尝试在OracleVirtualBox中启用复制粘贴功能。为了实现这一目标,我运行:sudo/usr/bin/VBoxClient--clipboard我明白了FailedtoconnecttotheVirtualBoxkernelservice这是什么意思,我该如何解决?我尝试用sudo启动VirtualBox,但它没有用。我提到我安装... 查看详情

新的拖放机制在 Qt-Quick (Qt 5.3) 中无法按预期工作

】新的拖放机制在Qt-Quick(Qt5.3)中无法按预期工作【英文标题】:Newdrag-and-dropmechanismdoesnotworkasexpectedinQt-Quick(Qt5.3)【发布时间】:2014-08-2307:33:45【问题描述】:我尝试使用新的QML类型Drag、DragEvent和DropArea在Qt5.3中实现拖放。这是来... 查看详情

java示例代码_在Java Swing中拖放时启用工具提示显示

java示例代码_在Java Swing中拖放时启用工具提示显示 查看详情

Angular CDK 拖放:不要移动源项目

】AngularCDK拖放:不要移动源项目【英文标题】:AngularCDKDrag&Drop:Don\'tmovesourceitem【发布时间】:2019-09-3012:11:37【问题描述】:我正在尝试实现一个编辑器,可以在其中拖动项目以将其添加到主要内容中,问题是当我拖出源项目... 查看详情

如何将 JLabel 中的图标(拖放)移动到另一个 JLabel 而不是复制它?

】如何将JLabel中的图标(拖放)移动到另一个JLabel而不是复制它?【英文标题】:HowdoImoveanicon(drag&drop)insideaJLabeltoanotherJLabelinsteadofcopyingit?【发布时间】:2020-01-1509:37:57【问题描述】:我正在为一个国际象棋游戏做一个学校项... 查看详情

如何在回收站视图上启用和禁用拖放

】如何在回收站视图上启用和禁用拖放【英文标题】:HowtoenableanddisableDragandDroponarecyclerview【发布时间】:2016-11-1508:57:14【问题描述】:我有一个回收视图,允许在编辑模式下拖放项目。一旦用户退出编辑模式,我需要禁用拖放... 查看详情

jquery html在拖放时复制

】jqueryhtml在拖放时复制【英文标题】:jqueryhtmlduplicatingondraganddrop【发布时间】:2021-11-1407:46:20【问题描述】:我正在使用jQuery并使用拖放功能。我的图像不断重复,我不知道为什么。任何帮助都会很棒。我很确定我的问题是:$... 查看详情

「萌新上手mac」关于macbook拖放技巧

...常在电脑上来回拖动文件和文件夹,本文为大家介绍Mac的拖放技巧。主要内容是使用外接鼠标或触控板重新定位mac上的项目或捕获文本和图像。如何在MacBook上单击并拖动?在MacBook上单击和拖动有两个选项:使用触控板或有线或... 查看详情

如何在vmware中启用主机和虚拟机之间的复制粘贴,虚拟机是ubuntu [关闭]

】如何在vmware中启用主机和虚拟机之间的复制粘贴,虚拟机是ubuntu[关闭]【英文标题】:Howtoenablecopypastefrombetweenhostmachineandvirtualmachineinvmware,virtualmachineisubuntu[closed]【发布时间】:2015-06-2106:38:18【问题描述】:我正在尝试从我的... 查看详情

使用 Qt 拖放:在悬停时了解目标应用程序 - 有可能吗?

】使用Qt拖放:在悬停时了解目标应用程序-有可能吗?【英文标题】:DraganddropwithQt:Knowingtargetapplicationonhover-isitpossible?【发布时间】:2011-11-0712:11:16【问题描述】:我目前正在探索从Qt应用程序拖放到未知目标应用程序的可能性... 查看详情

在 jQuery 的帮助下拖放

】在jQuery的帮助下拖放【英文标题】:DraganddropwiththehelpofjQuery【发布时间】:2016-04-0902:26:23【问题描述】:我希望能够使用jQuery的可拖动功能将一个对象移动到另一个对象中。我可以在容器中移动一个对象并且能够在其中移动。... 查看详情

Qt - 在QGraphicScene中拖放时如何从项目中获取文本?

】Qt-在QGraphicScene中拖放时如何从项目中获取文本?【英文标题】:Qt-HowtogetthetextfromanitemwhendragginganddroppinginaQGraphicScene?【发布时间】:2018-05-0915:31:23【问题描述】:我是QtCreator和一般编码的新手,我正在尝试创建一个应用程序,... 查看详情