我正在实现一个视图和模型,我想在内部(通过拖动)支持两个移动项目,并复制项目(通过在拖动时按住Ctrl键)。我按照说明做了我需要做的一切。我已经设置了mime函数,我已经实现了removeRows()和flags()。问题是当我拖动时,它默认为复制操作(我得到带有加号的箭头光标,它确实通过在模型中创建一个新项目来复制项目。)
我能看到的唯一区别是:如果我只返回supportedDropActions()中的Qt :: MoveAction,它只会移动。如果我返回(Qt :: CopyAction | Qt :: MoveAction),它只会复制。
有什么想法吗?我希望它像Nautilus(Gnome)或Windows文件资源管理器中的文件一样工作:拖动移动图标,按住Ctrl键并拖动它们。
答案 0 :(得分: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 。
答案 1 :(得分:0)
如果你这样试试怎么办? 首先写一个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
}`
答案 2 :(得分:0)
这就是我要做的事情:
启用复制操作。然后听取drap& drop信号或覆盖虚拟方法(或任何Qt提供的,我没有检查),如果你想要的动作是移动,则“手动”删除行。下拉时,保存您喜欢的操作。
如果无法从Qt数据中确定所需的操作,请检查Ctrl键状态并保存一个表示是复制还是移动的布尔值。现在,当Qt发出信号丢失的信号时,请检查您选择的操作,并自行删除移动的行。
(我个人使用gtkmm,其中copy-if-Ctrl-is-pressed完美地工作)