pyqt5 python Gui入门教程

更新时间:2024-05-29 15:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

pyqt5&python Gui入门教程(1) 第一个窗口(1)

第一个窗口和代码详细注释:

from PyQt5 import QtWidgets #从PyQt库导入QtWidget通用窗口类 class mywindow(QtWidgets.QWidget):

#自己建一个mywindows类,以class开头,mywindows是自己的类名, #(QtWidgets.QWidget)是继承QtWidgets.QWidget类方法, # 定义类或函数不要忘记':'符号,判断语句也必须以':'结尾! def __init__(self):

#def是定义函数(类方法)了,同样第二个__init__是函数名

# (self)是pyqt类方法必须要有的,代表自己,相当于java,c++中的this #其实__init__是析构函数,也就是类被创建后就会预先加载的项目 super(mywindow,self).__init__()

#这里我们要重载一下mywindows同时也包含了QtWidgets.QWidget的预加载项

import sys

app = QtWidgets.QApplication(sys.argv) #pyqt窗口必须在QApplication方法中使用,

#要不然会报错 QWidget: Must construct a QApplication before a QWidget windows = mywindow()

# 生成过一个实例(对象), windows是实例(对象)的名字,可以随便起! # mywindows()是我们上面自定义的类 windows.show()

#有了实例,就得让他显示这里的show()是QWidget的方法,用来显示窗口的! sys.exit(app.exec_()) #启动事件循环

pyqt5&python Gui入门教程(2) 第一个窗口(2)

上图是第一篇教程,下面的显示效果都一样,我们来看看有什么不同

1、类的名字、实例的名字都换了,

2、多了一个if __name__ == \以及下面的代码缩进了,层次改变了

1、我们把结尾的5句代码,单独建立了一个函数 2、然后直接调用函数

3、注意两个def的缩进,第一个def缩进了代表是在class里面,第二个和class平齐,则是在外面。

可以看到显示效果是一样,我们却有很多办法去实现。

知识点:

1、if __name__ == \是代表如果这个文件是主程序这运行下面的代码,如果是被别的程序文件调用的话,则运行下面的代码。

2、__init__ 方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的 初始化 。注意,这个名称的开始和结尾都是双下划线。

3、生成实例(对象)必须以类名(),别忘记了()

4、类中的函数(方法)必须有self,是代表属于这个实例(对象)本身持有的,而外部定义的函数则不需要。

整个流程;

先导入PyQt5中的QtWidgets通用窗口库,通过继承QtWidgets.QWidget来定义自己的窗口。然后生成一个对象(实例化),再调用QWidget的show()方法来显示这个窗口。

pyqt5&python Gui入门教程(3) 第一个窗口(3)

frist.py 文件

second.py文件

这是两个文件,第一个文件和之前一样我们只录入的上半截,第二个文件我们保留了下半截,

也就是将一个文件分成两个文件,从second.py文件调用frist.py来显示窗口的目的。

注意second.py 文件加入了一句from frist import fristwindows 即导入first.py的fristwindows类

是不是很熟悉,将自己的文件作为库导入进来,然后调用即可!

虽然都是显示窗口,我们这里已经学习了很多办法来显示它。代码区别也是很大,关键是灵活运用。 知识点:

1、库,这个例子是将我们自己的文件作为库导入,也可以称为自定义库。 注意不用.py结尾,pyqt会自动识别。

2、frist.py的firstwindows的代码就是显示一个窗口用的,但是没有将它实例化,并在QApplication中运行。

所以运行frist.py是不会显示任何窗口的。

我们将显示firstwindows的方法写在了第二个文件中,达到逻辑与界面分离的效果。

3、QApplication相当于main函数,也就是整个程序(有很多文件)的主入口函数。

对于一个Gui程序必须至少有一个这样的一个实例来让程序运行。 4、最后一句是调用sys库的exit退出方法,退出条件(参数)是app.exec_()也就是整个窗口关闭。

其实入门没什么难度,只是对一些基本概念的掌握和了解,本人也是菜鸟,写的不是很好,只是希望能和更多有兴趣爱好的新手一起交流学习。

PyQt5&python Gui入门教程(4) 初探Qt Designer 设计师

网上很多教程都是代码,对于新手看起来就很头疼,pyqt同样为我们提供了Qt designer来设计窗口界面,

用起来也非常方便,对于新手我们应该善用它,虽然做出来的界面不那么华丽,但至少可以做出个像样的窗口来。

打开PyQt5的Qt Designer,会自动弹出新建窗体对话框,

对于我们最常用的就是Widget通用窗口类,还有个MainWindows顾名思义主窗口。

PyQt5的Widget被分离出来,似乎用来替代Dialog,并将Widget放入了QtWidget模块(库)中,PyQt4是QtGUI。

这是一个Widget和MainWindows,从界面上看起来没有什么,只是MainWindows默认添加了菜单栏、工具栏和状态栏等。

默认左边是控件栏,提供了很多空间类,我们可以直接拖放到widget中看到效果,点窗体--预览(Ctrl+R)

每个空间都有自己的名称,提供不同的功能,比如常用的按钮、输入框、单选、文本框等等,

右边是对窗口及控件的各种调整、设置、添加资源(列如:图片)、动作。 还可以直接编辑Qt引以为豪的信号槽(signal和slot)。

有了Qt Designer使得我们在程序设计中更快的能开发设计出程序界面,避免了用纯代码来写一个窗口的繁琐,

同时PyQt支持界面与逻辑分离,这对于新手来说无疑是个最大的福音,当然要做出华丽的界面还是要学代码的。

至少Qt Designer为我们提供了一些解决方法,另外我们也可以通过Qt Designer生成的代码来学习一些窗口控件的用法。

PyQt5&python Gui入门教程(5)Qt Designer窗口布局Layouts(1)

Qt Designer窗口布局Layouts提供了四种布局方法,他们是: Vertical Layout 纵向布局 Horizontal Layout 横向布局 Grid Layout 栅格布局 Form Layout 在窗体布局中布局

前三种是我们经常会用到的,我们将布局Layouts拖动到窗体上会有红色框来显示,

Layout的一些属性可以通过属性编辑器来控制,一般包括: 上下左右边距间隔,空间之间间隔等。

在我们使用布局之前,我们得对层次要有个了解,在程序设计中一般用父子关系来表示。

当然有过平面设计经验的童鞋对分层应该有所了解,这里我们还需要将层分成层次。

其实就像python中规定的代码缩进量代表不同层次的道理差不多。

从对象查看器中我们可以方便的看出窗体(Form)--布局(Layout)--控件(这里是PushButton按钮)之间的层次关系。

Form窗口一般作为顶层显示,然后使用Layout将控件按照我们想要的方式规划开来。

这里要注意一下,Qt Designer设计出来的文件默认为ui文件,里面包含的类css布局设计语言,

如果想要查看代码我们还需要将它转换(编译)成py文件,我们可以使用一条DOS命令来完成

D:\\Python33\\Lib\\site-packages\\PyQt5\\pyuic5.bat mian.ui -o frist.py 更实用的转换命令可以将当前文件夹下所有ui转换成py文件:

for /f \

D:\\Python33\\Lib\\site-packages\\PyQt5\\pyuic5.bat %%i -o %%i.py PyQt支持用LoadUi方法直接加载ui文件,当然我们通过转换后可以方便学习PyQt窗体控件的源代码。

下一篇我们来分析一下Qt Designer布局的源代码

PyQt5&python Gui入门教程(6)Qt Designer窗口布局Layouts(2)

首先我们来看一下,我们创建一个空白Widget窗体,Qt Designer都为我们做了些什么?

嗯,比我们第一个窗体,多了那么几行代码,默认转换后的py文件还不能直接显示出效果,下面我们慢慢学习。

这里我们只加入一个栅格布局,然后......Qt Designer居然给我们多了6行代码

其实Qt Designer生成的代码(编译后)还是非常给力的,至少比我们自己写的规范多了。

这些代码或许不需要我们自己写,但至少我们能看得明白。 其中最主要的两句代码是:

self.gridLayoutWidget = QtWidgets.QWidget(Form)

self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)

从Qt Designer中可以看到栅格布局默认创建了两个对象,QtWidgets.QWidget和QtWidgets.QGridLayout。

注意(Form)和(self.gridLayoutWidget)参数,这里可以理解为放置到相应的对象里面。

Qt Designer果然做的比我们想想的多,下面我们再通过简化后的代码来对比一下,可能跟容易理解一些。

注意:Qt Designer首先会见栅格布局作为一个widget放入窗体,并且不影响窗体大小。

栅格布局一般作为顶层布局使用,所以简化后的代码有个self.setLayout(self.gridLayout)

同时Qt Designer会加入一些基本设置,默认信号槽声明,国际化语言支持等等,确实比我们自己写的要好的多。 当然我们需要了解其中的奥秘。

左边是Qt Designer设计效果,右边是显示效果。

再来个稍微复杂点的 知识点:

记得在Qt Designer中窗体的layout层次可以通过对象查看器来查看,layout的一些设置可以通过属性编辑器来修该。

通常我们使用栅格布局作为顶层布局,将控件放置好之后可以通过右键--布局--栅格布局,将布局充满整个窗体。

我们可以先放入控件,然后ctrl选中多个控件,然后点击工具栏上快速布局工具进行布局。

在mianwindows中默认会有个centralwidget布局也是继承自QtWidgets.QWidget,表示窗口的中央部分。 在接下来的教程你会看到mianwindows的使用技巧。

PyQt5&python Gui入门教程(7)Qt Designer控件的一些通用属性

在Qt Designer中的右边为我们提供了窗体、控件、布局的属性编辑功能。 比较常用的有:

objectName 控件对象名称 例:anniu = QtWidgets.QPushButton() 等号前面的那个名字

geometry 相对坐标系

sizePolicy 控件大小策略 minimumSize最小宽度、高度

maximumSize最大宽度、高度 如果想让窗体或控件固定大小,可以将mini和max这两个属性设置成一样的数值 font 字体 cursor 光标

windowTitle 窗体标题

windowsIcon / icon 窗体图标/控件图标 iconSize 图标大小 toolTip 提示信息 statusTip 任务栏提示信息 text 控件文字 shortcut 快捷键

PyQt5&python Gui入门教程(8)Qt Designer界面与逻辑分离

这是上一篇文章中用Qt Designer设计编译后生成的代码,但是想要让它显示出来,还是得费点功夫,

对于新手来说经常会碰壁,我也是折腾了好长时间才明白,原来还要做一下一些事情。

这是显示效果。

如果我们在单个文件当中显示,还需要在结尾加入以上代码。 因为Qt Designer默认继承的object类,不提供show()显示方法,

所以我们生成一个QWidget对象来重载我们设计的Ui_Form类,达到显示效果。

在实际工作中,我们希望界面和代码分离,而防止破坏Qt Designer编译生成的代码,

我们可以这样做:

按钮销毁连接到按钮_2关闭

self.pushButton.released.connect(Form.update) 按钮重载连接到窗口更新

那么我们怎么能执行自己的“槽”呢?

通过之前学习的方法,我们继承了Ui_Form,然后将按钮1和按钮2都连接到prn函数上,测试OK。

对于初学者想要简单使用信号槽的机制,其实并不难,当然其中也有不少坑,还是多多测试为妙! 知识点:

在PyQt中接受者和发送者必须是个对象(实例)!

PyQt中的控件中提供了很多信号和槽方法,大家可以多多使用Qt Designer 设计参考!

槽其实就个函数(方法),Qt5中的槽函数不在限定必须是slot,可以是普通的函数、类的普通成员函数、lambda函数等。编译期间就会检查信号与槽是否存在!

信号的connect连接最好放在__init__析构函数里面,这样只会声明一次连接,如果在类方法(函数中)使用的话,要记得disconnect,否则connect会连接多次,导致程序异常。

信号槽函数不用加 (),否则可能会导致连接异常。

PyQt5&python Gui入门教程(10)Qt Designer 义信号emit及传参

自定上面的代码简单的自定义了一个信号,并连接到自定义的槽函数中。 其实看起来也不是很难的样子。

注意:声明信号必须在类属性中定义,也就是所有方法之前。 使用emit可以发射信号,然后通过connect将信号与槽函数连接。 下面我们来学习一下信号与槽之间的参数传递:

注意:当信号与槽函数的参数数量相同时,它们参数类型要完全一致。信号与槽不能有缺省参数。

当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略。此外,在不进行参数传递时,信号槽绑定时也是要求信号的参数数量大于等于槽函数的参数数量。这种情况一般是一个带参数的信号去绑定一个无参数的槽函数。

当然可以出传递的参数类型有很多种:str、int、list、object、float、tuple、dict等等

至于信号槽使用注意事项可以百度一下

PyQt5&python Gui入门教程(11)通用对话框QMessageBox

PyQt5中为我们提供了很多默认信息框QMessageBox,注意为方便使用需要导入模块。

QMessageBox对话框包含类型只是图标不同其他无太大差别: QMessageBox.information 信息框 QMessageBox.question 问答框 QMessageBox.warning 警告 QMessageBox.ctitical危险 QMessageBox.about 关于

基本参数:(指定父组件,“标题”,“信息内容”,要显示的按钮,默认按钮) Standard Buttons 默认要显示的按钮,多个按钮使用 | 隔开。其中包含,可以任意组合:

StandardButtons(QMessageBox.Abort |QMessageBox.Apply | QMessageBox.Cancel |

QMessageBox.Close | QMessageBox.Discard |QMessageBox.Help | QMessageBox.Ignore | QMessageBox.No | QMessageBox.NoToAll | QMessageBox.Ok |QMessageBox.Open | QMessageBox.Reset | QMessageBox.RestoreDefaults | QMessageBox.Retry |QMessageBox.Save |

QMessageBox.SaveAll | QMessageBox.Yes | QMessageBox.YesToAll)

result 为返回值 默认为数值 我们可以通过上面的方法来判断用户点击了那个按钮!

之后来一张向导图,来自eric。

PyQt5&python Gui入门教程(12)标准输入框QInputDialog

标准输入文字框QInputDialog.getText() 需要QInputDialog和QLineEdit模块, 默认返回输入框文字和按钮bool值

标准整数输入框QInputDialog.getInt() 默认返回输入框文字和按钮bool值

其中0, -2147483647, 2147483647, 1 为默认数值,数值范围,和步长(即按上下按钮时数值增加或减少多少)

标准浮点数输入框QInputDialog.getDouble() 默认返回输入框文字和按钮bool值

其中0, -2147483647, 2147483647, 10 为默认数值,数值范围,最后10代表小数位数。

列表输入选择框QInputDialog.getItem() 默认返回输入框文字和按钮bool值

本文来源:https://www.bwwdw.com/article/aiy6.html

Top