Python pyqt5标签可见性未隐藏的问题
我试图隐藏未填写行编辑时创建的错误标签(“*”),然后在填写时使其消失,但我的程序不一致 它不起作用的一个例子:Python pyqt5标签可见性未隐藏的问题,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我试图隐藏未填写行编辑时创建的错误标签(“*”),然后在填写时使其消失,但我的程序不一致 它不起作用的一个例子: 将三个插槽留空,然后按“添加学生”按钮-每个插槽旁边将显示一个红色星号 在第一行(“开始日期”)中输入任何内容,然后按“添加学生”按钮-红色星号将消失 对名字重复2,但红色星号不会消失 对姓氏重复2,但该姓氏的红色星号也不会消失 导入系统 导入日期时间 从PyQt5将QtWidgets导入为qt、QtGui、QtCore 类AddStudent(qt.QMainWindow): 定义
我对您的代码做了以下更改:
self.errorFound
。正如我在评论中所暗示的,你从来没有真正检查过它的价值。如果您只想知道任何用户输入是否错误,一个布尔值无法告诉您哪个输入错误,那么找到一个self.error可能会很有用。每次调用submit
函数时,我只需检查用户输入的文本是否为空
QFormLayout
类在屏幕上定位小部件。这就消除了在小部件应该属于哪个位置的绝对坐标中键入的所有猜测和数学运算。它还可以防止窗口太小时小部件“消失”。这有一个限制,每行只能容纳两个小部件。出于这个原因,我放弃了星号,只为对应的错误输入的QLabel着色。这可以通过QGridLayout
解决,如果您喜欢QFormLayout
,也可以通过
import sys
import datetime
from PyQt5 import QtWidgets as qt, QtGui, QtCore
class MyApp(qt.QMainWindow):
def __init__(self):
super().__init__()
screenSize = qt.QDesktopWidget().screenGeometry(-1)
self.setup()
self.setWindowTitle("My Awesome App!")
def setup(self):
self.form = qt.QGroupBox("Add Student")
self.form_layout = qt.QFormLayout()
self.create_date_input()
self.create_first_name_input()
self.create_last_name_input()
self.create_submit_button()
self.form.setLayout(self.form_layout)
self.setContentsMargins(5, 5, 5, 5)
self.setCentralWidget(self.form)
def create_date_input(self):
self.date_label = qt.QLabel("Starting Date:")
self.date_entry = qt.QLineEdit(self)
date = str(datetime.date.today()).split("-")
today = date[1] + "/" + date[2] + "/" + date[0]
self.date_entry.setText(today)
self.form_layout.addRow(
self.date_label,
self.date_entry,
)
def create_first_name_input(self):
self.first_name_label = qt.QLabel("First Name:")
self.first_name_entry = qt.QLineEdit(self)
self.form_layout.addRow(
self.first_name_label,
self.first_name_entry,
)
def create_last_name_input(self):
self.last_name_label = qt.QLabel("Last Name:")
self.last_name_entry = qt.QLineEdit(self)
self.form_layout.addRow(
self.last_name_label,
self.last_name_entry,
)
def create_submit_button(self):
self.submit_button = qt.QPushButton(self)
self.submit_button.setText("Add Student")
self.submit_button.clicked.connect(self.submit)
self.form_layout.addRow(self.submit_button)
def submit(self):
default_color = "color: black"
error_color = "color: red"
date_color = default_color
first_name_color = default_color
last_name_color = default_color
#really should validate if this is a date, not just if it is empty
if (self.date_entry.text() == ""):
date_color = error_color
if (self.first_name_entry.text() == ""):
first_name_color = error_color
if (self.last_name_entry.text() == ""):
last_name_color = error_color
self.date_label.setStyleSheet(date_color)
self.first_name_label.setStyleSheet(first_name_color)
self.last_name_label.setStyleSheet(last_name_color)
app = qt.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec())
import sys
from PyQt5 import QtCore, QtWidgets
class MyLineEdit(QtWidgets.QLineEdit):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# the "invalid" label *has* to be a child of this QLineEdit
self.invalidLabel = QtWidgets.QLabel('*', self)
self.invalidLabel.setStyleSheet('color: red;')
spacing = 2
# get default margins and re-set them accordingly
self.leftMargin, self.topMargin, self.rightMargin, self.bottomMargin = self.getContentsMargins()
self.rightMargin += self.invalidLabel.minimumSizeHint().width() + spacing
self.setContentsMargins(self.leftMargin, self.topMargin, self.rightMargin + spacing, self.bottomMargin)
self.textChanged.connect(self.setValid)
self.setValid(self.text())
def setValid(self, text):
self.invalidLabel.setVisible(not bool(text))
def isValid(self):
return bool(self.text())
def resizeEvent(self, event):
self.invalidLabel.setGeometry(self.width() - self.rightMargin, self.topMargin,
self.invalidLabel.minimumSizeHint().width(), self.height() - self.topMargin - self.bottomMargin)
class MyApp(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setup()
def setup(self):
self.form = QtWidgets.QGroupBox("Add Student")
self.setCentralWidget(self.form)
self.formLayout = QtWidgets.QFormLayout()
self.form.setLayout(self.formLayout)
self.fields = []
self.create_field('Starting Date:', defaultValue=QtCore.QDate.currentDate().toString('MM/dd/yyyy'))
self.create_field('First Name:')
self.create_field('Last Name:')
self.create_submit_button()
def create_field(self, label, defaultValue=''):
field = MyLineEdit(defaultValue)
self.fields.append(field)
field.defaultValue = field.text()
self.formLayout.addRow(label, field)
field.textChanged.connect(self.checkFields)
def create_submit_button(self):
self.submitButton = QtWidgets.QPushButton('Add Student')
self.formLayout.addRow(self.submitButton)
self.submitButton.clicked.connect(self.submit)
self.submitButton.setEnabled(False)
self.checkFields()
def checkFields(self):
self.submitButton.setEnabled(all(field.isValid() for field in self.fields))
def submit(self):
# doSomething([field.text() for field in self.fields)
for field in self.fields:
field.setText(field.defaultValue)
app = QtWidgets.QApplication(sys.argv)
w = MyApp()
w.show()
sys.exit(app.exec_())