eventFilter в QLineEdit
В программе присутствует визуальный баг, если в поле "Возраст" ввести число меньше 18 и больше 80, и нажать на QPushButton (кнопка останется серой) или на QRadioButton (кружочек окрасится в голубой цвет).
Можно ли как-то это убрать? При нажатие на другое поле LineEdit, ничего такого нет.
from PySide6 import QtWidgets, QtCore, QtGui
class QTApp(QtWidgets.QWidget):
def __init__(self):
super(QTApp, self).__init__()
self.LE_sample_input_01 = QtWidgets.QLineEdit()
self.LE_sample_input_02 = QtWidgets.QLineEdit()
self.LE_sample_input_01.setPlaceholderText('Возраст')
self.RadioButton = QtWidgets.QRadioButton('Что-то')
self.Button = QtWidgets.QPushButton('Тык')
self.Button.setStyleSheet("QPushButton:pressed {background-color: #b3b3ba;}")
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.LE_sample_input_01)
layout.addWidget(self.LE_sample_input_02)
layout.addWidget(self.RadioButton)
layout.addWidget(self.Button)
self.LE_sample_input_01.installEventFilter(self)
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.FocusOut and QtGui.QFocusEvent.reason(event) == QtCore.Qt.MouseFocusReason:
if obj is self.LE_sample_input_01:
try:
age = int(self.LE_sample_input_01.text())
if age < 18 or age > 80:
error = QtWidgets.QMessageBox()
error.setWindowTitle('Ошибка возраста')
error.setText('Возраст введён неверно (от 18 до 80 лет)')
error.setIcon(QtWidgets.QMessageBox.Warning)
error.addButton('Ок',QtWidgets.QMessageBox.AcceptRole)
error.exec()
obj.setFocus()
obj.selectAll()
return True
except: pass
return False
if __name__ == "__main__":
app = QtWidgets.QApplication()
qt_app = QTApp()
qt_app.show()
app.exec()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
'''
from PySide6 import QtWidgets, QtCore, QtGui
'''
from PyQt5 import QtWidgets, QtCore, QtGui
class QTApp(QtWidgets.QWidget):
def __init__(self):
super(QTApp, self).__init__()
self.le_sample_input_01 = QtWidgets.QLineEdit()
self.le_sample_input_01.setPlaceholderText('Возраст')
self.le_sample_input_02 = QtWidgets.QLineEdit()
self.radioButton = QtWidgets.QRadioButton('Что-то')
self.button = QtWidgets.QPushButton('Тык')
self.button.setObjectName("button")
self.button.setStyleSheet("""
#button:pressed {
background-color: #b3b3ba;
}
""")
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.le_sample_input_01)
layout.addWidget(self.le_sample_input_02)
layout.addWidget(self.radioButton)
layout.addWidget(self.button)
self.le_sample_input_01.installEventFilter(self)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.indicator = QtWidgets.QLabel()
self.indicator.hide()
self.indicator.setPixmap(QtGui.QPixmap('SP_MessageBoxCritical.png'))
self.status_bar = QtWidgets.QStatusBar()
self.status_bar.addPermanentWidget(self.indicator)
self.status_bar.setSizeGripEnabled(False)
layout.addWidget(self.status_bar, alignment=QtCore.Qt.AlignBottom)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def eventFilter(self, obj, event):
if event.type() == QtCore.QEvent.FocusOut and \
QtGui.QFocusEvent.reason(event) == QtCore.Qt.MouseFocusReason:
if obj is self.le_sample_input_01:
try:
age = int(self.le_sample_input_01.text())
if age < 18 or age > 80:
'''
error = QtWidgets.QMessageBox()
error.setWindowTitle('Ошибка возраста')
error.setText('Возраст введён неверно (от 18 до 80 лет)')
error.setIcon(QtWidgets.QMessageBox.Warning)
error.addButton('Ок',QtWidgets.QMessageBox.AcceptRole)
error.exec()
'''
obj.setFocus()
obj.selectAll()
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
text = 'Возраст введён неверно (от 18 до 80 лет)'
self.status_bar.showMessage(text, msecs=3000)
self.indicator.show()
QtCore.QTimer.singleShot(3000, self.indicator.hide)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return True
except:
pass
return False
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
qt_app = QTApp()
qt_app.resize(300, 200) # +++
qt_app.show()
sys.exit(app.exec())
SP_MessageBoxCritical.png

