#PyQt5# Python的GUI库
“ 文章所涉及内容更多来自网络,在此声明,并感谢知识的贡献者!”
pyqt5 简介—
PyQt5 简介
PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏。
—
PyQt5 特性
PyQt5特性如下:
基于高性能的Qt的GUI控件集。
能够跨平台运行在Linux、Window和Mac OS系统上。
使用信号槽机制进行通信。
对Qt库进行完全封装。
可以使用成熟的IDE进行界面设计,并自动生成可执行的Python代码。
提供一整套种类齐全的窗口控件。
—
PyQt5 模块
PyQt5是由一系列Python模块组成,有超过620个类,6000个函数和方法,主要模块如下:
QtCore:包含了核心的非 GUI 的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime 类文件、进程与线程一起使用。
QtGui:包含了窗口系统、事件处理、2D 图像、基本绘画、字体和文字类。
QtWidgets:包含了一系列创建桌面应用的 UI 元素。
QtMultimedia:包含了处理多媒体的内容和调用摄像头 API 的类。
QtBluetooth:包含了查找和连接蓝牙的类。
QtNetwork:包含了网络编程的类,这些工具能让 TCP/IP 和 UDP 开发变得更加方便和可靠。
QtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本。
Enginio:包含了通过客户端进入和管理 Qt Cloud 的类。
QtWebSockets:包含了 WebSocket 协议的类。
QtWebKit:包含了一个基 WebKit2 的 web 浏览器。
QtWebKitWidgets:包含了基于 QtWidgets 的 WebKit1 的类。
QtXml:包含了处理 xml 的类,提供了 SAX 和 DOM API 的工具。
QtSvg:提供了显示 SVG 内容的类,Scalable Vector Graphics (SVG) 是一种是一种基于可扩展标记语言 (XML),用于描述二维矢量图形的图形格式(这句话来自于维基百科)。
QtSql:提供了处理数据库的工具。
QtTest:提供了测试 PyQt5 应用的工具。
—
PyQt5安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5-tools
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQtWebEngine
pip install pyQtDataVisualization
pip install pyqtchart
—
PyQt5 开发:
--基于QtDesigner开发UI界面
Qt Designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速UI设计。
整个画面的构成:
左侧的“Widget Box”就是各种可以自由拖动的组件
中间的“MainWindow – untitled”窗体就是画布
右上方的”Object Inspector”可以查看当前ui的结构
右侧中部的”Property Editor”可以设置当前选中组件的属性
右下方的”Resource Browser”可以添加各种素材,比如图片,背景等等
最终生成.ui文件(实质上是XML格式的文件),可直接使用,也可以通过pyuic5工具转换成.py文件。
--通过pyuic5工具将UI文件转换成.py文件
PyUIC主要是把Qt Designer生成的.ui文件换成.py文件。
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置
Program : D:\Program Files\Python36\python.exe # 当前Python目录,请根据实际修改
Arguments: -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working directory: $FileDir$
--通过pyrcc5工具将UI文件的资源文件qrc转换成.py文件
PyRCC主要是把编写的.qrc资源文件换成.py文件。
在Pycharm中,依次打开 File – Settings – Tools – External Tools,点击 + Create Tool,配置如下:
Name: PyRCC
Program: D:\Program Files\Python36\pyrcc5.exe # 当前rcc工具目录,请根据实际修改
Arguments: $FileName$ -o $FileNameWithoutExtension$_rc.py
Working directory: $FileDir$
—
PyQt5 组件
基于QtDesigner设计UI
一、QMainWindow
QMainWindow、QWidget、QDialog用于创建窗口,可以直接使用,也可以派生使用。
QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式。
QDialog是对话框窗口的基类,主要用于执行短期任务,或与用户进行交互,可以是模态或非模态的。QDialog对话框没有菜单栏、工具栏、状态栏等。
QWidget是Qt图形组件的基类,可以作为顶层窗口,也可以嵌入到其它组件中。
QMainWindow实例
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QLabel, QDesktopWidget, QToolBar
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
# 菜单栏设置
self.menuBar = self.menuBar()
self.menuBar.addAction("File")
self.menuBar.addAction("View")
# 工具栏设置
open = QToolBar()
open.addAction("OPen")
self.addToolBar(open)
close = QToolBar()
close.addAction("Close")
self.addToolBar(close)
# 中央组件设置
self.window = QWidget()
self.setCentralWidget(self.window)
# 状态栏设置
self.statusBar = self.statusBar()
self.statusBar.showMessage("This is an status message.", 5000)
label = QLabel("permanent status")
self.statusBar.addPermanentWidget(label)
self.resize(800, 600)
self.setWindowTitle("MainWindow Demo")
self.center()
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
二、QWidget
1、QWidget简介
QWidget是所有GUI界面组件的基类,所有窗口和控件都直接或间接继承自QWidget基类。
2、窗口坐标系统
Qt使用统一的坐标系统来定位窗口控件的位置和大小,坐标系统如下:
PyQt5快速入门(三)PyQt5基本窗口组件_PyQt 基础窗口部件_02
以屏幕的左上角为原点,即(0,0),从左向右为X轴正向,从上向下为Y轴正向,屏幕的坐标系统用于定位顶层窗口。窗口内部有自己的坐标系统,窗口坐标系统以左上角为原点,即(0,0),从左向右为X轴正向,从上向下为Y轴正向,原点、X轴、Y轴围成的区域为客户区,在客户区的周围是标题栏、边框。
QWidget实例
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QDesktopWidget, QToolBar
class MainWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("MainWidget")
self.resize(800, 600)
self.center()
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)
def dispalyGeometry(self):
x = self.x()
y = self.y()
print("x: {0}, y: {1}".format(x, y))
x = self.pos().x()
y = self.pos().y()
print("x: {0}, y: {1}".format(x, y))
x = self.frameGeometry().x()
y = self.frameGeometry().y()
print("x: {0}, y: {1}".format(x, y))
x = self.geometry().x()
y = self.geometry().y()
print("x: {0}, y: {1}".format(x, y))
print("geometry: ", self.geometry())
print("frameGemetry: ", self.frameGeometry())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWidget()
window.show()
window.dispalyGeometry()
sys.exit(app.exec_())
三、QLabel
1、QLabel简介
QLabel作为一个占位符可以显示不可编辑的文本、图片、GIF动画,QLabel是界面的标签类,继承自QFrame。
QLabel实例
import sys
from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
if __name__ == "__main__":
app = QApplication(sys.argv)
window = QLabel()
window.setWindowTitle("QLabel Demo")
window.setText("www.baidu.com")
window.setOpenExternalLinks(True)
pallette = QPalette()
pallette.setColor(QPalette.Window, Qt.blue)
window.setPalette(pallette)
window.setAlignment(Qt.AlignCenter)
window.setAutoFillBackground(True)
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
四、文本框控件
1、QLineEdit
QLineEdit是单行文本框控件,可以编辑单行字符串,用于接收用户输入。
2、QTextEdit
QTextEdit是一个多行文本框编辑控件,可以显示、编辑多行文本编辑内容,当文本内容超出控件显示范围时,可以显示水平和垂直滚动条,QTextEdit不仅可以显示文本,还可以显示HTML文档。
QTextEdit示例
import sys
from PyQt5.QtWidgets import QApplication, QTextEdit, QWidget, QLabel
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIntValidator
class MainWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
label = QLabel("input: ", self)
label.move(0, 0)
self.textEdit = QTextEdit(self)
self.textEdit.move(50, 0)
self.textEdit.setPlainText("Hello, PyQt5")
self.textEdit.textChanged.connect(self.displayText)
def displayText(self):
print(self.textEdit.toPlainText())
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWidget()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
五、按钮控件
1、QPushButton
QPushButton继承自QAbstractButton,形状为长方形,文本、图标显示在长方形区域。
2、QRadioButton
QRadioButton继承自QAbstractButton,提供了一组可选的按钮和标签,用户可以选择其中一个选项,标签用于显示对应的文本信息。QRadioButton是一种开关按钮,可以切换为on或off,即checked或unchecked。在单选按钮组里,一次只能选择一个单选按钮,如果需要多个独占的按钮组合,需要将其放到QGroupBox或QButtonGroup中。
3、QCheckBox
QCheckBox继承自QAbstractButton,提供一组带文本标签的复选框,用户可以选择多个选项,复选框可以显示文本和图标。
除了选中、未选中,QCheckBox有第三种状态:半选中,表示没有变化。
六、QComboBox
QComboBox是下拉列表框。
七、QSpinBox
QSpinBox是一个计数器控件,允许用户选择一个整数值,通过单击向上、向下按钮或键盘的上下箭头来增加减少当前显示的值,用户也可以从编辑框输入当前值。默认情况下,QSpinBox的取值范围为0——99,每次改变的步长值为1。
八、QSlider
QSlider控件提供了一个垂直或水平的滑动条,是一个用于控制有界值的控件,允许用户沿着水平或垂直方向在某一范围内移动滑块,并将滑块所在的位置转换成一个合法范围内的整数值。
九、对话框控件
1、QDialog
QDialog是对话框类,提供了三种窗口模态,非模态,模态和应用程序模态,使用setWindowModality方法设置窗口模态。
(1)非模态
非模态可以和应用程序的其它窗×××互,使用Qt.NonModal进行设置。
(2)窗口模态
窗口模态在未处理完成当前对话框时,将阻止和对话框的父窗口进行交互,使用Qt.Modal进行设置。
(3)应用程序模态
应用程序模态阻止任何和其它窗口进行交互,使用Qt.ApplicationModal。
QDialog及其派生类对话框在ESC按键按下时,对话框窗口将会默认调用QDialog.reject方法,关闭对话框。
setWindowModality()方法可以设置窗口是否是模态窗口,Qt::WindowModality默认值为Qt::NonModal,如果没有设置Qt::WindowModality属性值,每次用show()方法显示出的窗口都是非模态窗口。
使用exec()方法显示的对话框为模态对话框,同时会阻塞窗口的响应直到用户关闭对话框,并且返回DialogCode(包括Accepted和Rejected两个值)结果。
如果没有设置Qt::WindowModality属性值,使用exec()方法显示出的对话框默认为应用程序级模态对话框。所有使用exec()方法显示的对话框在窗口关闭前会阻塞整个程序所有窗口的响应。调用exec()方法后,对话框会阻塞,直到对话框关闭才会继续执行。在关闭对话框后exec()方法会返回Accepted或者Rejected,一般程序根据返回不同的结果进行相应的操作。
模式对话框有自己的事件循环,exec() 方法内部先设置modal属性为Qt::ApplicationModal,然后调用 show() 显示对话框,最后启用事件循环来阻止exec() 方法的结束。直到窗口关闭,得到返回结果(DialogCode),退出事件循环,最后exec()方法调用结束,exec()方法后的代码将继续执行。
2、QMessageBox
QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过点击不同的标准按钮对消息进行反馈,QMessageBox提供了五种常用消息对话框的显示方法。
warning(self, QWidget, p_str, p_str_1, buttons, QMessageBox_StandardButtons=None, QMessageBox_StandardButton=None, *args, **kwargs)
创建警告消息对话框
critical(self, QWidget, p_str, p_str_1, buttons, QMessageBox_StandardButtons=None, QMessageBox_StandardButton=None, *args, **kwargs)
创建关键错误消息对话框
information(self, QWidget, p_str, p_str_1, buttons, QMessageBox_StandardButtons=None, QMessageBox_StandardButton=None, *args, **kwargs)
创建信息消息对话框
question(self, QWidget, p_str, p_str_1, buttons, QMessageBox_StandardButtons=None, QMessageBox_StandardButton=None, *args, **kwargs)
创建询问消息对话框
about(self, QWidget, p_str, p_str_1)
创建关于信息对话框
3、QInputDialog
QInputDialog是一个标准对话框控件,由一个文本框和两个按钮(OK和Cancel)组成,用户单击OK按钮或按下Enter键后,在父窗口可以接收通过QInputDialog输入的信息。
QInputDialog.getInt从控件中获取标准整型输入
QInputDialog.getItem从控件中获取列表的选项输入
QInputDialog.getText从控件中获取标准字符串输入
QInputDialog.getDouble从控件中获取标准浮点数输入
4、QFontDialog
QFontDialog是字体选择对话框,可以让用户选择所显示的文本的字号大小、样式和格式。QFontDialog.getFont可以从字体选择对话框中获取文本的显示字号、样式和格式。
5、QFileDialog
QFileDialog是用于打开和保存文件的标准对话框,QFileDialog在打开文件时使用文件过滤器,用于显示指定扩展名的文件。
—
PyQt5 案例
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
app = QApplication(sys.argv)
win = QMainWindow()
win.setGeometry(400, 400, 400, 300)
win.setWindowTitle("Pyqt5 Tutorial")
win.show()
sys.exit(app.exec_())
其中:
Qapplication():每个GUI都必须包含一个Qapplication,argv表示获取命令行参数,如果不用获取,则可以使用[]代替。
QMainWindow():类似一个容器(窗口)用来包含按钮、文本、输入框等widgets。arg标识可以获取命令行执行时的参数。
SetGeometry是用来定义 QMainWindow() 窗口的尺寸, 语法:setGeometry(x, y, width, height ),其中x,y为屏幕上的坐标点。
show():用来显示窗口
exit(app.exec_()):设置窗口一直运行指导使用关闭按钮进行关闭
—
PyQt5 打包
将.py文件打包成可执行的exe在Python中称为freezing,常用的工具有:PyInstaller, py2exe, cx_Freeze, bbfreze, py2app等。功能对比:
py2exe:软件更新已经不活跃,因此也就略过。
pyinstaller:明确支持win8、win10、理论上支持win7,,支持apple Macos, linux。pyinsaller可以打包成文件夹形式内含exe入口执行文件的形式,也可以是一个单独的exe文件。
fbs[15]:基于PyInstaller,使用起来更加方便
—
参考资料:
https://www.52dianzi.com/category/article/37/653666.html
https://blog.51cto.com/quantfabric/2422601
QT Designer配置:
https://blog.csdn.net/nima1994/article/details/79579062
Pycharm配置:
https://blog.csdn.net/wu_l_v/article/details/79016139
QTDesigner与PyUIC配置
https://www.cnblogs.com/lsdb/p/9121903.html
将ui转成对应的py
https://blog.csdn.net/jasoncrawford/article/details/102787489
PyCharm怎样设置Pyqcc
https://jingyan.baidu.com/article/5553fa8298b99c65a23934dd.html
将ui和qrc文件生成对应的py文件
https://www.cnblogs.com/aziji/archive/2004/01/13/11996111.html
PYQT5配置:
QTDesigner与PyUIC配置
https://www.cnblogs.com/lsdb/p/9121903.html
将ui转成对应的py
https://blog.csdn.net/jasoncrawford/article/details/102787489
PYQT5案例:
https://blog.csdn.net/qq_30683995/article/details/90081370
PYQT5教程:
http://code.py40.com/2052.html
基于PYQT5添加背景图片:
https://blog.csdn.net/cxj540947672/article/details/99857518
基于QT Designer, 控件随窗口大小变化一直居中显示:
https://www.cnblogs.com/dcb3688/p/4311138.html
https://jingyan.baidu.com/article/60ccbceb741d5064cab19719.html
pyuic转换ui文件为py‘文件报错No such file or directory:
https://blog.csdn.net/qq_44030336/article/details/89147183
PyCharm怎样设置Pyqcc
https://jingyan.baidu.com/article/5553fa8298b99c65a23934dd.html
将ui和qrc文件生成对应的py文件
https://www.cnblogs.com/aziji/archive/2004/01/13/11996111.html
Table Widget Item 颜色和字体设置
https://blog.csdn.net/qq_45690024/article/details/104417646
https://www.cnblogs.com/shiqi17/p/12175763.html
基于QChartView画图
https://www.pianshen.com/article/49071276716/
https://blog.csdn.net/dakey2008/article/details/106234667/
TortoiseSVN 使用教程:
https://www.runoob.com/svn/tortoisesvn-intro.html
Pyqt5 消息框
https://blog.csdn.net/qq_38161040/article/details/89394187?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242
https://blog.csdn.net/wang_jiankun/article/details/83269859
https://www.jb51.net/article/138471.htm
Pyqt5 Table Widget 自动填充大小
https://www.jb51.net/article/181132.htm
pymysql 数据库操作:
https://www.cnblogs.com/shanger/p/12982357.html
https://blog.csdn.net/weixin_33881050/article/details/92413426?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242
https://www.cnblogs.com/ccorz/p/5711955.html
PyQT5 开发第一课:
https://blog.csdn.net/monsterlih/article/details/104235354
Qt模态界面设置setWindowModality禁止其他界面响应
https://blog.csdn.net/u010058695/article/details/101011907
https://blog.csdn.net/zhuoyue008/article/details/82704572?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
https://blog.csdn.net/tomorrowsummer/article/details/106266614
ComboBox设置
https://blog.csdn.net/samenmoer/article/details/80384004
TableWidget 使用
https://www.cnblogs.com/eclipsexcs/p/12170134.html
PyQt5不同窗口之间的值传递
https://blog.csdn.net/qq_39560620/article/details/105711799
https://blog.csdn.net/sinat_36188088/article/details/102855170
https://blog.csdn.net/qq_27694835/article/details/112183376