我想编写一个简单的 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?
至少对于 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 = []