0

我在 Qt Designer 中制作了 gui,然后使用 pyuic4 将其转换为 python。现在我想捕获按钮上的鼠标悬停事件。

class window_b(QtGui.QDialog):
    def __init__(self,parent=None):
        super(window_b, self).__init__(parent)
        window_a.setEnabled(False)
        self.ui = Ui_Form_window_b()
        self.ui.setupUi(self)
        self.setFocusPolicy(QtCore.Qt.StrongFocus)
    def mouseMoveEvent (self,event):
        source= self.sender()
        #print source.name()
        # The action I want to do when the mouse is over the button:
        source.setStyleSheet("background-color:#66c0ff;border-radiu‌​s: 5px;")

我将mouseMoveEvent方法放在小部件上,我想检测 Dialog 上的哪个按钮发送了 mouseOver 事件。我试过source.name()了,但它给了我这个错误

print source.name()
AttributeError: 'NoneType' object has no attribute 'name'

任何建议。

4

1 回答 1

3

sender()仅对信号有用,但鼠标悬停是事件而不是信号(实际上是 2 个事件:QEvent.EnterQEvent.Leave)。

为了能够处理接收它们的按钮之外的事件,您需要将您的window_b实例安装为每个按钮的事件过滤器。

class window_b(QtGui.QDialog):
    def __init__(self,parent=None):
        super(window_b, self).__init__(parent)
        window_a.setEnabled(False)
        self.ui = Ui_Form_window_b()
        self.ui.setupUi(self)
        self.setFocusPolicy(QtCore.Qt.StrongFocus)

        # Get all the buttons (you probably don't want all of them)
        buttons = self.findChildren(QtGui.QAbstractButton)
        for button in buttons:
            button.installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() == QtCore.QEvent.Enter:
            print("mouse entered %s" % obj.objectName())
        elif event.type() == QtCore.QEvent.Leave:
            print("mouse leaved %s" % obj.objectName())    
        return super(window_b, self).eventFilter(obj, event)

如果您只需要更改样式,您可以简单地在样式表中使用伪状态 ":hover"(来自设计器,或在构造函数中使用self.setStyleSheet):

QPushButton {
     border: 1px solid black;   
     padding: 5px;
}
QPushButton:hover {   
    border: 1px solid black;
    border-radius: 5px;   
    background-color:#66c0ff;
}
于 2012-09-08T23:58:46.827 回答