python GUI编程 PyQT5

一:GUI开发简介                 

GUI是Graphical User Interface(图形用户界面)的缩写

在GUI中,并不只是键入文本和返回文本,用户可以看到窗口、按钮、文本框等图形,而且可以用鼠标点击,还可以通过键盘键入。

GUI是与程序交互的一种不同的方式。

目前为止的程序都是命令行或文本模式程序

GUI的程序仍然有3个基本要素:输入、处理和输出

二:PYTHON下GUI框架简介

三:PYQT安装及使用

第一步:安装python

第二步:安装PyQt5-sip

sip是RiverBank(也就是PyQt的开发商)开发的用于PyQt的Python/C++混合编程解决方案。作为Python Module的PyQt,
依赖于作为Python Module的sip。

第三步:安装PyQt5

 测试是否安装成功

之后在任意目录中新建一个.py文件,在该文件中输入以下代码

 然后保存,运行,出现窗体,表示成功 

四:PyQT模块介绍

五:PyQT主要类介绍

PyQt5 API拥有620多个类和6000个函数。它是一个跨平台的工具包,可以运行在所有主流的操作系统上,包括Windows、Linux和Mac OS

QObject类:在类层次结构中是顶部类(Top Class),它是所有PyQt对象的基类。

QPaintDevice类:所有可绘制的对象的基类。

QApplication类:用于管理图形用户界面应用程序的控制流和主要设置。它包含主事件循环,对来自窗口系统和其他资源的所有事件进行处理和调度;它也对应用程序的初始化和结束进行处理,并且提供对话管理;还对绝大多数系统范围和应用程序范围的设置进行处理。

QWidget类:所有用户界面对象的基类。QDialog类和QFrame类继承自QWidget类,这两个类有自己的子类系统(Sub-Class System)。

QFrame类:有框架的窗口控件的基类。它也被用来直接创建没有任何内容的简单框架,但是通常要用到QHBox或QVBox,因为它们可以自动布置放到框架中的窗口控件。

QMainWindow类:提供一个有菜单栏、锚接窗口(如工具栏)和状态栏的主应用程序窗口。

QDialog类:最普通的顶级窗口。如果一个窗口控件没有被嵌入到父窗口控件中,那么该窗口控件就被称为顶级窗口控件。在通常情况下,顶级窗口控件是有框架和标题栏的窗口。在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口

QWidget
是所有用户界面类的基类,它能接收所有的鼠标、键盘和其他系统窗口事件。没有被嵌入到父窗口中的Widget会被当作一个窗口来调用,当然,它也可以使用setWindowFlags(Qt.WindowFlags)函数来设置窗口的显示效果。
QWidget的构造函数可以接收两个参数,其中第一个参数是该窗口的父窗口;第二个参数是该窗口的Flag,也就是Qt.WindowFlags。根据父窗口来决定Widget是嵌入到父窗口中还是被当作一个独立的窗口来调用,根据Flag来设置Widget窗口的一些属性。
QMainWindow
(主窗口)一般是应用程序的框架,在主窗口中可以添加所需要的Widget,比如添加菜单栏、工具栏、状态栏等。
主窗口通常用于提供一个大的中央窗口控件(如文本编辑或者绘制画布)以及周围的菜单栏、工具栏和状态栏。
QMainWindow常常被继承,这使得封装中央控件、菜单栏,工具栏以及窗口状态变得更容易,也可以使用Qt Designer来创建主窗口。
QApplication
QApplication类用于管理图形用户界面应用程序的控制流和主要设置,可以说QApplication是PyQt的整个后台管理的命脉。任何一个使用PyQt开发的图形用户界面应用程序,都存在一个QApplication对象。
在PyQt的应用程序实例中包含了QApplication类的初始化,通常放在Python脚本的if name == "main": 语句后面,类似于放在C的main函数里,作为主程序的入口。因为QApplication对象做了很多初始化,所以它必须在创建窗口之前被创建。
ØQApplication类还可以处理命令行参数,在QApplication类初始化时,需要引入参数sys.argv。sys.argv是来自命令行的参数列表,Python脚本可以从shell运行,比如用鼠标双击qtSample.py,就启动了一个PyQt应用程序。引入sys.argv后就能让程序从命令行启动,比如在命令行中输入 python qtSample.py,也可以达到同样的效果。
QApplication采用事件循环机制,当QApplication初始化后,就进入应用程序的主循环(Main Loop),开始进行事件处理,主循环从窗口系统接收事件,并将这些事件分配到应用程序的控件中。当调用sys.exit()函数时,主循环就会结束。
PyQt 5的应用程序是事件驱动的,比如键盘事件、鼠标事件等。在没有任何事件的情况下,应用程序处于睡眠状态。主循环控制应用程序什么时候进入睡眠状态,什么时候被唤醒。

六:什么是布局管理

布局管理是GUI编程中的一个重要方面。布局管理是一种如何在应用窗口上放置组件的一种方法
我们可以通过两种基础方式来管理布局。我们可以使用绝对定位和布局类。

七:布局管理

八:水平布局

九:垂直布局

十:网格布局

十一:表单布局

十二:绝对定位

程序指定了组件的位置并且每个组件的大小用像素作为单位来丈量。当你使用了绝对定位,我们需要知道下面的几点限制:

如果我们改变了窗口大小,组件的位置和大小并不会发生改变。

在不同平台上,应用的外观可能不同

改变我们应用中的字体的话可能会把应用弄得一团糟。

如果我们决定改变我们的布局,我们必须完全重写我们的布局,这样非常乏味和浪费时间。

十三:目录

一、控件分类

  1、窗口类 2、布局控件 3、高级界面控件

二、基本控件

  1、标签控件   2、文本框类控件 3、按钮类控件

  4、下拉列表框   5、表格控件     6、时间控件

三、什么是信号和槽

四、内置信号和槽函数

五、内置信号和自定义槽函数

六、自定义信号和内置槽函数

七、自定义信号和槽函数

十四:窗口类

如果是主窗口,用QmainWindow类;

如果是对话框,就用Qdialog类;

如果不确定,或者可能是顶层窗口,也可能嵌入其他窗口,那就用Qwidget类。

QWidget、QMainWindow、QDialog和QFrame的区别,特别是QWidget和QFrame的区别

    PyQt中所有的类都继承于QObject类。QWidget直接继承于QPaintDevice类,QDialog、
QMainWindow、QFrame直接继承QWidget 类。QWidget类是所有用户界面对象的基类。
QDialog类是对话框窗口的基类。QFrame类是有框架的窗口部件的基类,比如:
QPushButton,QLabel… ---> QFrame ---> QWidget。

(一) QmainWindow:主窗口类
通常用于创建主窗口,它继承自Qwidget类,拥有它的所派生方法和属性。
(二) QWidget:控件类
它是所有用户界面对象的基类,所有的窗口和控件都直接或间接继承自QWidget类。
(三) Qdialog:对话框窗口类
QMessageBox : 消息弹出式对话框
QInputDialog : 输入对话框
继承关系:QMessageBox、QFileDialog、QFontDialog、QInputDialog --->Qdialog

十五:布局控件

(一)QBoxLayout :框布局
继承关系:QHBoxLayout、QVBoxLayout ---> QBoxLayout ---> QLayout ---> Qobject
1、QHBoxLayout :水平布局按照从左到右的顺序来添加控件
2、QVBoxLayout :垂直布局按照从上到下的顺序来添加控件
(二)QGridLayout :网格布局将窗口分隔成行和列的网格来进行排列。
(三)QFormLayout :表单布局
继承关系: QFormLayout ---> QLayout ---> QObject实现表单式的布局,由两列组成,第一列用于显示信息,给用户提示,一般叫label域;第二列需要用户进行选择或输入,一般叫field域。 。
(四)Qsplitter
可以动态地拖动子控件之间的边界来控制子控件的大小,是一个动态布局管理器
PyQt5中有4种布局方式:水平布局、垂直布局、网格布局、表单布局
PyQt5中有2种布局方法:addLayout()、addWidget()

 十六:高级界面控件

(一)表格与树:
QTableView
QTableView控件可以绑定一个模型数据用来更新控件上的内容
QListView
QListView类用于展示数据
QListWidget
是一个基于条目的接口,用于从列表中添加或删除条目。每一个条目对象都是QListWidgetItem对象
QTableWidget
是Qt程序中常用的显示数据表格的空间
QTreeView
QTreeView类实现树形结构,树形结构是通过QTreeWidgetQ和TreeWidgetItem类实现的,其中TreeWidgetItem类实现树形节点的添加
(二)容器:装载更多的控件
它是所用于解决一个窗口装载不下或装载太多控件而不美观的问题
QTabWidget:选项卡控件
提供一个选项卡和一个页面区域,默认显示第一个选项卡
QStackedWidget:堆栈窗口控件
是一个堆栈窗口控件,可以填充一些小控件,但同一时间只有一个小控件可以显示。
QStackedWidget使用QStackedLayout布局。
QDockWidget
是一个可以停靠在QMainWindow内的窗口控件,它可以保持浮动状态或者在指定位置作为子窗口附加到主窗口中
QScrollBar
提供水平或垂直的滚动条,这样可以扩大当前窗口的有效装载面积,从而装载更多的控件。

十七:基本控件

1、QLabel:标签类

可用于显示不可编辑的文本和图片,也可以放置一个GIF动画,还可以用于提示标记为其他控件。纯文本、链接、富文本可显示的标签上

2、文本框类控件:QLineEdit、QTextEdit

① QLineEdit : 单行文本框控件

•用于输入单行字符串。

② QTextEdit : 多行文本框控件

•可以显示多行文本内容,当文本内容超出控件显示范围时,可以显示水平个垂直滚动条。还可显示HTML文档

3、按钮类控件 : QAbstractButton、QPushButton、QRadioButton、QCheckBox

① QAbstractButton : 按钮基类

是按钮的基类,QPushButton、QRadioButton、QCheckBox均继承于 QAbstractButton,它是抽象类,不能实例化。

②QPushButton : 命令按钮

是长方形,通过单击该按钮或用快捷键来执行一些命令,该命令通常通过文本来描述执行的动作。

③ QRadioButton : 单选按钮、

提供一组可供选择的按钮和文本标签,用户可选择其中一选项,标签用于显示对应的文本信息。它是一种形状按钮,可以切换为on或off,即checked和unchecked。toggled信号是在切换单选钮状态时发射的,而clicked信号则在每次点击时都会发射,所以toggled信号更适合用于状态监控,绑定这个信号,在按钮状态改变时,触发相应行为。

④ QCheckBox : 复选框按钮

提供了一组带文本标签的复选框,用户怕树叶子打破头选择多个选项。它被选中或取消选中,都会发射一个stateChaged信号,如果想在它状态改变时触发相应的行为,请连接这个信号。

十八:标签控件

定义:用来显示不可编辑的文字或图片,或GIF动画。也可用作其他控件的占位符。纯文本、超链接或富文本都可以显示在这个Label上。

十九:文本框控件

QLineEdit : 单行文本框控件

最常使用的输入框,可供输入一行文字。输入多行文字时需要使用QTextEdit

二十:按钮类控件

按钮QPushButton

显示一个按钮,当点击时可以通过编程来调用一个确定的函数。

单选框QRadioButton

显示一个带有文字标签的可选按钮,可在表单中选择某一个选项,是单选按钮。该类派生自QAbstractButton。
单选按钮默认是排他的,即一次只能选择一个选项。可以把Radio Button放入QGroupBox或QButtonGroup中以创建更多可选的选项。

复选框QCheckBox

文字标签之前的矩形框,是多选按钮。

多选按钮默认是不排他的,如果想要手动排他,需要将这些复选框放入QButtonGroup中。

二十一:下拉框控件

QComboBox是一个集按钮和下拉选项于一体的控件 

二十二:表格控件

QTableWidget是pyqt的一个表格类,每个一个格子是一个Item值。我们可以用循环将读取的表格写入QTableWidget中

二十三:时间控件

QCoQCalendarWidget类提供了一个基日历小部件,允许用户选择一个日期 

二十四:什么是信号和槽

信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要地方。

通过该机制可以很好的将组件的信号(如button的clocked、toggled、pressed等)和处理该信号的槽关联起来。

信号和槽是用来在对象间传递数据的方法:当一个特定事件发生的时候,signal会被emit出来,slot调用是用来响应相应的signal的。Qt中对象已经包含了许多预定义的 signal(基本组件都有各自特有的预定义的信号),根据使用的场景我们可以添加新的signal。Qt的对象中已经包含了许多预定义的槽函数,但我们也根据使用的场景添加新的槽函数。

信号

当对象的状态发生改变的时候,信号就由该对象发射 (emit) 出去。当一个信号被发射(emit)时候,与其关联的槽函数被立刻执行。其中该对象只负责发送信号,发射该信号的对象并不知道是那个对象在接收这个信号。这样保证了对象与对象之间的低耦合。 如果存在信号和多个槽函数相关联的时候,当信号被发射时,这些槽的执行顺序将会是随机的、不确定的

用于接受信号,而且槽只是普通的对象成员函数。当和槽连接的信号被发射时,槽会被调用。一个槽并不知道是否有任何信号与自己相连接。

信号和槽的绑定

通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用

当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接

二十五:内置信号和槽

内置信号与槽的使用,是指在发射信号时,使用窗口控件的函数,而不是自定义的函数,这种也是我们前面用的最多的

二十六:内置信号和自定义槽函数

内置信号与自定义槽函数的使用,是指在发射信号时,使用自定义的函数。 

二十七:自定义信号和内置槽函数

PyQt5已经自动定义了很多QT内建的信号。但是在实际的使用中为了灵活使用信号与槽机制,我们可以根据需要自定义信号。可以使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。

二十八:自定义信号和槽函数

PyQt5已经自动定义了很多QT内建的信号。但是在实际的使用中为了灵活使用信号与槽机制,我们可以根据需要自定义信号。可以使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。                    

猜你喜欢

转载自blog.csdn.net/m0_56051805/article/details/127301999