在这部分教程中我们将学习PyQt5的一些基本功能

一个简单的例子

这是一个只显示一个小窗口的简单示例。但我们可以对这个窗口进行一些操作,如调整尺寸,最大化或最小化。这需要编写很多代码,但有人已经完成了这个功能。因为它在多种程序中的通用性,所以不再需要重复编码。PyQt5是一个高级工具集。如果我们使用较低级的工具集进行编码,要实现这个功能最少也要上百行代码。

import sys
from PyQt5 import QtWidgetsapp = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
widget.resize(250,150)
widget.setWindowTitle('simple')
widget.show()
sys.exit(app.exec_())

上面的代码会在屏幕上显示一个小窗体。

import sys
from PyQt5.QtWidgets import QApplication, QWidget

在这里我们导入了必要的模块。这些基本控件位于PyQt5.QtWidgets模块中。

app = QApplication(sys.argv)

每个PyQt5应用程序都需要创建一个application对象。sys.argv是从命令行传入的参数列表。Python脚本可以从shell中运行。这是一种控制脚本启动的方式。

widget = QtWidgets.QWidget()

控件QWidget是QtPy5中所有UI对象的基类。我们调用了QWidget的默认构造器。默认构造器没有parent参数。没有parent的控件称为窗体(window)。

widget.resize(250, 150)

resize()方法用于设置控件的尺寸。它宽250px高150px。

widget.move(300, 300)

move()方法将控件移动到坐标为x=300, y=300的位置

widget.setWindowTitle('Simple')

这里设置了窗体的标题。标题在标题栏中显示。

widget.show()

show()方法将控件显示在屏幕上。控件要先在内存中创建,然后在屏幕上显示。

sys.exit(app.exec_())

最后我们进入了application的主循环。事件处理从这里开始。主循环从窗体系统中接收事件,并将事件分发给控件。在调用exit()方法或主控件销毁时主循环会停止。sys.exit()方法确保可以干净地退出。系统可以感知到程序是如何退出的。

注意exec_()方法的下划线。由于exec是python中的关键字,所以使用exec_()。

图标

程序的图标是显示在标题栏左上角的一个小图像。接下来我们将介绍如何用PyQt5实现,这会用到一些新的API。

import sys
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgetsclass Icon(QtWidgets.QWidget):def __init__(self, parent=None):QtWidgets.QWidget.__init__(self, parent)self.setGeometry(300, 300, 250, 150)self.setWindowTitle("Icon")self.setWindowIcon(QIcon("D:/PythonWorkspace/PyQt5/icon.png"))if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)icon = Icon()icon.show()sys.exit(app.exec_())

之前的示例采用了过程式编码风格。Python语言支持过程式与面向对象的编程风格。PyQt5采用了面向对象编程。

class Example(QWidget):def __init__(self):super().__init__()...

在面向对象编程中有三个要素:类,数据与方法。我们创建了一个Example类,它继承自QWidget。这就意味着我们要调用两个构造器:首先是Example类的,然后是被继承的类的。super()方法返回了Example的父对象,并且我们调用了它的构造器。init()方法是Python语言中的构造器。

self.initUI()

GUI的创建交给了initUI()方法。

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle("Icon")
self.setWindowIcon(QIcon("D:/PythonWorkspace/PyQt5/icon.png"))

这三个方法继承自QWidget类。setGeometry()设置了控件的位置与尺寸。前两个参数是窗体的x,y坐标,第三个与第四个参数设置了窗体的宽度与高度。实际上它合并了resize()与move()方法。最后一个方法设置了应用的图标。我们需要创建一个QIcon对象,QIcon接受要显示的图标的路径作为参数。

if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

在这里创建了application与example对象,并且启动了主循环。

tooltip(提示框)的显示

我们可以为所有控件添加消息提示框。

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication)
from PyQt5.QtGui import QFontclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):QToolTip.setFont("SansSerif", 10)self.setToolTip("This is a <b>QWidget</b> widget")btn = QPushButton("Button", self)btn.setToolTip("This is a <b>QPushButon</b> widget")btn.resize(btn.sizeHint())btn.move(50, 50)self.setGeometry(300, 300, 300, 200)self.setWindowTitle("Tooltips")self.show()if __name__ == "__main__":app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

在这个例子中我们为两个PyQt5控件添加了提示消息。

QToolTip.setFont(QFont('SansSerif', 10))

这个静态方法为tooltip设置了10px的Sanserif字体。

self.setToolTip('This is a <b>QWidget</b> widget')

我们调用setToolTip()方法为控件创建提示消息。消息可以使用富文本格式。

btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')

这里我们创建了一个PushButton并为它设置了一个富文本提示消息。

btn.resize(btn.sizeHint())
btn.move(50, 50)

这里设置了button的尺寸,并将其在窗体上移动。sizeHint()方法为控件返回一个推荐的尺寸。

窗体的关闭

关闭窗体最明显的方法是点击标题栏上的x符号。在下面的例子中,我会展示如何通过编程来关闭窗体。这里我们要涉及到简单的signal和slot(信号槽)。

QPushButton(string text, QWidget parent = None)

这是之前用到的QPushButton控件的构造器。其中text参数是将要在按钮上显示的文本,parent表示按钮的父控件,在这个例子中就是QWidget。一个程序的所有控件构成了一个控件树。在这个树上大部分控件都有父控件。没有父控件的控件是顶层窗体。

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):qbtn = QPushButton("Quit", self)qbtn.clicked.connect(QCoreApplication.instance().quit)qbtn.resize(qbtn.sizeHint())qbtn.move(50, 50)self.setGeometry(300, 300, 250, 150)self.setWindowTitle("Quit button")self.show()if __name__ == "__main__":app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

在这个示例中我们创建了一个退出按钮。程序会在点击了这个按钮时退出。

from PyQt5.QtCore import QCoreApplication

这里我们我用到QtCore模块中的一个对象。

qbtn = QPushButton('Quit', self)

我们创建了一个PushButton, 它是QPushButton类的实例。构造器的第一个参数是按钮的标签,第二个参数是它的父控件,也就是Example, 由于继承关系Example也是QWidget。

qbtn.clicked.connect(QCoreApplication.instance().quit)

PyQt5中的事件处理系统采用signal&slot(信号槽)机制。当我们点击按钮时会发出clicked信号。slot可以是Qt slot或任何Python的callable对象。QCoreApplication包含了主事件循环;它可以处理并分发事件。instance()方法返回它的当前实例。QCoreApplication是由QApplication创建的。clicked信号连接到可以退出程序的quit()方法。这个过程由两个对象完成:发送者与接收者。发送者是PushButton,接收者是QApplication对象。

MessageBox(对话框)

当我们点击标题栏上的x按钮时默认会关闭QWidget。但有时我们想改变这种默认行为。例如,如果我们在编辑器中打开了一个文件,并且对这个文件做了修改。在关闭前我们希望显示一个对话框让用户进行确认。

import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setGeometry(300, 300, 250, 150)self.setWindowTitle("MEssage box")self.show()def closeEvent(self, event):reply = QMessageBox.question(self, "Message", "Are you sure to quit?", QMessageBox.Yes |QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:event.accept()else:event.ignore()if __name__ == "__main__":app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

在关闭QWidget时会生成QCloseEvent。我们需要重新实现closeEvent()这个事件处理器来改变控件的行为。

reply = QMessageBox.question(self, 'Message',"Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

我们要显示带有两个按钮(Yes和No)的消息对话框。第一个字符串会显示在标题栏,第二个字符串是对话框的消息文本。第三个参数设置了显示在对话框中的按钮。最后那个参数指定了默认的按钮,也就是默认取得键盘焦点的按钮。返回结果保存在reply变量中。

if reply == QtGui.QMessageBox.Yes:event.accept()
else:event.ignore()

我们在这里对返回值进行匹配。当点击了Yes按钮时,我们会接受该事件,从而关闭该控件并退出程序;否则就忽略这个关闭事件。

窗体居中

下面的脚本会将窗体置于桌面中心。

import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(250, 150)self.center()self.setWindowTitle('Center')self.show()def center(self):qr = self.frameGeometry()cp = QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)self.move(qr.topLeft())if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

QtGui.QDesktopWidget提供了关于用户桌面的信息,包括屏幕尺寸。

self.center()

center()方法中包含了窗体居中的代码。

qr = self.frameGeometry()

得到一个指定了主窗体形状的矩形。

cp = QDesktopWidget().availableGeometry().center()

指出显示器的屏幕分辨率并根据分辨率找出屏幕的中心点。

qr.moveCenter(cp)

将矩形移动到屏幕中心,尺寸不变。

self.move(qr.toLeft())

将窗体的左上角移动到矩形qr的左上角,窗体与矩形重合,从而将窗体置于屏幕中心。


在这部分教程中我们学到了一些PyQt5基础

PyQt5教程(一)相关推荐

  1. pyqt5教程6:信号和事件

    PyQt5 中的事件和信号 在 PyQt5 编程教程的这一部分中,我们探讨了应用程序中发生的事件和信号.这部分比较抽象,也最难记忆. 一.PyQt5的事件 GUI 应用程序是事件驱动的.事件主要由应用 ...

  2. pyqt5教程12:拖放功能

    在 PyQt5 教程的这一部分中,我们将讨论拖放操作. 在计算机图形用户界面中,拖放是单击虚拟对象并将其拖动到不同位置或另一个虚拟对象上的动作(或支持动作).一般来说,它可以用来调用多种动作,或者在两 ...

  3. pyqt5教程9:Widgets组件

    PyQt5 widgets 小部件是应用程序的基本构建块. PyQt5 有各种各样的小部件,包括按钮.复选框.滑块或列表框.在本教程的这一部分,我们将描述几个有用的小部件:QCheckBox.切换模式 ...

  4. python PyQt5教程

    引用文章1:python PyQt5 教程 参考文章2:PyQt5 python官方教程 Qt for Python pyqt5-基础 PyQt5是一套来自Digia的Qt5应用框架和Python的粘 ...

  5. PyQt5 教程 《日期和时间》

    导读 目录 导读 PyQt5的日期和时间 QDate,QTime,QDateTime 当前日期和时间 UTC时间 天数 天数的差异 日期时间算术 夏令时 Unix时代 Julian day 历史战役 ...

  6. PyQt5教程(八)——实现QQ登录界面(二、加载资源文件)

                                         实现QQ登录界面--加载资源文件 一.创建资源文件: 上篇文章创建了QQ登录界面,本篇介绍创建并加载资源文件. 1.创建资源文 ...

  7. PyQt5教程(一)——Python的安装

                                      Python3的安装 因为PyQt5的要求,Python需要安装python3,本文以Python3.5为例. 1.打开python ...

  8. PyQt5教程(五)——Eric6的配置(最详细)

                                                             Eric6的配置 Eric的安装和PyQt5的安装,大家可以翻阅之前的文章: PyQt ...

  9. PyQt5教程-04-关闭窗口

    最简单的关闭一个窗口的方法是点击标题栏上的 x 标志.但是,在下面的例子中,我们将展示如何通过编程来控制关闭窗口.我们将使用PyQt5的信号/槽. 以下是我们在例子中使用到的 QPushButton ...

  10. PyQt5教程(三)——Eric6的安装(详细)

                                               Eric6的安装 经过前两篇的介绍(Python和PyQt5的安装),本偏开始介绍Eric6的安装: PyQt5教 ...

最新文章

  1. linux复制和剪切命令,Linux命令 复制粘贴剪切
  2. Android开发中目前流行控件和知识点总结
  3. “编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力!
  4. hcl启动设备失败_英林储罐清洗设备清洗公司2021收费
  5. MySQL笔记-group by和聚合函数的使用
  6. App Store最新审核指南(2015年3月更新版)
  7. 题目1120:全排列(回溯法)
  8. 【Matlab身份证识别】BP神经网络身份证号码识别【含源码 1344期】
  9. duet连win10_duetdisplay这个软件在win10上用不了?安装vs2015的时候想取消安装没有点取消...
  10. 史上最全论文下载方法
  11. linux usb摄像头UVC usb3300 stm32F4
  12. Android简易项目--傻瓜式阿拉伯语输入法(Dummy Arabic Input)
  13. java中国象棋棋子走法,中国象棋的规则及各种棋子的走法介绍
  14. 隔段时间网络就会变差,重启路由器恢复,这是为什么
  15. java编写个人所得税_个人所得税JAVA算法
  16. Assuming drive cache: write through,可能不是错误信息,只是提示信息
  17. html中js计算百钱百鸡,JS经典案例之百钱百鸡
  18. 《通过UE4/UE5的ProceduralMesh组件创建网格》
  19. 信号生成和可视化——周期性/非周期性波形
  20. 再度升级:深入分析针对金融科技公司的Evilnum恶意软件及组件

热门文章

  1. Studio 3T重置日期,达到重复试用的效果
  2. C语言写的简单病毒程序
  3. ValueError: Unknown activation function: ReLU
  4. 正则表达式验证系统登录密码必须由字母数字和特殊符号组成
  5. php的原子操作,原子操作 · 国外PHP框架Nette官网教程 · 看云
  6. 前后端分离开发下的权限管控 :SpringSecurity 框架
  7. C++虚函数实现机制
  8. Windows环境黑客入侵应急与排查
  9. 关于Mongodb的全面总结
  10. bat表白脚本(变色桃心+vbs问答)