我们在前面学习了各种按钮控件,从这一章开始就是各种输入控件的学习。

首先要用的就是QLineEdit——单行编辑器,

一描述

QLineEdit是一个单行文本编辑器,允许用户输入和编辑单行纯文本。自带一些编辑例如撤销、重做、剪切、粘贴等功能。

QLineEdit继承自QWidget类,具备父类各种API。

二.功能作用

1.创建控件,设置、获取文本

这个很简单,没啥说的

le = QLineEdit(window)
le = QLineEdit('默认字符',window)    #控件创建
le.setText()                        #设置字符串
le.insert('插入的字符串')             #从光标处插入字符串  
le.text()                           #获取真是的文本字符
le.displayText()                    #获取用户能看到的字符串

注意的是最后两个,如果控件是密码输入框的时候,输入的字符用户看的是*或者黑点。那用最后一个获取的字符就是你看到的字符。而用le.text()获得的就是真是的文本。

2.输出模式

文本框的文本输出模式按下面的枚举值看有这四种

QLineEdit.setEchoMode(QLineEdit.Normal)  #设置输出模式
QLineEdit.echoMode()                     #获取输出模式(int)
#输出模式枚举值
QLineEdit.Normal                      #正常显示,返回值0
QLineEdit.NoEcho                      #不显示,返回值1
QLineEdit.Password                    #密文显示,返回值2
QLineEdit.PasswordEchoOnEdit          #编辑时正常显示,失去焦点后变密文

3.占位提示符

有些时候在打开一个界面时对话框是有提示文本的,当输入内容后文本消失被输入的值替代,这就是占位提示符的作用

QProcess 读取输出_QProcess 读取输出

占位提示符的用法

QLineEdit.setPlaceholderText('占位文本')    #设置占位文本
QLineEdit.placeholderText()                #获取占位文本

4清空按钮

平时不显示,有字符时会出现一个‘叉叉

'

QProcess 读取输出_Qt_02

单机叉叉后清除所有文本。就是清空按钮的作用

QLineEdit.setClearButtonEnabled(True)  #设置清空按钮开启
QLineEdit.isClearButtonEnabled()       #获取是否开启清空按钮

结合上面的用法可以做第一个案例:登陆对话框,要求如下

a.两个对话框,一个输入账号,一个输入密码。

b.账号框为明文,密码框用密文

c.测试用账户名为abc,密码为123,账户不存在时清空两个文本框,密码错误时清空密码框

d.增加标签,显示登陆情况

e.用面向对象的方式编程。

QProcess 读取输出_QProcess 读取输出_03

QProcess 读取输出_QProcess 读取输出_04

from PyQt5.Qt import *
from PyQt5 import QtGui
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(500,800)
        self.setMinimumSize(300,300)     #登陆窗口最小尺寸
        self.UI_test()


    def UI_test(self):
        self.le_account = QLineEdit(self)
        self.le_account.move(self.width() / 2 - self.le_account.width()/2, self.height() / 2 - 50)
        # self.le_account.move(0,0)
        self.le_account.resize(200,30)
        self.le_account.setPlaceholderText('请输入账号')
        self.le_password = QLineEdit(self)
        self.le_password.move(self.width() / 2 - self.le_password.width()/2, self.height() / 2)
        self.le_password.setEchoMode(QLineEdit.Password)
        self.le_password.setPlaceholderText('请输入密码')
        self.le_password.resize(200, 30)
        self.btn = QPushButton('登陆',self)
        self.btn.resize(100,30)
        self.btn.move(self.width() / 2 -self.btn.width()/2, self.height() / 2 + 50)
        self.btn.clicked.connect(self.checkin)
        self.label = QLabel(self)
        self.label.resize(150,50)
        self.label.move(self.width()/2,self.height()/2+100)
        self.label.setText('请登陆')
        self.label.setStyleSheet('background-color:cyan')

    def resizeEvent(self, a0: QtGui.QResizeEvent):
        print(self.size())
        self.le_account.move(self.width() / 2 - self.le_account.width()/2, self.height() / 2 - 50)
        self.le_password.move(self.width() / 2 - self.le_password.width()/2, self.height() / 2)
        self.le_password.setEchoMode(QLineEdit.Password)
        self.btn.move(self.width() / 2 -self.btn.width()/2, self.height() / 2 + 50)
        self.label.move(self.width() / 2-self.label.width()/2, self.height() / 2 + 100)
        print(self.le_account.pos())
        print(self.le_account.size())
    def checkin(self):
        account = self.le_account.text()
        pwd = self.le_password.text()
        if account != 'abc':
            self.le_account.setText('')
            self.le_password.setText('')
            self.label.setText('账号不存在')
        elif pwd != '123':
            self.le_password.setText('')
            self.label.setText('密码错误')
        else:
            self.label.setText('登陆成功')
        self.label.adjustSize()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

案例一:登陆界面第一版

这个就是个最简单的GUI了,但是还有个可以改进的地方:把程序的逻辑部分和GUI的部分独立开来

5.自动补全联想

有些时候(比如在登陆界面输入账号)当输入第一个字符后会有自动补全的功能

list = ['aaron','back','click','disc']    #自动补全的数据列表
completer = QCompleter(list,le)           #commpeter的生命周期归属于le的存在
QLineEdit.setCompleter(completer)
print(le.completer())

 6.光标控制

首先我们要了解光标移动的方向由于在文本框内字符是按照从左往右的方式输入的

QProcess 读取输出_控件_05

那么,左边就认为是后端(back),而右边就是前端(forward)

下面就是移动光标的用法

QLineEdit.cursorBackward(mark=True,steps=0)     #向左移动step个字符,mark为True时带选中效果
QLineEdit.cursorForward(mark=True,steps=0)      #向右移动step个字符,mark为True时带选中效果
QLineEdit.cursorWordBackward(mark=True)         #向左移动一个单词的长度,mark为True时带选中效果
QLineEdit.cursorWordForward(mark=True)          #向右移动一个单词的长度,mark为True时带选中效果
QLineEdit.home(mark=True)                       #光标移动至行首,mark为True时带选中效果
QLineEdit.end(mark=True)                        #光标移动至行尾,mark为True时带选中效果
QLineEdit.setCursorPosition(pos=8)              #光标移动至指定位置(如果pos为小数则向下取整)
QLineEdit.cursorPosition()                      #获取光标位置

这里要注意的时焦点的问题,因为改变光标的位置的前提是对话框是获取焦点的,但是如果点击了按钮或其他方式调用了API可能对话框就失去了焦点,就没有改变光标的效果了。

7.文本长度限制

可以设定文本框的限制长度,当输入的文本超过设定值时是无法再输入的。

QLineEdit.setMaxLength()    #长度限制设定
QLineEdit.maxLength()       #获取长度限定值

8.只读模式

可以将文本框设置为只读模式,设置后文本无法更改

QLineEdit.setReadOnly(True)   #设定为只读模式
QLineEdit.isReadOnly()        #获取控件是否设定为只读模式

9.边距设置

默认情况下文本框内的文本是再文本框中左对齐居中的,即便是一个比较大的框框。

QProcess 读取输出_文本框_06

我们再QWidget里有个内容边距,

le.setContentsMargins(80,20,20,20)

这个是文本框和外部的轮廓的距离,出来就是这样的了

QProcess 读取输出_Qt_07

背景都变了把,其实我们只是向让文本的位置发生变化,就要用QLineEdit类里的功能

QLineEdit.setTextMargins(left=,top=,right=,bottom=) #设置文本边距
QLineEdit.textMargins()                             #获取文本边距

就可以改变文本的边距

le.setTextMargins(80,20,20,20)

QProcess 读取输出_Qt_08

看看是不是改变了文本的位置!

10.对齐方式

对齐方式的设定API

QLineEdit.setAlignment(Qt.AlignHCenter)   #设置对齐方式
QLineEdit.alignment()                     #获取对齐方式
#枚举值
Qt.AlignHCenter   #水平居中
Qt.AlignLeft     #水平靠左
Qt.AlignRight    #水平靠右
Qt.AlignTop      #垂直靠上
Qt.AlignVCenter  #垂直居中
Qt.AlignBottom   #垂直靠下
Qt.AlignCenter   #居中

在设定的时候可以用管道符"|"同时设定水平和垂直的效果

le.setAlignment(Qt.AlignRight|Qt.AlignBottom)

 11.常用的编辑功能

QLineEdit可以用代码实现常规的编辑功能:撤销、复制、剪切、粘贴等等。

QLineEdit.backspace()  # 删除光标左侧字符或选中的文本
QLineEdit.del_()  # 删除光标右侧字符或选中文本
QLineEdit.cQLineEditar()  # 删除文本框所有内容
QLineEdit.copy()
QLineEdit.cut()
QLineEdit.paste()
QLineEdit.isUndoAvailabQLineEdit()  # 是否可执行撤销动作
QLineEdit.undo()
QLineEdit.isRedoAvailabQLineEdit()  # 是否可执行重做动作
QLineEdit.redo()
QLineEdit.setDragEnabQLineEditd(True)  # 设置文本可拖放
QLineEdit.seQLineEditctAll()

这里有个小细节要注意:我们通过代码实现鼠标复制字符后再粘贴时要注意复制后是选中的状态,不能直接粘贴,应该把光标移动并不用选中状态。

还有文本的选中状态 

QLineEdit.setSeQLineEditction(0, 4)   #选中指定范围的文本(起始位,长度)
QLineEdit.seQLineEditctAll()          #选中所有文本
QLineEdit.deseQLineEditct()           #取消选中文本
QLineEdit.hasSeQLineEditctedText()    #是否有选中文本
QLineEdit.seQLineEditctionStart()     #获取选中起始位置
QLineEdit.seQLineEditctionEnd()       #获取选中结束位置
QLineEdit.seQLineEditctionQLineEditngth()    #获取选中字符长度

选中状态的获取要注意的细节就是如果用按钮获取选中是状态时会改变焦点,而焦点改变后文本框的选中状态就没有了。

12.文本修改状态

这个的用途还不太清楚,就把API列出来吧

QLineEdit.isModified()         #文本是否处于被更改
QLineEdit.setModified(False)   #取消文本被更改的状态

13.添加自定义行为

前面讲的都是QLineEdit的简单的用法,下面讲几个复杂的API,这一节就讲添加自定义行为,他可以为文本框添加附加的行为操作。为对话框添加一个图标,当图标被点击时有相应的行为。就像一般登陆时的密码框,旁边都有个小眼睛,默认时候密码是不可见的,点击眼睛密码就成明文的了。先放两个图标

QProcess 读取输出_文本框_09

  

QProcess 读取输出_Qt_10

当点击图标时可以切换明文和密文的显示

action = QAction(le)
action.setIcon(QIcon('open.png'))
le.addAction(action,QLineEdit.LeadingPosition)
# QLineEdit.TrailingPosition     #在文本框后端显示图标
# QLineEdit.LeadingPosition      #在文本框前端显示图标
def change_action():
    pass
action.triggered.connect(change_action)   #行为触发程序

程序就是这样的

QProcess 读取输出_QProcess 读取输出_03

QProcess 读取输出_QProcess 读取输出_04

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
le = QLineEdit(window)
le.setEchoMode(QLineEdit.Password)
action = QAction(le)
action.setIcon(QIcon('close.png'))
le.addAction(action,QLineEdit.LeadingPosition)
def change_action():
    if le.echoMode() == 2:
        action.setIcon(QIcon('open.png'))
        le.setEchoMode(QLineEdit.Normal)
    else:
        action.setIcon(QIcon('close.png'))
        le.setEchoMode(QLineEdit.Password)

action.triggered.connect(change_action)   #行为触发程序

window.show()
sys.exit(app.exec_())

自定义行为

14.内容文本限制

内容文本的限制有两种方式:验证器和掩码限制。这个用法以后再总结吧

三.常用信号

1.文本被编辑

QLineEdit.textEdited(text)

文本被编辑(只要是编辑,哪怕文本没有改变)时发射信号,带有参数(文本框内容)。但是只有用户编辑时会触发,用setText()是没用的!

2.文本被改变

QLineEdit.textChanged(text)

这个和上面的基本一样,不过是只要文本发生变化就会触发信号,包括通过代码改变的文本。

3.回车键按下

QLineEdit.returnPressed()

当回车键被按下时触发,无参数传递

4.结束编辑

QLineEdit.editingFinished()

文本结束编辑时触发(包括按下回车键和失去焦点)

5.光标位置发生改变

QLineEdit.cursorPositionChanged(self, a0: int, a1: int)

光标位置发生改变时触发,传递两个参数:a0:是光标初始位置;a1:光标移动后位置

6.选中文本发生变化

QLineEdit.selectionChanged()

选中的文本发生变化时触发,无参数传递。

QLineEdit类学习总结完毕!