PyQT的安装和使用
pyQT的安装不需要在官网下载QT安装包,只需要创建conda环境然后pip安装,安装pyQT5-tools之后会安装QT designer,然后就可以可视化设计一个UI,然后通过Pyuic工具就可以转化为一个py文件,这个py文件就是整个工程,py文件中有一个class包含了整个UI设计,然后只需要编辑py文件中这个class的功能即可,编辑子函数。
(这个文档非常好)[https://www.w3ccoo.com/pyqt5/index.html]
VScode+pyQT installation
-
安装PyQt
pip install PyQt5 pip install PyQt5-toolsvscode安装PYQT Integration便于使用pyqt
# Pyqt-integration > Qtdesigner: Path \venv_QT\Lib\site-packages\qt5_applications\Qt\bin\designer # Pyqt-integration > Pyuic: Cmd 用于转化ui格式为py \venv_QT\Scripts\pyuic5 # Pyqt-integration > Pyuic > Compile: Filepath 默认是将ui转化好的py文件存在当前目录的ui文件夹下 -
使用Pyuic工具,将 .ui文件转换为 .py文件。
-
在文件夹栏空白处点击右键点击「PYQT: New Form」启动Qt Designer软件
-
「文件 > 另存为」,把所设计的 .ui文件保存到项目目录下
-
右击 xxx.ui文件「PYQT: Compile Form」调用Pyuic工将 xxx.ui文件转换为 xxx_Ui.py文件,是可以相互转化的。
# -x 开关向生成的 Python 脚本(来自 XML)添加了少量附加代码,使其成为可自执行的独立应用程序。 pyuic5 -x input.py -o output.ui python -m PyQt6.uic.pyuic -x register.ui -o register.py
-
-
对GUI界面进行修改和调整。在文件夹栏的 .ui文件右击,点击「PYQT: Edit in Designer」,即可启动Qt Designer对GUI界面进行编辑。
-
编辑完成后保存并退出Qt Designer,对.ui文件右击,点击「PYQT: Compile Form」,重新更新一次 xxx_Ui.py文件即可。
-
使用python编程,调用GUI界面的 .py文件,编写GUI界面各组件的绑定事件函数,如点击某按钮时触发某函数,实现某功能。
from PyQt5.QtWidgets import QApplication, QMainWindow import matchingNetworkDesigner_Ui # import GUI的.py文件 if __name__ == "__main__": app = QApplication(sys.argv) MainWindow = QMainWindow() ui = matchingNetworkDesigner_Ui.Ui_MainWindow()# ui=GUI的py文件名.类名 ui.setupUi(MainWindow) ui.L_PB_cal.clicked.connect(L_cal) # 把函数绑定GUI的按钮的点击事件。 ui.L_PB_reset.clicked.connect(L_reset)# 按钮名字「L_PB_cal」和「L_PB_reset」在Qt Designer中定义。 MainWindow.show() sys.exit(app.exec_())
PyQT include
| PyQT的模块组成 | 其余就是和web,sql,opengl等一些相关的,用不着 |
|---|---|
| QtCore | 其他模块使用的核心非 GUI 类 |
| QtGui | 图形用户界面组件 |
| QtXml | 处理 XML 的类 |
| QtWidgets | 用于创建经典桌面样式 UI 的类。 |
| QtDesigner | 用于扩展 Qt Designer 的类 |
| PyQt5-tools的组成 | 其余不用看的 |
|---|---|
| assistantQt Assistant | 文档工具 |
| pyqt5designerQt Designer GUI | 布局工具 |
| linguist Qt Linguist | 翻译工具 |
| qmake Qt | 软件构建工具 |
| pyuic5 | 用于从 ui 文件生成代码的 Qt 用户界面编译器 |
PyQT Basic Class
- QObject 是所有 Qt 对象的基类
- QPaintDevice类是所有可绘制对象的基类。
- QWidget类,派生自 QObject 和 QPaintDevice 类,是所有用户界面对象的基类。一般QWidget就是初始的大页面
- QApplication类管理 GUI 应用程序的主要设置和控制流程包含主事件循环,其实就控制每个页面的关闭开启
- QMainWindow基于 GUI 的应用程序的顶级窗口是由 QMainWindow 小部件对象创建的
QT信号与插槽-最重要的概念
每个派生自 QObject 类的 PyQt 小部件都可以发出 “信号” 以响应一个或多个事件。信号是一个小部件的成员函数,比如点击click()。信号"连接connect"到一个"插槽function"。 插槽可以是任何可调用的 Python 函数。
-
可以使用qt designer的Signal/Slot 编辑器(或按 F4)直接添加
-
widget.signal.connect(slot_function) button.clicked.connect(slot_function)
布局管理
绝对布局
- 设置一个大画面setGeometry(10,10,300,200),然后里面的button位于move(50,2)
def window():
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget())
w.setGeometry(10,10,300,200)
w.setWindowTitl
b = QtGui.QPushButton(w)
b.setText("Hello World!")
b.move(50,20e(“PyQt”)
w.show()
sys.exit(app.exec_())
if __name__ == '__main__':
window()
相对布局
-
QBoxLayout垂直或水平排列
-
addWidget()将小部件添加到
-
addStretch()创建空的可拉伸框
-
addLayout()添加另一个嵌套布局
-
vbox = QVBoxLayout(),最后要win.setLayout(vbox)
-
-
QGridLayout以行和列排列
-
QFormLayout创建两列表单
qt组件
多页面
不止一个界面,如何弹出界面并多页面操作
简单的提示界面
-
QDialog
def window(): app = QApplication(sys.argv) w = QWidget() btn = QPushButton(w) btn.clicked.connect(showdialog) w.setWindowTitle("PyQt Dialog demo") w.show() sys.exit(app.exec_()) def showdialog(): dlg = QDialog() b1 = QPushButton("ok",dlg) -
QMessageBox
def window(): app = QApplication(sys.argv) w = QWidget() b = QPushButton(w) b.clicked.connect(showdialog) w.setWindowTitle("PyQt MessageBox demo") w.show() sys.exit(app.exec_()) def showdialog(): msg = QMessageBox() msg.setIcon(QMessageBox.Information)
真正的多页面
-
SDI 单文档接口:显示多个独立的窗口。 这需要更多的内存资源。
-
MDI 多文档接口 :子窗口相对于彼此放置在主容器内。 容器小部件称为 QMdiArea。
QMdiArea 小部件一般占据 QMainWondow 对象的中心小部件。 该区域中的子窗口是 QMdiSubWindow 类的实例。
class MainWindow(QMainWindow):
count = 0
def __init__(self, parent = None):
super(MainWindow, self).__init__(parent)
self.mdi = QMdiArea()
self.setWindowTitle("MDI demo")
self.setCentralWidget(self.mdi)
bar = self.menuBar()
file = bar.addMenu("File")
file.addAction("New")
file.triggered[QAction].connect(self.windowaction)
def windowaction(self, q): # 多个menu摁键传入参数
print ("triggered")
if q.text() == "New":
MainWindow.count = MainWindow.count+1
sub = QMdiSubWindow()
sub.setWidget(QTextEdit())
sub.setWindowTitle("subwindow"+str(MainWindow.count))
self.mdi.addSubWindow(sub)
sub.show()
面向对象地制作GUI
QSS
Qt Style Sheets ExamplesQt 官方例子
Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同。
-
类似CSS,QSS每一条都是由一个选择器和一组声明构成:
-
选择器选出要对哪种控件进行样式修改,
-
每个声明都是键值对,键为属性,值为属性值
-
设置方法
-
局部设置,用setStyleSheet(QSS)
label1 = QLabel('标签1', self) label1.setStyleSheet('background-color:green;')btn2 = QPushButton('按钮2', self) btn2.move(200, 100) btn2.resize(70, 30) #局部设置 btn1.setStyleSheet(''' QPushButton{ color:red; } QPushButton:hover{ background-color: green; } ''') -
全局设置,把所有的buttun之类的都设置好QSS,然后直接对Mainwindow进行加载
if __name__ == '__main__' : app = QApplication(sys.argv) window = Window() QssStyle = ''' QPushButton:hover{ background-color: green; } QPushButton[name="btn"]:hover{ background-color: red; } QPushButton#btn:hover{ background-color: green; color:red; } ''' # # 全局设置 window.setStyleSheet(QssStyle) # 当前窗口全局有效 window.show() sys.exit(app.exec_())
为降低耦合,往往把QSS写在一个单独的style.qss文件中,然后在main.py的QApplication或QMainWindow中加载样式
QPushButton {
background-color: #555555;
border: none;
color: white;
font-size: 14px;
border-radius: 3px;
padding: 5px 10px;}QPushButton:hover {
background-color: #666666;}QProgressBar {
background-color: #444444;
height: 8px;
border-radius: 4px;}QProgressBar::chunk {
background-color: #777777;}QSlider {
background-color: #444444;}QSlider::handle:horizontal {
background-color: #666666;
border-radius: 100%;
width: 12px;
height: 12px;
margin: -3px 0;}
# 加载QSS样式的方法
app = QApplication(sys.argv)
window = MainWindow()
style_file = './style.qss'
style_sheet = QSSLoader.read_qss_file(style_file)
window.setStyleSheet(style_sheet)
window.show()
sys.exit(app.exec_())
Qt-material
一个github开源,可以快速设置所有的qss。还有很多其他的快速设置qss的库GTRONICK-QSS,飞扬青云-QSS,QDarkStyleSheet
pip install qt-material
# 使用例子
import sys
from PyQt5 import QtWidgets
from qt_material import apply_stylesheet
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
apply_stylesheet(app, theme='dark_teal.xml')
window.show()
app.exec_()

2万+

被折叠的 条评论
为什么被折叠?



