2012-07-04 27 views
5

私は内部的にアイテムを移動する(ドラッグする)とアイテムをコピーする(Ctrlキーを押しながらドラッグする) )。私は、指示に従って行う必要があるすべてをやった。私はmime関数を設定しました。私はremoveRows()とflags()を実装しました。問題は、私がドラッグすると、デフォルトのコピー操作(私はプラス記号で矢印カーソルを取得し、実際にはモデルに新しいものを作成してアイテムをコピーします)です。Qtドラッグ&ドロップ:コピーが有効になっているときに移動できない(Ubuntu Gnome)

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

アイデア? Nautilus(Gnome)やWindowsのエクスプローラでファイルのように動作させたい:アイコンをドラッグして移動し、Ctrl +ドラッグでコピーする。

+0

Windowsでも同じ問題が発生しますが、 'Qt :: MoveAction'が優先されます。 –

+0

誰かが好きなら、問題を示すためのサンプルコードを投稿できます。 –

+0

これは最終的に私の質問に答えなかったので、誰が彼らが恩恵に値すると感じましたか? –

答えて

0

何Ctrlキーが押されているかどうかを確認pressEvent まずkeyPressEventを書いて、Ctrlキーが押されているかどうかを設定したりしませ 」を

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

とマウスでこの方法を試す場合

`mousePressEvent() 
{ 
    if (bControlKeyPressed) 
    //enable Qt::CopyAction 
else 
    //enable Qt::MoveAction 
}` 
+0

これは理想的な簡単な答えですしかし、Ubuntu/Windowsでは、指定されたアクション(およびデフォルトのアクションも無視されます)だけが無視されます。 –

0

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

コピーアクションを有効にします。 drap &ドロップシグナルを聞いたり、仮想メソッドをオーバーライドしたり(Qtが提供するものであればチェックしませんでした)、あなたが意図したアクションが動いた場合は、「手動で」行を削除してください。落としたときは、あなたが好む行動を保存してください。

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

+0

この解決方法は多少有効ですが、2つの問題があります。a)ドラッグアイコンが正しくありません。 b)複数の項目が選択されている場合は、それらの項目をドラッグするといくつかの項目が削除され、他の項目はコピーされます。 –

+0

次に、2つのオプションが表示されます。 1)just-get-rid-of-itアプローチ:アイコンを手動で設定します。複数選択するには、自分でドロップを処理します。各ノードの移動/コピーの方法を決めます。 Qtがドラッグアンドドロップデータにアクセスする方法に応じて、複雑になるかもしれません... 2)深刻なエンジニアのアプローチ:これがなぜうまくいかないのかを調べてください。 Qtはフリーソフトウェアなので、もしバグがあれば、それが解決できるかどうかを調べてください。したがって、あなたはQtのすべてのユーザとQtで書かれたすべてのアプリケーションに貢献します。また、回避策は必要ありません。 – cfa45ca55111016ee9269f0a52e771

+0

Windowsの内部機能に問題がある場合は、電子メールを送信するのが最善です。 Windowsはプロプライエタリなソフトウェアなので、D&Dがうまく動作しない場合、私は自分の問題ではなく、自分の問題ではないと考えます。または、あなたのコードに一時的な回避策を追加するだけです。Windowsの場合 – cfa45ca55111016ee9269f0a52e771

1

(私は個人的にpefectly作品をコピー場合は、Ctrlキーを押しながら、押すのgtkmmを使用)私は私が間違ってやっていたものを見つけたとき、私はこの質問に答えることでフォローアップしませんでしたごめんなさい。私をめちゃくちゃコードQAbstractItemView::startDrag()にあった:

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

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

私はQtが大好きですが、ドラッグ&ドロップに関連する混乱した、多少の絡み合ったプロパティがあります。適切なプロパティの組み合わせを取得しないのは簡単です。

ボトムライン:defaultDropActionにはQt :: MoveActionを設定してください。

+0

もう少し情報を与えるために、listViewで変更しなければならないプロパティは次のとおりです:acceptDrops:true、dragEnabled:true、defaultDropAction:MoveAction one!)、selectionMode:ExtendedSelection(Windowsエクスプローラの動作は期待されていますが、QListViewのデフォルトではありません)。また、モデルでは:setSupportedDragActions(Qt :: CopyAction | Qt :: MoveAction); Qt :: CopyActionを返します。 MyModel :: Model :: supportedDropActions()でQt :: MoveActionを呼び出し、Qt :: ItemIsDragEnabledをMyModel :: flags()に追加し、MyModel :: mimeTypes()、mimeData()、およびdropMimeDataを実装します。希望が助けてくれる! – Scott

+0

これは私が経験しているバグが実際に経験したバグと異なることを意味します。 Windows上のQtバグのように見えます。 –

+0

D K、私は興味があります - それはQt SDK(クリエイター)ですか?通常は* mingwベースですか、それともQtはVisual Studio(WinAPIベースですか?)でコンパイルされていますか?また、Copy to Moveを変更するためのキーボード修飾子がないため、Copyをデフォルトの動作として使用すると、全くMoveを達成できませんでした。あなたはあなたが移動に問題があると言います - あなたはCtrlを押してコピーに変更できませんか? – Scott

関連する問題