Примечание:
Я работаю в PyQt5 на Python 3.6. Но если ваш ответ для Qt5 в C ++, это тоже хорошо. Я могу переводить с C ++ на Python большую часть времени.
1. Проблема
Иногда я хочу программно нажать кнопку. Мне нравится хорошая анимация, созданная animateClick()
, но кнопка не должна запускать сигнал. Итак, что я пытаюсь это:
self.__myBtn.blockSignals(True)
self.__myBtn.animateClick()
self.__myBtn.blockSignals(False)
К сожалению, сигнал clicked
срабатывает в любом случае.
2. Демо приложение
Для вашего удобства я написал отдельное демонстрационное приложение. Это может быть полезно для запуска некоторых тестов. Просто скопируйте и вставьте приведенный ниже код в файл Python и запустите его. Вы должны увидеть следующее окно:
Вот код:
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"
распечаток в моем терминале.
Что я сделал не так?