根据 拖放文件我可以在我的QToolButton上实现拖动功能,但这是覆盖了标准的按钮点击行为,我无法检查按钮是否被按下或是否有意图通过拖动鼠标开始拖动。
class toolbarButton(QToolButton):
def __init__(self, parent = None, item = None):
super(toolbarButton, self).__init__(parent)
self.setIcon(...)
self.setIconSize(QSize(40, 40))
self.dragStartPosition = 0
...
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragStartPosition = event.pos()
def mouseMoveEvent(self, event):
if not (event.buttons() and Qt.LeftButton):
return
if (event.pos() - self.dragStartPosition).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimeData = QMimeData()
...
drag.setMimeData(mimeData)
drag.exec(Qt.CopyAction)
def sizeHint(self):
return self.minimumSizeHint()
def minimumSizeHint(self):
return QSize(30, 30)
我最初的想法是当距离小于startdragdistance时添加发射,但这是不正确的,因为每次我移动鼠标时它都会发射。在PyQt5中有没有办法实现这个功能?在按下按钮时得到标准的 QToolButton 行为,在拖动按钮时得到自定义行为?
当你覆盖一个方法时,你是在删除默认行为,所以不会发生这种情况,那么你必须通过super()调用父方法。
def mousePressEvent(self, event):
super().mousePressEvent(event)
if event.button() == Qt.LeftButton:
self.dragStartPosition = event.pos()