如何通过在 QtGui 中拖动来单击多个按钮?
Posted
技术标签:
【中文标题】如何通过在 QtGui 中拖动来单击多个按钮?【英文标题】:How can I click multiple buttons by dragging in QtGui? 【发布时间】:2016-03-10 02:48:50 【问题描述】:我有一个使用 PyQt(QGridLayout 中的所有 QPushButtons)创建按钮网格的程序,如下所示:
我想知道如何在按住 mouse1 的同时拖动鼠标,以便为鼠标拖过的每个按钮运行每个按钮的功能。现在,在拖拽的时候,只会触发开始点击的那个按钮,直到松开鼠标,才能选择其他的按钮。是否有一个函数只在按下或释放时运行,或者在函数运行后取消选择按钮?
作为参考,我当前选中按钮的代码如下:
self.button.pressed.connect(lambda: self.click_func(self_global, x, y,
btn_id))
功能并不重要,在这里会占用更多空间,但我希望你明白这一点。
【问题讨论】:
不确定是否可以使用股票按钮,但您可以通过使用setMouseTracking(true)
并重载 enterEvent()
轻松实现具有此功能的自己的按钮
ddriver,我如何创建自己的按钮?我真的只用过QPushButton,我什至不知道你可以自己做。 enterEvent() 的一个例子也很好,我在互联网上找不到太多。
不知道如何从 python 中做到这一点,或者是否有可能,但从 C++ 中,您可以简单地扩展一个小部件或一个抽象按钮,顺便说一下鼠标跟踪和输入事件应该出现在按钮中同样,因为它继承了 QWidget。
【参考方案1】:
您可以使用eventFilter
。这允许您将事件发送到另一个 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
查看您的示例,您可能还想考虑使用QGraphicsView
和QGraphicsScene
。它们是创建真正自定义小部件的良好构建块。有可能您可以破解 QPushButtons 以使其以非预期的方式运行,但对于自定义绘制的小部件,QGraphicsViews
是可行的方法。
【讨论】:
修改该代码以适应我的程序后,我不断收到此错误:AttributeError: 'PySide.QtCore.QEvent' object has no attribute 'buttons' 嗯,不能是QMouseEvent
。打印出事件以查看它是什么类型。你可以做一个额外的if isinstance(event, QtGui.QMouseEvent)
以上是关于如何通过在 QtGui 中拖动来单击多个按钮?的主要内容,如果未能解决你的问题,请参考以下文章