如何通过在 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

查看您的示例,您可能还想考虑使用QGraphicsViewQGraphicsScene。它们是创建真正自定义小部件的良好构建块。有可能您可以破解 QPushButtons 以使其以非预期的方式运行,但对于自定义绘制的小部件,QGraphicsViews 是可行的方法。

【讨论】:

修改该代码以适应我的程序后,我不断收到此错误:AttributeError: 'PySide.QtCore.QEvent' object has no attribute 'buttons' 嗯,不能是QMouseEvent。打印出事件以查看它是什么类型。你可以做一个额外的if isinstance(event, QtGui.QMouseEvent)

以上是关于如何通过在 QtGui 中拖动来单击多个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过鼠标拖动选择铁选择器中的多个元素

在java中拖动多个按钮视图

添加拖动功能以使用CLNDR.js从日历中选择多个(范围)日期

单击并拖动多个项目时,QListWidget 导致分段错误

从按下按钮的 Swift 创建多个 UIView

如何通过单击 QProgressDialog 的取消按钮来取消 QProcess?