将生成的文件(例如 MIDI)从 Pyside6 或 Qt 应用程序拖放到另一个应用程序(例如 DAW)

问题描述 投票:0回答:1

我想编写一个简单的 Qt 应用程序(使用 Python 和 PySide6),它将生成一个 midi 文件,以便用户可以将其直接拖到他们的 DAW 中(例如 Reaper、Ableton、Bitwig)。

我有

  def mousePressEvent(self,e):
    if e.button() == Qt.LeftButton:
      drag = QDrag(self)
      mimeData = QMimeData()
      mimeData.setData("audio/midi",mid)
      drag.setMimeData(mimeData)
      drag.exec(Qt.CopyAction)

在我的

mousePressEvent
中,这似乎已经完成了一半:Reaper 的反应就好像 MIDI 文件被拖过一样。但是接下来我该怎么做,以便当我释放拖动时 MIDI 到达 Reaper?

python qt drag-and-drop
1个回答
0
投票

至少对于 Reaper 和 Ableton,并且至少在 Windows 上,这是必要的 创建一个临时文件,将数据写入其中,并附加文件 url 到 mime 对象:使用 Reaper 和 Ableton,数据可以是空的

QByteArray
。我的错误是假设 Reaper 会从 作为 mime 对象的一部分发送的数据。虽然可以从文件资源管理器中成功拖动
e.mid
文件,但Bitwig拒绝接受拖动的文件,并且通过上面的代码,可以将midi拖到资源管理器中,然后从资源管理器中成功拖入Bitwig,所以我不知道是什么在那里进行。

以下作品:

import tempfile
...
  def mousePressEvent(self,e):
    if e.button() == Qt.LeftButton:
      drag = QDrag(self)
      # we must have delete=False as the file must persist long
      # enough for Reaper to read from it, and it must be closed
      # before Reaper can read from it (on Windows at least)
      with tempfile.NamedTemporaryFile(suffix=".mid",delete=False) as f:
        fn = f.name
        f.write(mid)
      temp_filenames.append(fn)
      mimeData = QMimeData()
      mimeData.setData("audio/midi",QByteArray(""))
      # Reaper and Ableton get their data from the file named in the url
      # not from the data in the mime object
      urls = [ QUrl.fromLocalFile(fn) ]
      mimeData.setUrls(urls)
      drag.setMimeData(mimeData)
      dropAction = drag.exec(Qt.CopyAction)

# list of temp files we have created to clear up on exit
# it makes more sense to have a class manage creation of these
# temporary files, writing their contents, and cleaning up at exit
# time.
temp_filenames = []
© www.soinside.com 2019 - 2024. All rights reserved.