【问题标题】:PyQt5 mousetracking not workingPyQt5鼠标跟踪不起作用
【发布时间】:2016-06-13 19:05:53
【问题描述】:

我发现了一个当鼠标悬停在 QPushButton 上时更改图标的示例。我试图将其转换为我的代码,但存在一些问题。首先检查我找到的示例,它真的很短。 http://paste.ubuntu.com/17302717/

如果鼠标在按钮上,这些代码会改变按钮的图标。这是我引发错误的代码

return QPushButton.mouseMoveEvent(QPushButton, event) TypeError: QPushButton.mouseMoveEvent(QMouseEvent): 未绑定方法的第一个参数必须有类型'QPushButton'

from PyQt5.QtWidgets import QApplication,QPushButton,QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QSize

import PyQt5.QtWidgets,PyQt5.QtCore,sys



class cssden(QMainWindow):
    def __init__(self):
        super().__init__()

        self.mwidget = QMainWindow(self)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        self.setMouseTracking(True)

        self.setFixedSize(1400,923)


        #Button
        self.mbutton = QPushButton(self)
        self.mbutton.setStyleSheet("background-color: rgb(30,30,30);"
                                   "background-image: url('resources/twitter-logo.png');"
                                   "border: 3px solid black;"
                                   "background-position: center;"
                                   )
        self.mbutton.setGeometry(2,300,110,60)
        self.mbutton.clicked.connect(self.yaz)

        self.show()
    def mouseMoveEvent(self, event):

        if event.pos().x()>self.mbutton.width()-10 or event.pos().y()>self.mbutton.height()-10\
                    or event.pos().x() < 10 or event.pos().y()< 10:
            bmp = QIcon("1.png")
            self.mbutton.setIcon(bmp)

        else:
            bmp = QIcon('2.png')
            self.mbutton.setIcon(bmp)
        self.mbutton.setIconSize(QSize(200,200))
        return QPushButton.mouseMoveEvent(self, event)

    def yaz(self):
        print ("button pressed")

app = QApplication(sys.argv)
app.setStyleSheet("QMainWindow{background-color: rgb(30,30,30);border: 2px solid rgb(20,20,20)}")

ex = cssden()
sys.exit(app.exec_())

我不明白问题出在哪里。我尝试将return QPushButton.mouseMoveEvent(self, event) 更改为return QPushButton.mouseMoveEvent(QPushButton, event) 和其他版本,但没有成功。我错过了什么,我该如何解决这个问题?

编辑:我将self.setMouseTracking(True) 更改为self.mbutton.setMouseTracking(True),现在没有错误,但图标并没有改变。为什么图标没有变化?

【问题讨论】:

    标签: python mouseevent python-3.4 pyqt5 qpushbutton


    【解决方案1】:

    您的代码存在一些问题,即导入问题。但主要问题是你不需要这个:return QPushButton.mouseMoveEvent(self, event)

    尝试对您的代码进行以下更正:

    from PyQt5.QtWidgets import QApplication,QPushButton,QWidget from
    PyQt5.QtGui import QIcon from PyQt5.QtCore import QSize from PyQt5
    import QtCore, QtWidgets, QtGui
    
    import PyQt5.QtWidgets,PyQt5.QtCore,sys
    
    class cssden(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
    
            # self.mwidget = QMainWindow(self)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    
            self.setMouseTracking(True)
    
            self.setFixedSize(1400,923)
    
    
            #Button
            self.mbutton = QPushButton(self)
            self.mbutton.setStyleSheet("background-color: rgb(30,30,30);"
                                       "background-image: url('resources/twitter-logo.png');"
                                       "border: 3px solid black;"
                                       "background-position: center;"
                                       )
            self.mbutton.setGeometry(2,300,110,60)
            self.mbutton.clicked.connect(self.yaz)
    
            self.show()
        def mouseMoveEvent(self, event):
    
            if event.pos().x()>self.mbutton.width()-10 or event.pos().y()>self.mbutton.height()-10\
                        or event.pos().x() < 10 or event.pos().y()< 10:
                bmp = QIcon("1.png")
                self.mbutton.setIcon(bmp)
            else:
                print(1)
                bmp = QIcon('2.png')
                self.mbutton.setIcon(bmp)
            self.mbutton.setIconSize(QSize(200,200))
            # return self.mbutton.mouseMoveEvent(event)
    
        def yaz(self):
            print ("button pressed")
    
    app = QApplication(sys.argv)
    app.setStyleSheet("QMainWindow{background-color:
    rgb(30,30,30);border: 2px solid rgb(20,20,20)}")
    
    ex = cssden() sys.exit(app.exec_())
    

    无论如何,我并不真正理解您要达到的目标。如果您需要为按钮创建某种悬停效果,还有其他更好的方法。比如这个:

    from PyQt5.QtWidgets import QApplication,QPushButton,QWidget
    from PyQt5.QtGui import QIcon
    from PyQt5.QtCore import QSize
    from PyQt5 import QtCore, QtWidgets, QtGui
    
    import PyQt5.QtWidgets,PyQt5.QtCore,sys
    
    class HoverButton(QPushButton):
        mouseHover = QtCore.pyqtSignal(bool)
    
        def __init__(self, parent=None):
            QPushButton.__init__(self, parent)
            self.setMouseTracking(True)
    
        def enterEvent(self, event):
            self.mouseHover.emit(True)
            bmp = QIcon("1.png")
            self.setIcon(bmp)
            self.setIconSize(QSize(200,200))
    
        def leaveEvent(self, event):
            self.mouseHover.emit(False)
            bmp = QIcon("2.png")
            self.setIcon(bmp)
            self.setIconSize(QSize(200,200))
    
    class cssden(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
    
            # self.mwidget = QMainWindow(self)
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    
            self.setMouseTracking(True)
    
            self.setFixedSize(1400, 923)
    
    
            #Button
            self.mbutton = HoverButton(self)
            self.mbutton.setStyleSheet("background-color: rgb(30,30,30);"
                                       "background-image: url('resources/twitter-logo.png');"
                                       "border: 3px solid black;"
                                       "background-position: center;"
                                       )
            self.mbutton.setGeometry(2,300,110,60)
            self.mbutton.clicked.connect(self.yaz)
            self.show()
    
        def yaz(self):
            print("button pressed")
    
    app = QApplication(sys.argv)
    app.setStyleSheet("QMainWindow{background-color: rgb(30,30,30);border: 2px solid rgb(20,20,20)}")
    
    ex = cssden()
    sys.exit(app.exec_())
    

    我会建议以下答案:

    PyQT how to make a QEvent.Enter on QPushbutton?(我的解决方案就是基于这个方法)

    Pyqt Mouse hovering on a QPushButton

    【讨论】:

    • 您的第一个示例不起作用,但第二个示例正在做我想要的。所以我必须创建另一个类class HoverButton(QPushButton) 并在我的代码中使用它?
    • @GLHF 我可以保证两者都能正常工作,因为我在发布之前已经对它们进行了测试。注意工作并不意味着工作得很好。正如我所说,我很难理解你想要做什么。无论如何,答案是肯定的:在我看来,最好的方法是继承 QPushButton。
    • 这可以使用 setStyleSheet(QPushButton:hover{image:url()}) 来实现
    猜你喜欢
    • 2023-04-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多