Or if you want to do something more custom, like dropping some objects on construction plane, you can do it this way:
from qtmax import GetQMaxMainWindow
from PySide2 import QtCore, QtGui, QtWidgets
from pymxs import undo as max_undo, runtime as rt
class MaxEvents(QtCore.QObject):
def eventFilter(self, object, event):
if (event.type() == QtCore.QEvent.DragEnter):
print("Drag enter")
elif (event.type() == QtCore.QEvent.DragMove):
print("Drag move")
elif (event.type() == QtCore.QEvent.Drop):
self.parent().dropped.emit()
return False
class DragButton(QtWidgets.QPushButton):
dropped = QtCore.Signal()
mainWin = GetQMaxMainWindow()
def mouseMoveEvent(self, e):
if e.buttons() == QtCore.Qt.RightButton:
return
filter = MaxEvents(parent = self)
self.mainWin.installEventFilter(filter)
mimeData = QtCore.QMimeData()
mimeData.setUrls([])
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
try:
drag.start(QtCore.Qt.MoveAction)
finally:
self.mainWin.removeEventFilter(filter)
self.setDown(False)
class Window(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setWindowTitle('Drag & Drop')
self.setLayout(QtWidgets.QHBoxLayout())
btn = DragButton("Drop Box")
btn.dropped.connect(self.spawnBox)
self.layout().addWidget(btn)
def spawnBox(self):
if (rt.mouse.pos.x > 0 and rt.mouse.pos.y > 0 and rt.mouse.pos.x <= rt.gw.getWinSizeX() and rt.mouse.pos.y <= rt.gw.getWinSizeY()):
with max_undo(True):
rt.Box(length = 5, width = 5, height = 5, pos = rt.mapScreenToCP(rt.mouse.pos))
rt.redrawViews()
else:
print("Dropped outside of active viewport")
w = Window(GetQMaxMainWindow())
w.show()