我需要在字段中输入一个数字QLineEdit,
在我的例子中是这个人的年龄(年龄范围от 18 до 80)。
输入并切换焦点到另一个对象后,例如,到另一个字段或按下按钮,您需要程序检查输入的数字,如果小于 18 或大于 80,显示一个弹出窗口,带有错误并把重点放在这个领域,如果一切都好,什么也不做。
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QGridLayout, QHBoxLayout, QLabel,
QLineEdit, QMainWindow, QSizePolicy, QWidget)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(371, 118)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.label = QLabel(self.centralwidget)
self.label.setObjectName(u"label")
self.horizontalLayout.addWidget(self.label)
self.lineEdit = QLineEdit(self.centralwidget)
self.lineEdit.setObjectName(u"lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.label_2 = QLabel(self.centralwidget)
self.label_2.setObjectName(u"label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.lineEdit_2 = QLineEdit(self.centralwidget)
self.lineEdit_2.setObjectName(u"lineEdit_2")
self.horizontalLayout_2.addWidget(self.lineEdit_2)
self.gridLayout.addLayout(self.horizontalLayout_2, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.label.setText(QCoreApplication.translate("MainWindow", u"\u0412\u043e\u0437\u0440\u0430\u0441\u0442", None))
self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u0427\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435", None))
# retranslateUi
import sys
from test import *
class Test(QMainWindow):
def __init__(self):
super(Test, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Test()
window.show()
sys.exit(app.exec())
我尝试通过eventFilter,一切正常,但焦点有问题。如果您返回焦点,则光标在其上不可见,我也想选择所有文本,但selectAll()它不起作用。
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()
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.LE_sample_input_01)
layout.addWidget(self.LE_sample_input_02)
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:
self.LE_sample_input_01.setFocus()
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()
except:
print('Ошибка')
return QtWidgets.QWidget.eventFilter(self,obj,event)
if __name__ == "__main__":
app = QtWidgets.QApplication()
qt_app = QTApp()
qt_app.show()
app.exec()
一个可能的解决方案如下所示: