MousePressEvent 在 QPushbutton 上不起作用

Posted

技术标签:

【中文标题】MousePressEvent 在 QPushbutton 上不起作用【英文标题】:MousePressEvent not working on QPushbutton 【发布时间】:2020-08-13 08:24:43 【问题描述】:

所以在我的 qtgui 中,我想知道何时有人点击(在任何 QObject 或窗口上), 因此,我正在使用 MousePressEvent。 但是,当我单击 QPushbuttons 时,无法识别该事件

我的代码有一个更简单的版本

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import os
from PyQt5.QtWidgets import QMainWindow

class Ui_MainWindow(QMainWindow):
    def __init__(self):
        super(Ui_MainWindow,self).__init__()

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.resize(1920, 1080)
        self.setStyleSheet("\n"
"")
        self.centralwidget = QtWidgets.QWidget(self)
        #self.centralwidget.setStyleSheet("#centralwidgetbackground-image: url(:/images/assets/back1.jpg);")
        
        self.centralwidget.setObjectName("centralwidget")
        self.timer = 5000
        
        self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_3.setObjectName("gridLayout_3")

        self.but1 = QtWidgets.QPushButton(self.centralwidget)
        self.but1.setGeometry(QtCore.QRect(1500, 500, 301, 51))
        self.but1.setMouseTracking(True)
        self.but1.setStyleSheet("QPushButton\n"
                "border-style: outset;""\n"
                " border-radius: 10px;"
                "border-width: 2px;"
                "border-color: gray;"
                "font: 18pt \"Adobe Pi Std\";\n"
                "color: rgb(255, 255, 255);\n"
                "QPushButton:pressed  border-style : inset; border-color:black")
        self.but1.setObjectName("but1")
        self.but1.clicked.connect(lambda : self.addtimer())
        self.setCentralWidget(self.centralwidget)
        self.retranslateUi()
        QtCore.QMetaObject.connectSlotsByName(self)


  def mousePressEvent(self,event):
        #super(Ui_MainWindow,self).mousePressEvent(event) i tried this but change nothing
        print("Clicked")

  def addtimer(self):
       self.timer+=5000
       print(self.timer)

def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.but1.setText(_translate("MainWindow", "Explore!"))



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    
    ui = Ui_MainWindow()
    ui.setupUi()
    ui.show()
    sys.exit(app.exec_())


我非常相信这个问题是由不好的继承引起的,但我不知道如何解决它。

如果你想知道为什么我想知道任何时候有人点击,那么主要目的是设置一个 Qtimer,如果在 x 时间后没有点击,它将关闭窗口

提前致谢

【问题讨论】:

【参考方案1】:

您需要做的是确定您要检查哪种鼠标事件,然后转到 pyqt5 文档并搜索执行该操作的事件(这就是我所做的),然后仅编码检测该事件的逻辑。

#Below your other self.but1... u add this one to call the function each time u click
self.but1.clicked.connect(lambda: self.mousePressEvent(QMouseEvent.MouseButtonPress))

def mousePressEvent(self, event):
    #Here you check if the event u receive its the one you want to track
    if event == QMouseEvent.MouseButtonPress:
        print("Clicked")

希望此解决方案对您有所帮助。

【讨论】:

嗯,它显然有效,谢谢!然而这种方法看起来有点“沉重”。事实上,我可能有很多按钮。我要等一下,如果没有人提供另一种解决方案,我会将您的答案标记为已接受。再次感谢 按下按钮时,它与 QMouseEvent.MouseButtonPress 匹配,如果您查看文档,则与数字“2”相同。刚刚根据您的问题快速解答。

以上是关于MousePressEvent 在 QPushbutton 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

未调用 QGraphicsView 的 MousePressEvent

在 QTableWidgetItem 中设置 mousePressEvent 处理程序

MousePressEvent 在 QPushbutton 上不起作用

使用 mousePressEvent() 和 mouseReleaseEvent() 在 QTextBrowser 中选择文本

事件(QEvent*)与 mousePressEvent(QMouseEvent *)冲突?

如何在 PyQt 中为 Qt-Designer 小部件实现 MousePressEvent