文档: https://www.riverbankcomputing.com/static/Docs/PyQt5/
面向过程编程
布局方案一:
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
import sys
# 按钮事件
def click_btn():
print("点击了按钮")
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建窗口及初始化
window = QWidget()
window.setWindowTitle('标题')
window.resize(400, 400)
window.move(400, 200) # 窗口位置
# 创建控件及初始化
btn = QPushButton(window)
btn.setText("按钮")
btn.move(200, 200) # 控件位置
btn.clicked.connect(click_btn) # 按钮绑定函数
# 窗口显示
window.show()
sys.exit(app.exec_())
这个界面窗口有个按钮,点击按钮触发输出事件,如果需要按钮绑定关闭窗口事件
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
import sys
# 按钮事件
def click_btn(UI_show):
print("点击了按钮")
UI_show.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建窗口及初始化
window = QWidget()
window.setWindowTitle('标题')
window.resize(400, 400)
window.move(400, 200) # 窗口位置
# 创建控件及初始化
btn = QPushButton(window)
btn.setText("按钮")
btn.move(200, 200) # 控件位置
btn.clicked.connect(lambda: click_btn(window)) # 按钮绑定函数
# 窗口显示
window.show()
sys.exit(app.exec_())
布局方案二:
该方案采用了和方案一不一样的布局方式,我比较推荐使用这种,将控件与布局分隔开,方便代码阅读
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout
import sys
# 按钮事件
def click_btn():
print("点击了按钮")
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建窗口及初始化
window = QWidget()
window.setWindowTitle('标题')
window.resize(400, 400)
window.move(400, 200) # 窗口位置
# 创建控件及初始化
btn = QPushButton()
btn.setText("按钮")
btn.clicked.connect(click_btn)
# 布局
layout = QVBoxLayout()
layout.addWidget(btn)
window.setLayout(layout)
# 窗口显示
window.show()
sys.exit(app.exec_())
面向对象编程
把窗口布局封装成一个类,然后生成类对象,下面这个窗口,点击按钮会关闭窗口
import sys
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QApplication
class QMainWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# 窗口属性
self.setWindowTitle("标题")
self.resize(400, 400)
# 控件
self.btn = QPushButton("按钮关闭窗口")
self.btn.clicked.connect(self.click_btn) # 按钮绑定事件
# 布局
self.layout = QVBoxLayout()
self.layout.addWidget(self.btn)
self.setLayout(self.layout)
def click_btn(self):
print('关闭窗口')
self.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QMainWindow()
window.show()
sys.exit(app.exec_())
界面与逻辑分离
这里将界面单独作为一个文件,只包含界面的设计布局等(self.setLayout之后就会自适应窗口大小),一些事件绑定和事件的实现作为另一个文件(事件的实现可以单独拿出来再做一个文件,即功能实现和事件绑定做一个文件,函数实现作为一个文件)
单一界面
界面文件(Ui_window.py)
from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore
class UI_QMainWindow(object):
# 初始化可有可无·
# def __init__(self):
# super(UI_QMainWindow, self).__init__()
def setUI(self, MainWindow):
# 窗口设置
MainWindow.setObjectName("Mainwindow")
MainWindow.resize(400, 400)
# 控件
self.btn = QPushButton("按钮关闭窗口")
# 布局
self.layout = QVBoxLayout(MainWindow)
self.layout.addWidget(self.btn)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "标题"))
self.btn.setText(_translate("MainWindow", "按钮"))
逻辑代码(启动文件)(按钮绑定事件,函数也可以单独定义到一个文件中,封装成类)
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from Ui_Window import UI_QMainWindow
class FirstWindow(QWidget, UI_QMainWindow):
def __init__(self):
super(FirstWindow, self).__init__()
self.setUI(self)
self.btn.clicked.connect(self.click_btn)
def click_btn(self):
print('点击了按钮,关闭窗口')
self.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = FirstWindow()
window.show()
sys.exit(app.exec_())
通过按钮打开新界面(原界面不关闭)
运行时先打开Ui_Window.py界面,点击按钮后打开Ui_2.py界面,原界面不关闭
界面一(Ui_Window.py):
from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore
class UI_QMainWindow(object):
def setUI(self, MainWindow):
# 窗口设置
MainWindow.setObjectName("Mainwindow")
MainWindow.resize(400, 400)
# 控件
self.btn = QPushButton()
# 布局
self.layout = QVBoxLayout(MainWindow)
self.layout.addWidget(self.btn)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "窗口一"))
self.btn.setText(_translate("MainWindow", "按钮"))
界面二(Ui_2.py):
from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore
class Ui_win(object):
def setUI(self, MainWindow):
MainWindow.setObjectName("Mainwindow")
MainWindow.resize(200, 200)
# 控件
self.btn1 = QPushButton()
# 布局
self.layout = QVBoxLayout(MainWindow)
self.layout.addWidget(self.btn1)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "窗口二"))
self.btn1.setText(_translate("MainWindow", "按钮"))
逻辑代码:
修改main.py中的点击函数(wid前一定要加self,不加self则没有app = QApplication(sys.argv)支持,会闪退)
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from Ui_Window import UI_QMainWindow
from Ui_2 import Ui_win
class FirstWindow(QWidget, UI_QMainWindow):
def __init__(self):
super(FirstWindow, self).__init__()
self.setUI(self)
# 绑定事件
self.btn.clicked.connect(self.click_btn)
def click_btn(self):
# 这里wid前一定要加self将其加入到主进程的self中,不加self则没有app = QApplication(sys.argv)支持,会闪退
self.wid = QWidget()
Ui = Ui_win()
Ui.setUI(self.wid)
self.wid.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = FirstWindow()
window.show()
sys.exit(app.exec_())
通过按钮打开新界面(原界面关闭)
运行时先打开Ui_2.py文件的界面,点击按钮后,该界面会关闭,接着打开UiWindow.py文件界面
界面一(UiWindow.py):
from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore
class UI_QMainWindow(object):
def setUI(self, MainWindow):
# 窗口设置
MainWindow.setObjectName("Mainwindow")
MainWindow.resize(400, 400)
# 控件
self.btn = QPushButton()
# 布局
self.layout = QVBoxLayout(MainWindow)
self.layout.addWidget(self.btn)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "窗口一"))
self.btn.setText(_translate("MainWindow", "按钮"))
界面二(Ui_2.py):
from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore
class Ui_win(object):
def setUI(self, MainWindow, window):
MainWindow.setObjectName("Mainwindow")
MainWindow.resize(200, 200)
# 控件
self.btn1 = QPushButton()
# 布局
self.layout = QVBoxLayout(MainWindow)
self.layout.addWidget(self.btn1)
self.btn1.clicked.connect(lambda: self.click_btn1(MainWindow, window))
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def click_btn1(self, MainWindow, window):
MainWindow.close()
window.show()
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "窗口二"))
self.btn1.setText(_translate("MainWindow", "按钮"))
逻辑代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from Ui_Window import UI_QMainWindow
from Ui_2 import Ui_win
class FirstWindow(QWidget, UI_QMainWindow):
def __init__(self):
super(FirstWindow, self).__init__()
self.setUI(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = FirstWindow()
wid = QWidget()
Ui = Ui_win()
Ui.setUI(wid, main_window)
wid.show()
sys.exit(app.exec_())