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し、ダイアログのどのボタンが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)

スタイルのみを変更する必要がある場合は、(デザイナーから、またはコンストラクターでself.setStyleSheet)スタイルシートで疑似状態 ":hover" を使用するだけです。

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 に答える