PyQt5学习(3)--QWidget,QLabel,QLIneEdit,QTextEdit,按钮类

-1、 QWidget类

QWidget叫做“基础窗口控件”,这个类是所有用户界面的基类,所有的窗口或者控件都直接或者间接的继承了这个类,使用这个类的时候可以直接使用,也可以继承了再使用。
QWidget类直接提供的成员函数为有x(),y(),width(),height();
QWidget里面有一个函数提供的成员函数也有上面的三个;
QWidget的frameGeometry()得到的是客户区的相关坐标和尺寸。

其实在这里的改变窗口的大小,客户区的大小等功能,即可以用手动敲代码的方式完成,也可以用QT Designer的代码生成器直接做出来,只不过用这个代码生成器的时候要记住了每一个控件响应的名字,继承了那个类,这个类里面有什么默认的信号,控件发送信号的机制是什么。后面的时候学到了这些内容。

在PyQt5中,其实和所有的GUI界面编程的原理是一样的,都包含了窗口,和控件。窗口是窗口,控件就是小按钮之类的。控件不能再细分了。窗口一般是用来显示的,控件是用来和用户交互的。常用的窗口有顶层窗口,Dialog窗口等,控件就有按钮,文本显示框,单选或者复选框,组合框等。学习的过程中,先学了主要的窗口显示,然后再学了相关的控件。

这回的是QWidget。

1、客户区不包含上层的工具栏,标题栏等。就是下面可以用来交互的部分。
(1)QWidget.resize(int width, int height):用来改变客户区的大小;
(2)QWidget.size():取得客户区的大小;
(3)QWidget.setGeometry(int x, int y, int width , int height ):同事改变客户区的大小和位置
(4)QWidget.pos():得到窗口左上角的坐标
在类里面,如果我们继承的是QWidget,那么在__init__()函数中,初始化的工作可以这么做:
把上面的QWidget替换成self,比如说设置客户区的显示的大小的话就可以直接初始化成为:
self.resizie(100,100)
这个初始化完成以后允许客户通过鼠标拖动的方式再次改变窗口的大小,并且这个大小尺寸是弹性的。
2、在PyQt5中如果不为控件指明基类,那么这个空间就会被当做窗口处理,这个时候setWindowTitle()和serWIndowIcon()两个函数就可用。---->这句话基本上没啥用,一个东西要么是控件,要么是窗口,创建控件的时候,肯定是实例化了某一个类,那就是指定了这个控件的基类,在控件的基类里面,也有设置响应的显示空间名称的函数,有些甚至是直接初始化的,比如初始化一个QPushButton类的时候,后面都会加一个str参数,这个str参数就是你要给控件起得名字,如果不加,也可以用bt.setText()函数来指定。 举个例子:
btn1=QPushButton('MagicaLPO') #实例化一个按钮,并把按钮的名字设置为Magical
3、还可以为窗口设置Icon,设置pixmap。我觉的没什么用,我们做GUI的时候一般都会选择将写好的代码进行打包然后发布。设置的资源越多,打包的时候需要加载的资源就越多,exe文件也就越大。本来Python作为一个解释性语言,在打包文件的时候会将所有解释器需要的包都给打包进来,占用大量的空间,随随便便好几兆。设置这些花里胡哨的东西,除了增加硬盘负担,没啥用处了。
一般的C++写出来的MFC文件,可能有几个KB,为了实现相同的功能,Python打包出来的exe文件可能会有好几MB。而且,我还打包过将近300MB的exe文件,好可怕!

  1. QLabel类

我把这个类用来显示给用户的相关提示信息,这个类本身可以做的工作比较多,可以用来显示图片,GIF动画,文本等,显示的这些内容在界面是不和用户进行交互的,只显示,而不可编辑。这个类比较重要,重要的是里面有这几个函数可以用:
(1)self.label1.text():获得Qlabel文本的内容
(2)self.label1.setText():设置QLabel将要显示的文本内容
(3)self.label1.setWordWrap():设置是否允许换行显示

-3、 QLineEdit类

QLineEdit叫做单行文本框控件,用让用户输入一行的字符串。这个控件可以与用户交互,让用户输入相应的内容,并且可以由信号和槽函数连接起来,获取用户到底输入的是啥。里面有一些比较重要的函数:
(1)self.line1.clear():清除文本框里面的内容,如果连接了button的话,可以在button上面显示‘清除’,然后在槽函数中调用这句话,就把文本框里面的内容全部清除掉。
(2)self.line1.setMaxLengh():设置框框里面允许用户输入的最大的字符串的长度
(3)self.line1.setReadOnly():字面意思,让该文本框只读,不可更改
(4)self.line1.setText():设置文本框的显示内容。这里的意思就是让你在用户第一次运行该界面的时候,文本框里已经默认存在的文本内容,类似于用户提示,或者输入规则等等。
(5)self.line1.Text():获取文本框的内容,这个简单,没什么需要记忆的。
在书上面,我看到的是在QLineEdit这个里面,可以用来设置掩码,比如说让用户输入特定格式的内容,或者是输入的密码等不可见信息,这个对我来说用处不大,暂且忽略掉。如果以后突然间想起来要用到这个技术的时候,再回过头来仔细研究。

-4、QTextEdit

QTextEdit类叫做多行文本框控件,用来显示多行数据。当用户的数据超过一行的时候,这个类会自动出来一个垂直滑动条。这个类可以和读取文件结合起来,让用户打开文件,然后将文件的内容显示在QTextEdit这个控件里面,由于在这个控件里面,用户可以与控件中的内容进行交互,所以,用户可以在控件中对文件内容工作二次修改,然后在调用self.text()方法,获取到用户已经修改完成的文件。
做这个工作的时候,在界面的设计上,可以按照面向过程的设计思维去做,让用户从上之下,一步一步的执行必须的操作,且每一步的操作都是可以二次更改的。这里就是把能暴露给用户的权限尽量全部暴露出来,程序内部进行计算和信号传递的是已经经过用户确认的信息。
QTextEdit中有一些内置的方法,介绍一下:
(1)self.text1.setText():设置文本框中显示的内容,这里的内容可以使用户读取的文件内容
(2)self.text1.setPlainText(‘直接输入想要显示的文本’):和第一个函数很容易混淆,但是在我实践的过程当中我已经明白了,setPlainText()函数不能把读取的文件内容显示在控件上。
(3)self.text1.text()我猜的,这个函数应该可以用,功能应该是返回文本框的内容
(4)self.text1.clear():清除内容。
这里贴上我的一段代码:

from PyQt5.QtWidgets import QWidget,QApplication,QHBoxLayout,QTextEdit,QPushButton
import sys
class cuizhiwen(QWidget):
    def __init__(self):
    	#调用super函数初始化基类的构造函数
        super(cuizhiwen, self).__init__()
		
		#设置本窗口的名称
        self.setWindowTitle("MagicalPO")
       
        #实例化button类,初始化的时候已经给了按钮名称
        self.btn1=QPushButton('显示文件')
        self.btn2=QPushButton('清除信息')
		
		#实例化QTextEdit类,得到这个控件
        self.text=QTextEdit()
        
		#设置好布局,并且把上面实例化的控件放到布局中
        self.layout=QHBoxLayout()
        self.layout.addWidget(self.btn1)
        self.layout.addWidget(self.btn2)
        self.layout.addWidget(self.text)
        self.setLayout(self.layout)#放置控件
		
		#将按钮1和2用clicked.connect()到自定义的函数上
		self.btn1.clicked.connect(self.dianji)
        self.btn2.clicked.connect(self.dianji2)

    def dianji(self):
    	#读取文件,显示到框框上
        with open("D:\\test.txt") as f:
            neirong=f.read()
        self.text.setText(neirong)
    def dianji2(self):
    	#清除控件的内容
        self.text.clear()

if __name__ == '__main__':
    app=QApplication(sys.argv)
    a=cuizhiwen()
    a.show()
    sys.exit(app.exec_())

右键运行,运行完的效果如下所示:
在这里插入图片描述
程序里面内置了需要打开的文件地址,没让用户输入,其实这里也可以用QFileDialog类,创建一个打开文件的对话框,暂且略过。

-5、按钮类

按钮类继承的基类叫做QAbstractButton类,这个类是抽象类,不能直接使用,要继承才能实例化,下面的几个按钮都是继承了这个类:

QPUshButton \ QToolButton \ QRadioButton \ QCheckBox
在QAbstractButton中,有下面的几个信号:

Pressed:鼠标在按钮上并且按下鼠标左键的信号
Released:鼠标左键松开的时候发射的信号
Clicked:鼠标的左键按下,然后松开;或者是调用的快捷键的时候将要发送的信号
Toggled:按钮的标记状态发生改变的时候发送的信号(状态一旦被改变,就直接发送该信号,不需要再有按钮来传递,可以由该控件本身调用这个信号,将信号交给响应的槽函数来处理)

上面的四个儿子类都是继承了这个抽象基类,所以,儿子类也有这几种信号,如果儿子类中不需要其中的某一个信号,可以由儿子类在里面进行重写覆盖。调用的时候只会调用已经重写的儿子类中的方法。
由于四个儿子类都继承了QAbstractButton类,在他们类的内部肯定也写了自己响应的信号和函数,根据不同的使用场景,使用不同的类完成不同的功能。

5、1QPushButton
类第一次看到这个类的名字的时候我就知道这是干嘛的,就是一个按钮而已,他肯定过信号clicked,应该是直接继承了的,这个类里面没有重写。这个类里面的方法:

我发现直接接图比我一个字一个字的打出要方便多了,直接接图,还看的清楚点儿,结构也清晰。

5.2 QRadioButton类

长得就像收音机一样,哈哈
方法:
在这里插入图片描述
RadioButton类用的信号是toggled。使用与状态的监听

5.3 QCheckBox类
5.4 QComboBox类
不写了,太累了。还不如直接上手开干!

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页