PyQt QToolButton не обновляет значок в фокусе - PullRequest
0 голосов
/ 04 февраля 2020

У меня проблема с обновлением иконки кнопки, установленной с QToolButton. Идея состоит в том, чтобы использовать кнопку для игрока mov ie. Для воспроизведения нажмите кнопку, и значок изменится на паузу. При повторном нажатии воспроизведение приостанавливается, и значок возвращается к воспроизведению. У меня есть рабочий код, но проблема в том, что значок не обновляется постоянно. Если я держу окно Qt в фокусе, требуется одно или два нажатия кнопок, чтобы изменить значок на нужное изображение, и к тому времени фактическое изображение не является предполагаемым изображением (воспроизведение / пауза с заменой).

Вот пример минимального кода:

from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QStyle, QToolButton

class Widget(QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent=parent)
        self.play_button = QToolButton(clicked=self.update_button)
        self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.verticalLayout = QVBoxLayout(self)
        self.verticalLayout.addWidget(self.play_button)

        self.button_pressed = False

    def update_button(self):
        if self.button_pressed:
            self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
            self.button_pressed = False
            print("Button should be set to PLAY. Press is", self.button_pressed)
        else:
            self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
            self.button_pressed = True
            print("Button should be set to PAUSE. Press is", self.button_pressed)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

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

  • 1-й щелчок: «Кнопка должна быть установлена ​​на ПАУЗУ. Нажать« Истина »(без изменений в значке)
  • 2-й щелчок: «Кнопка должна быть установлена ​​на PLAY. Нажатие является ложным» (значок изменяется на паузу)
  • 3-й щелчок: «На кнопке должно быть установлено значение PAUSE. Нажмите True» (значок меняется на воспроизведение) (и т. Д., продолжает обмениваться должным образом)

Я также заметил, что если после каждого щелчка я щелкаю за пределами окна Qt или изменяю размер окна Qt, значок кнопки обновляется до правильного. Что я делаю неправильно? Как заставить значок обновиться?

Такое поведение в основном происходит с QToolButton, но QPushButton также вызывает проблемы (работает, когда фокусируется, но неправильно ведет себя / теряет отслеживание правильного состояния, если я изменяю размер окна Qt ). Использование PyQt 5.12.3 и qt 5.12.5 в macOS.

1 Ответ

0 голосов
/ 05 февраля 2020

Похоже, эта проблема является ошибкой в ​​реализации Qt для macOS. Я тестировал, и это происходит как с PyQt5, так и с PySide2, поэтому он должен исходить из Qt. Вынужденная перерисовка с вызовом .repaint() после .setIcon(), кажется, делает проблему go прочь:

self.play_button.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.play_button.repaint()
...