
输出模式。比如用户输入密码,输进去的是文本,显示的是密文,或者编辑时时明文,结束编辑后密文。setEchoMode(QLineEdit.EchoMode)来设置文本输出模式。EchoMode = Normal(正常显示)/Password(密文显示)等等。setEchoMode(QLineEdit.Normal)。
line_2 = QLineEdit(window)
line_2.move(100,200)
line_2.setEchoMode(QLineEdit.Password)
如何让一个文本框一直在窗口中间,即便缩放窗口,文本框仍然居中。缩放窗口,代表的是窗口尺寸的变化,要想让窗口缩放事件触发特定的信号,我们就要重写resizeEvent方法,在该方法里来调整文本框的位置,这样每次窗口尺寸变化,都会触发该事件,从而让文本框位置变化。所以要创建子类来覆写。不过对于简单的小窗口,直接固定窗口尺寸让其不能缩放就好了。
import sys
from PyQt5.Qt import *
#创建子类来覆写resizeEvent
class MyWindow(QWidget) :
def __init__(self, *args, **kwargs) :
super().__init__(*args, **kwargs)
self.setup_ui()
def setup_ui(self):
self.resize(500,500)
self.le = QLineEdit(self)
self.le_width = 100
self.le_height = 50
self.le.resize(self.le_width,self.le_height)
def resizeEvent(self, evt):
#计算文本框的位置,让其在窗口居中
self.move_x = (self.width() - self.le_width) / 2
self.move_y = (self.height() - self.le_height) / 2
#根据计算的位置,移动文本框
self.le.move(self.move_x,self.move_y)
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
文本框清空。clear()。
关于用户输入账号密码然后登陆的判定,可以将这个判定过程抽离出来封装成一个类,这样就更方便维护和复用。
import sys
from PyQt5.Qt import *
#定义一个检查用户名和密码的方法,方便后续复用和维护
class logInTool() :
#定义了三个枚举值,用于代表不同的登录状态,它们是类属性,在类的内部和外部都可以通过类名.属性名调用,不需要在类的外部定义实例来调用
username_error = 1
password_error = 2
success = 3
#定义一个检查的静态方法,这样在外部调用可以通过类名.方法名调用,不需要定义实例
@staticmethod
def log_in_check(user_name,password):
if user_name != "123" :
return logInTool.username_error #return以后方法自动结束,所以如果能走到下一步,就代表user_name == 123,这也相当于一个隐形的判定
if password != "xxx" :
return logInTool.password_error
return logInTool.success
app = QApplication(sys.argv)
window = QWidget()
window.resize(500,500)
line = QLineEdit(window)
line.move(100,100)
line_2 = QLineEdit(window)
line_2.move(100,200)
line_2.setEchoMode(QLineEdit.Password)
btn = QPushButton(window)
btn.setText("LOG IN")
btn.move(100,300)
label_1 = QLabel(window)
label_1.resize(100,50)
label_1.move(300,100)
label_1.setText("用户名错误")
label_1.setVisible(False)
label_2 = QLabel(window)
label_2.resize(100,50)
label_2.move(300,200)
label_2.setText("密码错误")
label_2.setVisible(False)
label_3 = QLabel(window)
label_3.resize(100,50)
label_3.move(300,300)
label_3.setText("登陆成功")
label_3.setVisible(False)
def log_in() :
user_name = line.text()
password = line_2.text()
state = logInTool.log_in_check(user_name, password) #调用静态方法,不需要定义实例,直接传入参数即可
if state == logInTool.username_error :
line.clear()
line_2.clear()
line.setFocus()
label_1.setVisible(True)
label_2.setVisible(False)
label_3.setVisible(False)
return None #这一句表示结束这个函数,这也如果能走到下一步,就代表state != logInTool.username_error,相当于一个隐形的判断
if state == logInTool.password_error :
line_2.clear()
line_2.setFocus()
label_2.setVisible(True)
label_3.setVisible(False)
label_1.setVisible(False)
return None
if state == logInTool.success :
label_3.setVisible(True)
label_1.setVisible(False)
label_2.setVisible(False)
btn.clicked.connect(log_in)
window.show()
sys.exit(app.exec_())
占位提示语句。场景,在一个文本框里显示了“请输入密码”,当用户焦点放在这个文本框并输入文本以后,这个语句自动消失。setPlaceholderText(str)。
清空按钮。setClearButtonEnabled(bool)。传入True,一个文本框里输入内容以后,会显示一个清空按钮,清空以后,就能一次全部清空文本框内容。
添加 *** 作行为。为文本框添加附加的 *** 作行为。addAction(QAction,QLineEdit.ActionPostion),其中QLineEdit.ActionPostion用来控制这个QAction在文本框的位置,可以取两个值,QLineEdit.LeadingPostion和QLineEdit.TrailingPostion,分别指这个QAction的位置在文本框的前面和后面。
le = QLineEdit(window)
le.move(100,200)
#将文本框的输出模式设为密文
le.setEchoMode(QLineEdit.Password)
#创建一个action,并为其添加一个代表现在是密文显示模式的图标。只有添加了图标的action,才能在文本框里显示出来
action = QAction(le)
action.setIcon(QIcon("密文.jpg"))
#定义一个槽函数,可以让文本框的输出模式在密文和明文之间切换,并相应改变action图标
def change() :
#如果此时文本框输出模式是密文,那么就将其改变为明文,并把图标改为明文显示图标
if le.echoMode() == QLineEdit.Password :
le.setEchoMode(QLineEdit.Normal)
action.setIcon(QIcon"明文.jpg")
else :
le.setEchoMode(QLineEdit.Password)
action.setIcon(QIcon"密文.jpg")
#将这个action添加给文本框,并放在文本框的后面
le.addAction(action,QLineEdit.TrailingPosition)
#action的triggered信号会连一个槽函数。这样每次点这个action按钮,都会触发槽函数
action.triggered.connect(change)
#上面这段代码可以实现:在密码框旁边有一个按钮,并配有图标提示,我们可以通过点击它,来使密码明文显示或密文显示,
自动补全联想。我们先设置一些默认字段比如xxx和xow,这样用户输入一个x,就可以展示出xxx和xow,让用户选择自动补全为哪个。setCompletor(QCompletor),传入一个QCompletor参数。
completor = QCompletor([xxx,xow],lineedit) #QCompletor对象在创建时,可以传入一个包含str元素的列表,然后传入一个父对象
lineedit.setCompletor(completor)
输入内容限制。内容长度限制,setMaxLength(int),输入的内容不能超过设置的长度,setText的内容也不行。只读限制,setReadOnly(bool),设为True就根本不能输入内容,但是还是可以通过setText来设置文本。
输入内容限制——规则限制。这样可以自定义用户输入的规则,比如只能输入数字,数字只能在一定范围等等。setValidator(QValidator),传入一个QValidator验证器作为参数。QValidator验证器的使用。QValidator验证器,用于验证用户输入内容的合法性。用户在文本框输入内容以后,首先会将文本内容传递给验证器进行验证,调用validate(self,inpot_text_pos)方法,传入参数包括文本内容和光标位置,返回值有三个,一个是不符合要求,一个是符合要求,还有一个是暂时无法判定(比如文本限制是18-999,那么用户刚刚输入了一个3,这个时候用户还有可能继续输入,所以暂时无法判定用户的输入符不符合要求)。若文本框输入结束以后,上述验证的返回值不是符合要求,就会调用修复方法fixup(self,input_text),并返回修正以后的文本。
QValidator验证器是一个抽象类,要想使用,需要进行子类化 *** 作。要么是自定义子类,也可以用系统提供的子类QintValidator,QDoubleValidator等。
#由于QValidator是一个抽象类,所以要创建一个自定义子类。这个编辑器的功能是只允许输入的内容是18-180之间的数字
class MyValidator(QValidator) :
#传入的三个参数分别是验证器自身,输入的文本和光标位置
def validate(self, text_str, pos_int) :
#如果输入的内容是数字,就执行try
try :
#如果内容在18-180之间,那么久返回有效状态QValidator.Acceptable
if 18 <= int(text_str) <= 180 :
return (QValidator.Acceptable,text_str,pos_int)
#如果用户刚输了一个1到17之间的,这时不能直接判定无效还有可能往下输入,那么返回一个中间状态,
elif 1 <= int(text_str) <= 17 :
return (QValidator.Intermediate,text_str,pos_int)
#返回无效状态
else :
return (QValidator.Invalid,text_str,pos_int)
#如果输入的内容不是数字,执行except
except :
#如果输入的内容是空,那么久返回中间状态QValidator.Intermediate
if len(text_str) == 0 :
return (QValidator.Intermediate, text_str, pos_int)
#如果输入的内容是数字和空以外的,就返回无效状态QValidator.Invalid
return (QValidator.Invalid,text_str,pos_int)
#若validate返回的是中间状态和无效状态,就会进入这个修复函数
def fixup(self, text_str):
#如果传过来的text_str有内容,就执行try
try :
#如果传过来的text_str的值比18小,就修复成18然后返回出来
if int(text_str) < 18 :
return "18"
#如果传过来的text_str的值比180大或者是别的类型的数据,就修复成180然后返回出来
return "180"
#如果传过来的text_str为空,就执行except
except :
#将其修复成180
return "180"
app = QApplication(sys.argv)
window = QWidget()
window.resize(500,500)
le = QLineEdit(window)
le.move(100,200)
#创建验证器并为文本框设置验证器
validator = MyValidator()
le.setValidator(validator)
window.show()
除了上述直接自定义一个类,我们也可以使用系统提供的QValidator的子类,比如QIntValidator(),这个子类的作用就是可以传两个int参数,分别作为限制的下限和上限。但是它有一个问题,比如我们传入18,180,对于大于180的数,它可以很好的限制,但是对于小于18的数,它仍然会正常显示。究其原因,是因为这个函数的fixup方法不能很好地处理QValidator.Intermediate这种状态。要想解决,我们可以创建这个类的子类,然后覆写fixup方法。、
#由于QValidator是一个抽象类,所以要创建一个自定义子类。这个编辑器的功能是只允许输入的内容是18-180之间的数字
class MyValidator(QIntValidator) :
def fixup(self, text_str):
#如果传过来的text_str为空或小于18,就将其修复为18然后返回
if len(text_str) == 0 or int(text_str) < 18 :
return "18"
app = QApplication(sys.argv)
window = QWidget()
window.resize(500,500)
le = QLineEdit(window)
le.move(100,200)
#创建验证器并为文本框设置验证器,可以直接传入18和180作为上下限
validator = MyValidator(18,180)
le.setValidator(validator)
掩码限制文本。setInputMask(mask_str)。可以指定固定位置的固定数据类型,达到格式上的限制。比如0000-00000000,就代表一个电话号码的格式,用于输入四位数以后就会自动到-后面,然后再输入八位数。mask_str字符串:掩码字符,分隔字符,占位字符。占位字符的意思可参考前面的占位提示语句。具体写法可查资料。
文本修改状态。setModified(bool)和isModified(),后者可以查看该文本框是否是被修改状态(比如输入了数字),前者setModified(False)可以将文本框设置为被修改状态调整为未修改状态(也就是文本框里没有输入东西了)。
光标位置控制。cursorBackward(bool_mark,int steps = 1),让光标向后(左)移动steps个字符,mark设为True,带选中效果,False不带。等等类似的方法。setCursorPosition(int)和cursorPosition()获取光标位置。
文本边距设置。setTextMargins(左,上,右,下)和textMargins()返回元组。
对齐方式。setAlignment(Qt.)。setAlignment(Qt.AlignRight | Qt.AlignTop),水平靠右,垂直靠山,|可以使用两个Qt值。这个可以和文本边距配合使用,这样水平靠右会在计算水平边距以后再水平靠右。
常用文本编辑 *** 作。clear(),backspace()等等。实现对文本框内容的编辑。setDragEnabled(bool),设置选中文本以后是否可以拖拽。setSelection(int,int),设置选中文本,第一个int代表光标起始处,第二个int代表选择文本长度。selectAll(),全选。等等方法。
QLineEdit()所特有的信号。textEdited(text),文本编辑时触发(用户在文本框里编辑内容,如果用setText来改变,不会触发),传递给槽函数的参数text代表文本内容;textChanged(text),文本内容发生改变时触发,只要是内容改变就会触发,用setText也会触发,传递给槽函数的参数text代表文本内容;returnPressed(),按下回车时触发;editingFinished(),结束编辑时触发;cursorPositionChanged(int oldPos,int newPos),光标位置改变时触发,传递给槽函数的参数代表光标移动前后的位置;selectionChanged(),选中的文本发生改变时触发。
QFrame()。直接继承自QWidget()。主要用来控制边框样式,凸起,凹下,阴影,线宽等,可以直接使用。setFrameShape(QFrame.),框架形状;setFrameShadow(QFrame.),框架阴影样式;setLineWidth(int),框架外线宽度;setMidLineWidth(int),框架中线宽度。
QAbstractScrollArea()。直接继承自QFrame()。是一个抽象类,只能创建子类来使用。是滚动区域的低级抽象。功能1:设置水平和垂直滚动条,setHorizontalScrollBar(QScrollBar),传入一个QScrollBar类的实例作为参数。功能2:滚动条策略,setHorizontalScrollBarPolicy(Qt.),传入滚动条策略。功能3:角落控件,setCornerWidget(QWidget),把一个QWidget作为参数传入,会放在右下角落。
QTextEdit()。直接继承自QAbstractScrollArea()。所见即所得,支持HTML4格式的富文本(和纯文本对应)显示。可适用段落和字符,如果文本内容过大,会出现滚动条。支持富文本,可显示图像,列表和表格。创建方法和别的类似,可以直接传入显示文本内容。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)