0

ユーザーがファイルをリストビュー (または同様のウィジェット) にドラッグ アンド ドロップすると、それらのファイルがリストに追加される PyQt アプリケーションを作成したいと考えています。これは、次の例でうまく機能します。

たとえば、ユーザーがアイテムをリストビューからデスクトップ (アプリの外部/外部) にドラッグした場合、Python プログラムでアイテムがドロップされたパスを検出/出力することも必要です (例: C:\Users\alilly\Desktop) . 次に、ファイルをその場所にコピーするコードを記述します。

これは、これまでのところ部分的に機能するコードです。

import sys from PyQt4.QtGui import * from PyQt4.QtCore import *

class MyListWidget(QListWidget):
  def __init__(self, parent):
    super(MyListWidget, self).__init__(parent)
    self.setAcceptDrops(True)
    self.setDragEnabled(True)
    self.setDragDropMode(QAbstractItemView.InternalMove)

  def mouseMoveEvent(self, event):
    self.dragObject()

  def dragEnterEvent(self, event):
    if event.mimeData().hasUrls():
      event.acceptProposedAction()
    else:
      super(MyListWidget, self).dragEnterEvent(event)

  def dragMoveEvent(self, event):
    super(MyListWidget, self).dragMoveEvent(event)

  def dropEvent(self, event):
    if event.mimeData().hasUrls():
      for url in event.mimeData().urls():
        self.addItem(url.path())
      event.acceptProposedAction()
    else:
      super(MyListWidget,self).dropEvent(event)

  def dragObject(self):
    if not self.selectedIndexes(): return

    drag = QDrag(self)

    data = []
    for index in self.selectedIndexes():
        if not index.isValid(): continue

        # this assumes your model has a nodeFromIndex() method -
        # it's easy to set one up, you'll probably have a custom
        # model class anyways
        # node = self.model().nodeFromIndex(index)
        # data.append(str(node))

    # in this case I'm just making a newline-seperated list
    # of the data, you could do pretty much anything here
    md = QMimeData()
    md.setData('text/plain', "\n".join(data))

    # this is important.  Without this, it won't do anything.
    # you can use different actions like Qt.MoveAction, which
    # would remove the item from your model, but then your model
    # has to be more complicated.  I'm only interested in copy here.
    drag.setMimeData(md)
    dropAction = drag.exec_(Qt.CopyAction)

class MyWindow(QWidget):
  def __init__(self):
    super(MyWindow,self).__init__()
    self.setGeometry(100,100,300,400)
    self.setWindowTitle("Filenames")

    self.list = MyListWidget(self)
    layout = QVBoxLayout(self)
    layout.addWidget(self.list)

    self.setLayout(layout)

if __name__ == '__main__':

  app = QApplication(sys.argv)
  app.setStyle("plastique")

  window = MyWindow()
  window.show()

  sys.exit(app.exec_())
4

1 に答える 1

2

他のプラットフォームについてはわかりませんが、Windows では、ファイルをコピーまたは移動するために独自のコードを記述する必要はありません。「text/uri-list」を使用して mimedata にファイル パスを追加するだけで、Windows はそれをドロップ場所にコピー/移動します。

testFile = 'file:///C:/testFile.txt'
md = QMimeData()
md.setData('text/uri-list', QtCore.QByteArray(testFile))
于 2013-07-24T14:53:05.940 に答える