QPushButton FocusIn генерирует какой сигнал? - PullRequest
4 голосов
/ 03 февраля 2010

Я создаю небольшое приложение PyQt и застрял в эффекте MouseOver.

У меня есть QMainWindow, у которого есть три кнопки с именами createProfileButton, downloadPackagesButton и installPackagesButton. Все это типа QPushButton

Теперь я создал метку, которая будет содержать текст, когда кто-то наводит указатель мыши на любую из этих кнопок. Я проверил документацию и узнал, что она может быть обработана с использованием перегрузки

  • focusInEvent (self, QFocusEvent)
  • focusOutEvent (self, QFocusEvent)

методы кнопки. Теперь это означает, что мне нужно расширить QPushButton для каждой из трех кнопок, и каждая из них должна иметь объект для одного класса. Я попытался отыскать сигнал, который испускается, когда мышь наводят или отнимают от кнопки, но тщетно. Вся помощь, которую я получил в сети, заключалась в реализации этих двух методов.

Разве расширение класса и создание каждого из них не является излишним? Сигнал будет аккуратным, к сожалению, я не смог найти сигнал.

Итак, я проверил всю иерархию наследования и не нашел сигнала для FocusIn и FocusOut

Ответы [ 2 ]

4 голосов
/ 03 февраля 2010

Как вы сказали, для этой функции нет сигналов. У вас есть два основных варианта.

Вариант 1 - Подкласс:

class FocusEmittingButton(QPushButton):
    #...
    def focusInEvent(self, event):
        # emit your signal

Затем вы можете подключиться к этому сигналу в коде вашего клиента. Также, при необходимости, вы можете использовать дизайнерскую функцию Promote To для перевода каждой кнопки в тип FocusEmittingButton. Вам потребуется только один раз создать подкласс, а затем убедиться, что все кнопки одного типа.

Вариант 2 - Использование QApplication.focusChanged

Вы также можете использовать QApplication.focusChanged(oldQWidget, newQWidget). Таким образом, вам не нужно создавать подклассы и переопределять события фокуса. Вместо этого вы подключаетесь к сигналу QApplication.focusChanged, а затем отвечаете обработчиком.

1 голос
/ 18 июля 2010

Существует другой способ получения сигналов фокусировки в родительском виджете. Вы можете добавить фильтр событий:

class MyParent(QWidget):
    def __init__(self):
        #...
        self.mybutton.installEventFilter()

    def eventFilter(self, obj, event):
        if obj is self.mybutton and event.type() == QEvent.FocusOut:
           #...
        return QWidget.eventFilter(self, obj, event)
...