区分Qt中的Button按下和拖动?

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

根据 拖放文件我可以在我的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 行为,在拖动按钮时得到自定义行为?

python pyqt pyqt5
1个回答
1
投票

当你覆盖一个方法时,你是在删除默认行为,所以不会发生这种情况,那么你必须通过super()调用父方法。

def mousePressEvent(self, event):
    super().mousePressEvent(event)
    if event.button() == Qt.LeftButton:
        self.dragStartPosition = event.pos()
© www.soinside.com 2019 - 2024. All rights reserved.