5

内部でアイテムを移動する(ドラッグする)ことと、アイテムをコピーする(Ctrlキーを押しながらドラッグする)ことの両方をサポートするビューとモデルを実装しています。指示に従って、必要なことはすべて行いました。mime関数を設定し、removeRows()とflags()を実装しました。問題は、ドラッグするとデフォルトでコピー操作になることです(プラス記号の付いた矢印カーソルが表示され、モデルに新しいアイテムを作成して実際にアイテムをコピーします)。

私が見ることができる唯一の違いはこれです:supportedDropActions()でQt :: MoveActionのみを返す場合、それは移動するだけです。(Qt :: CopyAction | Qt :: MoveAction)を返すと、コピーするだけです。

何か案は?Nautilus(Gnome)またはWindowsファイルエクスプローラーのファイルのように機能させたい:ドラッグするとアイコンが移動し、ctrl+dragでコピーします。

4

3 に答える 3

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;

問題は、ウィジェットにdefaultDropActionプロパティを設定していなかっsetDefaultDropAction( Qt::MoveAction ); たことです。したがって、startDrag()はデフォルトでCopyActionに設定されていました。defaultDropActionがQt::MoveActionの場合、キーボードのCtrlキーを使用して、進行中のドラッグをコピーアクションに切り替えることができます。これは私の望ましい動作です。

私はQtが大好きですが、ドラッグアンドドロップに関連する多くの紛らわしく、やや絡み合ったプロパティが確かにあります。プロパティの適切な組み合わせを取得できないのは簡単です。

結論: defaultDropActionQt::MoveActionに設定してください。

于 2013-01-30T15:36:39.887 に答える
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;
    }

そして、マウスのpressEventで、ctrlキーが押されているかどうかを確認します

`mousePressEvent()
{ 
  if (bControlKeyPressed) 
    //enable Qt::CopyAction 
else 
    //enable  Qt::MoveAction 
}` 
于 2013-01-29T07:03:24.483 に答える
0

これは私がすることです:

コピー アクションを有効にします。次に、drap&drop シグナルをリッスンするか、仮想メソッドをオーバーライドします (または Qt が提供するものは何でも、私はチェックしませんでした)。意図したアクションが移動である場合は、行を「手動で」削除します。ドロップしたら、好みのアクションを保存します。

Qt データから目的のアクションを判断する方法がない場合は、Ctrl キーのステータスを確認し、コピーか移動かを示すブール値を保存します。ここで、Qt が何かがドロップされたことを通知したら、選択したアクションを確認し、移動した行を自分で削除します。

(私は個人的に gtkmm を使用しています。ここでは、copy-if-Ctrl-is-pressed が完全に機能します)

于 2013-01-29T19:26:58.653 に答える