Не удается предотвратить запуск animateClick () сигнала с помощью QPushButton.blockSignals (True) - PullRequest
0 голосов
/ 26 апреля 2018

Примечание:
Я работаю в PyQt5 на Python 3.6. Но если ваш ответ для Qt5 в C ++, это тоже хорошо. Я могу переводить с C ++ на Python большую часть времени.


1. Проблема

Иногда я хочу программно нажать кнопку. Мне нравится хорошая анимация, созданная animateClick(), но кнопка не должна запускать сигнал. Итак, что я пытаюсь это:

    self.__myBtn.blockSignals(True)
    self.__myBtn.animateClick()
    self.__myBtn.blockSignals(False)

К сожалению, сигнал clicked срабатывает в любом случае.


2. Демо приложение

Для вашего удобства я написал отдельное демонстрационное приложение. Это может быть полезно для запуска некоторых тестов. Просто скопируйте и вставьте приведенный ниже код в файл Python и запустите его. Вы должны увидеть следующее окно:

enter image description here

Вот код:

import sys
import os

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


'''================================================================================'''
'''|                           CUSTOM MAIN WINDOW                                 |'''
'''================================================================================'''
class CustomMainWindow(QMainWindow):

    def __init__(self):
        super(CustomMainWindow, self).__init__()

        # -------------------------------- #
        #           Window setup           #
        # -------------------------------- #

        # 1. Define the geometry of the main window
        # ------------------------------------------
        self.setGeometry(100, 100, 800, 200)
        self.setWindowTitle("QPushbutton animateClick() test")

        # 2. Create frame and layout
        # ---------------------------
        self.__frm = QFrame(self)
        self.__frm.setStyleSheet("QWidget { background-color: #ffffff }")
        self.__lyt = QVBoxLayout()
        self.__lyt.setAlignment(Qt.AlignTop)
        self.__frm.setLayout(self.__lyt)
        self.setCentralWidget(self.__frm)

        # 3. Create QLineEdit
        # -------------------
        self.__myBtn = QPushButton("click me")
        self.__myBtn.clicked.connect(self.__btn_clicked)
        self.__myBtn.setFixedHeight(100)
        self.__myBtn.setFixedWidth(300)
        self.__lyt.addWidget(self.__myBtn)

        for i in range(10):
            QTimer.singleShot(100 + 500*i, self.__my_click_animation)

        self.show()

    ''''''

    def __my_click_animation(self):
        self.__myBtn.blockSignals(True)
        self.__myBtn.animateClick()
        self.__myBtn.blockSignals(False)

    ''''''


    def __btn_clicked(self):
        print("I'm clicked")

'''=== end Class ==='''


if __name__ == '__main__':
    app = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Fusion'))
    myGUI = CustomMainWindow()
    sys.exit(app.exec_())

''''''


3. Выход демо-приложения

Как только появится главное окно, демо-приложение запустит функцию self.__my_click_animation() 10 раз с 500 мс между каждым запуском:

    def __my_click_animation(self):
        self.__myBtn.blockSignals(True)
        self.__myBtn.animateClick()
        self.__myBtn.blockSignals(False)

Я ожидаю увидеть нажатие кнопки 10 раз (визуальная анимация), но никаких сигналов не сработало. К сожалению, сигналы срабатывают, и я получаю 10 "I'm clicked" распечаток в моем терминале.

Что я сделал не так?

1 Ответ

0 голосов
/ 26 апреля 2018

Если вам нужен только визуальный эффект, вы можете использовать метод setDown() с QTimer:

def __my_click_animation(self):
    self.__myBtn.setDown(True)
    QTimer.singleShot(100, lambda: self.__myBtn.setDown(False))
...