如何通过在QtGui中拖动来单击多个按钮?

如何通过在QtGui中拖动来单击多个按钮?,qt,python-3.x,button,pyqt,qtgui,Qt,Python 3.x,Button,Pyqt,Qtgui,我有一个使用PyQt(QGridLayout中的所有QpushButton)创建按钮网格的程序,如下所示: 我想知道如何在按住mouse1的同时拖动鼠标,以便为鼠标拖动的每个按钮运行每个按钮的功能。现在,当拖动并按住鼠标时,只会触发开始单击的按钮,并且在释放鼠标之前无法选择其他按钮。是否有只在按下或释放时运行该功能,或在运行该功能后取消选择按钮的功能 作为参考,我当前所选按钮的代码如下: self.button.pressed.connect(lambda: self.click_func(s

我有一个使用PyQt(QGridLayout中的所有QpushButton)创建按钮网格的程序,如下所示:

我想知道如何在按住mouse1的同时拖动鼠标,以便为鼠标拖动的每个按钮运行每个按钮的功能。现在,当拖动并按住鼠标时,只会触发开始单击的按钮,并且在释放鼠标之前无法选择其他按钮。是否有只在按下或释放时运行该功能,或在运行该功能后取消选择按钮的功能

作为参考,我当前所选按钮的代码如下:

self.button.pressed.connect(lambda: self.click_func(self_global, x, y,
                                                    btn_id))

函数并不重要,只会占用更多空间,但我希望您能理解这一点。

您可以使用
事件过滤器。这允许您将事件发送到另一个
QObject
(通常是按钮的父窗口小部件)以决定如何处理它们

class MyWidget(QtGui.QWidget):

    def createButton(self):
        button = QtGui.QPushButton()
        button.setMouseTracking(True)
        button.installEventFilter(self)
        return button

    def eventFilter(self, obj, event):
        if isinstance(obj, QtGui.QPushButton):
            if event.type() == QtCore.QEvent.Enter:
                if event.buttons() & QtCore.Qt.LeftButton:
                    print 'Mouse Pressed Over Button'
        return False

看你的例子,你可能也想考虑使用A和。它们是创建真正定制小部件的良好构建块。您可能能够破解QPushButtons,使其以非预期的方式运行,但对于自定义绘制的小部件,
QGraphicsView
是一种方法。

不确定是否可以使用stock按钮实现此功能,但您可以通过使用
setMouseTracking(true)轻松实现自己的按钮,该按钮具有此功能
和重载
enterEvent()
ddriver,我如何创建自己的按钮?我真的只用了QPushButton,我甚至不知道你可以自己做。你所说的“EngEnvivor”的一个例子也很好,我在网络上找不到很多东西。DunNO如何从Python中做,或者它是否可能,但是从C++中你可以简单地扩展一个小部件或抽象按钮,顺便说一下,鼠标跟踪和输入事件也应该出现在按钮中,因为它继承了QWidget。在修改代码以适应我的程序之后,我不断地遇到这个错误:AttributeError:'PySide.QtCore.QEvent'对象没有属性'buttons'hmm,不能是
QMouseEvent
。打印事件以查看其类型。如果isinstance(event,QtGui.QMouseEvent)