PyQt5 是Digia的一套Qt5应用框架与python的结合,是最强大的GUI库之一
PyQt5是一个包,包内有PyQt5.QWidgets,PyQt5.QtCore等模块
pyqt5的安装
pip install PyQt5
.py文件生成exe文件请看>>Python-pyinstaller
窗口类,只用于生成页面容纳其他窗口和控件,自身不具有任何功能的QWidget类窗口,单独使用没有任何意义,通常是APP的最外层框架
继承关系:
- QWidget
- QDeskWidget
- QTabWidget
- QMainWindow
- QDialog
在PyQt5中,窗口都是以矩形形式呈现,几何数据称为geometry,数据类型QRect类,数据形式(x, y, width, height)
。其中x
, y
为窗口左上角相对上级窗口或屏幕左上角的坐标,x
向右为正,y
向下为正
width
为窗口宽度,height
为窗口高度
窗口坐标是窗口左上角在屏幕或者上级窗口的坐标,称为move,数据类型QPoint类,数据形式(x, y)
窗口尺寸是窗口的宽和高,称为size,数据类型QSize类,数据形式(width, height)
QWidget类及其子类 | 说明 |
---|---|
self.setGeometry(x, y ,width, height) |
设定几何数据,输入QRect类 |
self.move(x, y) |
设定左上角坐标,输入QPoint类 |
self.resize(width, height) |
设定窗口尺寸,输入QSize类 |
self.setFixedSize(width, height) |
固定窗口尺寸,输入QSize类 |
self.setFixedWidth(width) |
固定窗口宽度,输入数字 |
self.setFixedHeight(height) |
固定窗口高度,输入数字 |
=self.geometry() |
获取几何数据,返回QRect类 |
=self.pos() |
获取坐标数据,返回QPoint类 |
=self.size() |
获取尺寸数据,返回QSize类 |
=self.x() |
获取x轴坐标数据,返回数字 |
=self.y() |
获取y轴坐标数据,返回数字 |
=self.width() |
获取宽度数据,返回数字 |
=self.height() |
获取宽度数据,返回数字 |
QRect类 | 说明 |
---|---|
self=QRect(x, y, width, height) |
创建QRect类 |
=self.pos() |
获取坐标数据,返回QPoint类 |
=self.size() |
获取尺寸数据,返回QSize类 |
=self.x() |
获取x轴坐标数据,返回数字 |
=self.y() |
获取y轴坐标数据,返回数字 |
=self.width() |
获取宽度数据,返回数字 |
=self.height() |
获取宽度数据,返回数字 |
QPoint类 | 说明 |
---|---|
self=QPoint(x, y) |
创建QPoint类 |
=self.x() |
获取x轴坐标数据,返回数字 |
=self.y() |
获取y轴坐标数据,返回数字 |
QSize类 | 说明 |
---|---|
self=QSize(width, height) |
创建QSize类 |
=self.width() |
获取宽度数据,返回数字 |
=self.height() |
获取宽度数据,返回数字 |
QWidget是PyQt5的核心,QWidget加任意控件就可以形成最简单的APP
QWidget类 | 说明 |
---|---|
self=QWidget(parent) |
创建实例和标题栏parent ->父控件,可省略 |
x , y , width , height , ... |
几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) |
设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) |
设置图标icon ->QIcon类 |
self.setLayout(layout) |
载入布局,只能使用一次layout ->布局类 |
self.setToolTip(text) |
光标悬浮显示文字 |
self.show() |
以非模式显示窗口 |
self.close() |
关闭窗口 |
QIcon类 | 说明 |
---|---|
self=QIcon(file) |
创建图标 |
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('第一个APP')
btn = QPushButton(self, '开始') # self下新建Button实例,由于没有布局,此处self不能省略
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
说明
if __name__ == '__main__':
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import
到其他的python脚本中被调用(模块重用)执行
if __name__ == ‘__main__’:
的作用相当于C语言中的main()
函数,在 if __name__ == ‘__main__’:
下的代码只有文件作为脚本直接运行时才会被执行,而import
到其他脚本中是不会被执行的。也就是说项目必须从if __name__ == ‘__main__’:
的文件运行,这个文件可以调用其他文件,其他文件不能调用这个文件
不同的是,C语言中 main()
函数是必须的,Python中 if __name__ == ‘__main__’:
是非必须的
import sys
# code
if __name__ == '__main__':
app = QApplication(sys.argv)
# code
sys.exit(app.exec_())
在主程序运行后,首先创建实例 app = QAppliaction
,创建时需要使用sys.argv
参数
sys.argv
这个参数来自Python自带的sys
库,作用是在app运行时将键盘、鼠标等外部数据传递给app,相当于全自动运行的input()
app.exec_()
的作用是进入程序的主循环直到exit()
被调用,并在退出时返回状态代码。相当于C语言中的主程序while(1)
。不使用 app.exec_()
会导致程序闪退,因为app只有初始化没有主循环
sys.exit()
的作用是关闭窗口后退出进程
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
实例化MyWindow时,自动执行__init__
方法,__init__
方法负责继承父类初始化和调用自己写的initUI
方法完成窗口创建
QDeskWidget是将电脑屏幕虚拟为一个窗口,方便使用QWidget类的方法读取屏幕数据,方便布局
QDeskWidget类 | 说明 |
---|---|
self=QDeskWidget() |
创建实例 |
x , y , width , height |
几何类方法,详见窗口的几何数据,只能读取 |
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setFixedSize(300, 300)
x = (QDesktopWidget().width() - self.width())/2
y = (QDesktopWidget().height() - self.height())/2
self.move(int(x), int(y))
self.setWindowTitle('放在屏幕中间')
btn = QPushButton(self)
btn.setText('开始')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
QTabWidget控件提供了一个选项卡和一个页面区域,默认显示第一个选项卡的页面,通过单击各选项卡可以查看对应的界面,如果在一个窗口中显示的输入字段很多,则可以对这些字段进行拆分,分别放置在不同界面的选项卡中
QTabWidget | 说明 |
---|---|
self=QTabWidget(parent) |
创建实例parent ->父控件,使用布局时可省略 |
self.addTab(tab, title) |
添加选项页tab ->QWidget类title ->字符串 |
self.insertTab(idx, tab, title) |
插入选项页idx ->从0开始tab ->QWidget类title ->字符串 |
self.removeTab(idx) |
移除选项页 |
self.setCurrentWidget(tab) |
设置当前可见的界面 |
self.setTabPosition() |
设置选项卡的位置:QTabWidget.North :显示在页面的上方QTabWidget.South :显示在页面的下方QTabWidget.West :显示在页面的左侧QTabWidget.East :显示在页面的右侧 |
self.setTabText(idx, title) |
设置选项页标题 |
继承自QWidget类的方法 | |
x , y , width , height , ... |
几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) |
设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) |
设置图标icon ->QIcon类 |
self.show() |
以非模式显示窗口 |
self.close() |
关闭窗口 |
import sys
from PyQt5.QtWidgets import *
class MyWindow(QTabWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('选项卡示例')
#创建3个选项卡小控件窗口
self.tab1=QWidget()
self.tab2=QWidget()
self.tab3=QWidget()
#将三个选项卡添加到顶层窗口中
self.addTab(self.tab1, '联系方式')
self.addTab(self.tab2, '个人详细信息')
self.addTab(self.tab3, '教育程度')
#每个选项卡自定义的内容
self.tab1UI()
self.tab2UI()
self.tab3UI()
def tab1UI(self):
#表单布局
layout=QFormLayout()
#添加姓名,地址的单行文本输入框
layout.addRow('姓名',QLineEdit())
layout.addRow('地址',QLineEdit())
self.tab1.setLayout(layout)
def tab2UI(self):
#表单布局,次水平布局
layout=QFormLayout()
sex=QHBoxLayout()
#水平布局添加单选按钮
sex.addWidget(QRadioButton('男'))
sex.addWidget(QRadioButton('女'))
#表单布局添加控件
layout.addRow(QLabel('性别'),sex)
layout.addRow('生日',QLineEdit())
self.tab2.setLayout(layout)
def tab3UI(self):
#水平布局
layout=QHBoxLayout()
#添加控件到布局中
layout.addWidget(QLabel('科目'))
layout.addWidget(QCheckBox('物理'))
layout.addWidget(QCheckBox('高数'))
self.tab3.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
QMainWindow是APP的最上层窗口,不能直接使用布局和控件,而是将其他窗口作为中央窗口(Central Widget)过渡
QMainWindow的结构分为五个部分:菜单栏(Menu Bar)、工具栏(Toolbars)、停靠窗口(Dock Widgets)、状态栏(Status Bar)和中央窗口(Central Widget)。可以用下面的图形表示:
菜单是QMenu
对象,然后将多个QMenu
对象放置在一个QMenuBar
(菜单栏)对象中。对于每个菜单,我们再为其添加动作列表,即QAction
对象。
QMainWindow类 | 说明 |
---|---|
self=QMainWindow(title) |
创建实例和标题栏title ->字符串,可省略 |
self.setCentralWidget(widget) |
将窗口设为中央窗口widget ->QWidget类 |
=self.statusBar() |
创建状态栏,返回QStatusBar类 |
=self.menuBar() |
创建菜单栏,返回QMenuBar类 |
继承自QWidget类的方法 | |
x , y , width , height |
几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) |
设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) |
设置图标icon ->QIcon类 |
self.show() |
以非模式显示窗口 |
self.close() |
关闭窗口 |
QStatusBar类 | 说明 |
---|---|
self.showMessage(message) |
设置状态栏文字message ->字符串 |
QMenuBar类 | 说明 |
---|---|
self.addAction(action) |
菜单添加动作action ->QAction类 |
self.addMenu(menu) |
菜单添加下拉菜单menu ->QMenu类 |
QMenu类 | 说明 |
---|---|
self..addAction(action) |
下拉菜单添加动作action ->QAction类 |
QAction类 | 说明 |
---|---|
self=Action(text, parent) |
创建实例和名称text ->字符串parent ->父控件,QMenuBar类或QMenu类 |
self.setShortcut('Ctrl+Q') |
快捷方式 |
self.setStatusTip(message) |
状态栏提示message ->字符串 |
self.triggered.connect(fun) |
触发的槽函数 |
import sys
from PyQt5.QtWidgets import *
from PyQt5.Qt import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('有菜单的APP')
self.statusBar()
menubar = self.menuBar()
file_menu = menubar.addMenu('File')
exit_act = QAction('Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Exit application')
exit_act.triggered.connect(qApp.quit)
file_menu.addAction(exit_act)
widget = QWidget()
self.setCentralWidget(widget)
layout = QHBoxLayout()
widget.setLayout(layout)
label = QLabel('开始')
label.setAlignment(Qt.AlignCenter)
layout.addWidget(label)
btn = QPushButton()
layout.addWidget(btn)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
QDialog是临时弹出的交互对话框,和QWidget的区别是QDialog没有最大最小化按钮,但是多出一个帮助按钮
QDialog类 | 说明 |
---|---|
self=QDialog(parent, title) |
创建实例和标题栏title ->字符串parent ->父控件,使用布局时可省略 |
self.exec() |
以模式显示窗口,锁住程序以等待窗口的返回值 |
继承自QWidget类的方法 | |
x , y , width , height , ... |
几何类方法,详见窗口的几何数据 |
self.setWindowTitle(title) |
设置标题栏文字title ->字符串 |
self.setWindowIcon(icon) |
设置图标icon ->QIcon类 |
self.setLayout(layout) |
载入布局,只能使用一次layout ->QLayout类 |
self.show() |
以非模式显示窗口 |
self.close() |
关闭窗口 |
import sys
from PyQt5.QtWidgets import *
class MyWindow(QDialog): # QWidget改为QDialog
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('垂直布局')
layout = QVBoxLayout()
self.setLayout(layout)
btn1 = QPushButton('start')
layout.addWidget(btn1)
btn2 = QPushButton('close')
layout.addWidget(btn2)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.move(500, 400)
self.setFixedSize(300, 300)
self.setWindowTitle('弹出窗口')
layout = QVBoxLayout()
self.setLayout(layout)
btn = QPushButton('对话框')
btn.clicked.connect(self.showDialog)
layout.addWidget(btn)
def showDialog(self):
dialog = QDialog(self)
dialog.move(600, 500)
dialog.setFixedSize(200, 100)
btn = QPushButton('关闭窗口', dialog)
btn.move(50, 50)
btn.clicked.connect(dialog.close)
dialog.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
文章浏览阅读1.3k次。1 #include<iostream> 2 3 using namespace std; 4 5 bool isPrime(int n) { 6 for (int i = 2; i < n; i++) { 7 if (n%i == 0) { //能被2到把自身小1的数整除的都不是素数 8 ..._分解偶数描述任何一个大于2的偶数都可以分解为两个素数的和,而且可能有多种分
文章浏览阅读2.3k次,点赞3次,收藏22次。项目简介最近在一个客户现场搞熔边机项目,涉及到收放卷工艺的卷径计算,同时张力控制使用的是摆杆,然后通过PID控制输出辅助转速补偿收卷伺服速度。单一的PID参数不能自动适应卷径变化,如在小卷径200mm下调试整定出的一组PID参数,当收卷卷径大于300mm的时候该组参数就不能稳定,系统会发散。于是想出了本篇文章将要为大家介绍的变比例变积分变微分自适应PID控制器。硬件介绍上图1为位置传感器,图中2部..._卷径控制
文章浏览阅读2.9w次,点赞2次,收藏18次。转转上买来的斐讯n1天天链,刷了webpad官改系统当电视盒子用,在手机上安装斐讯官方的遥控app后,可以替代实体遥控器,实现遥控电视盒子的功能,少掏30-40购买遥控器的钱。但是美中不足的是,盒子一旦关机就无法开机,必须重新插拔电源才能开机,很不方便。于是开始研究如何用软件遥控盒子开关机的办法。n1没有红外功能,所以遥控器一般都是通过蓝牙或者wifi来连接的。由于手上没有t1遥控器,不清楚使..._n1 /v1/keyevent
文章浏览阅读1.8k次。一、概述1、什么是应用配置?在程序开发过程中,我们通常将程序中需要变更的一些配置项或者元数据(比如数据库配置、文件地址等)从代码中分离出来,放在单独的配置文件中进行管理,我们称这些配置文件为应用配置。2、传统架构的配置管理在传统架构中,如果配置信息有变更,通常需要登录服务器并手动修改配置来使配置生效,如下图。3、ACM 配置管理应用配置管理 ACM 是一款在分布式架构环境中对应用配置..._springboot acm
文章浏览阅读1.9w次,点赞13次,收藏125次。图像二值化(Image Binarization):平均值法、双峰法、大津算法(OTSU)编程实现图像的二值化,分析不同的阈值对二值化图像的影响。_大津法
文章浏览阅读7.2k次,点赞8次,收藏66次。简介在S32K中,不同的芯片型号支持的ADC通道不同,S32K144UAVLL有两个ADC,每个ADC有12位、10位、8位和6位可选,每个ADC有16个外部通道。学习ADC的第一步是要掌握ADC的功能框图,对ADC的工作过程和编程过程有个整体的了解。ADC功能框图对ADC的配置主要涉及三种寄存器,控制状态寄存器、触发寄存器和数据寄存器。控制状态寄存器主要有SC2、SC3、CFG1和CFG2..._a32k358 adc
文章浏览阅读3.2k次。Beyond Compare_beyond compare 4.2 密钥
文章浏览阅读1.5k次。前路艰难,但谨记,你并不孤独。Spring Cloud如火如荼,抽空研究研究Spring大家族中的新份子。具体的介绍不会粗线在本系列博文中,如需要理论等知识直接百度or谷歌。Spring Cloud中保护N多已构建好的微服务,可以做到即插即用,其中大致包含几种服务:Config、Eureka、Ribbon、Hystrix、Feign、Bus等,具体介绍及开源地址请见:Spring Cloud中文官_springcloud 集中配置管理
文章浏览阅读116次。题目大意给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。示例 1:输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2:输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".解题思路动态规划,判断s[i]~s[j]是否是回文串,如果是回文串,res++。class Solution {_leetcode 647
文章浏览阅读4.4k次。Akka中通过下面的方法向actor发送消息! tell 意味着 “fire-and-forget”,即异步的发送消息无需等待返回结果? ask 异步发送消息并返回代表可能回复的Future。消息在每个发件人的基础上是有序的。MailBoxAkka邮箱包含发往Actor的消息。通常每个Actor都有自己的邮箱,但是也有例外,比如BalancingPool所有路由将共享_actor mailbox 实现原理
文章浏览阅读1.1k次。listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。_android listview使用
文章浏览阅读1.3w次。全屏模式fullscreen_fullscreen error