来源:王铭东老师的B站教程
链接:PyQt5 快速入门_哔哩哔哩_bilibili
#清空
xxx.clear()
#插入新内容到最右光标处
xxx.insert("内容")
# hobby 主要是保证他们是一个组。
hobby_box = QGroupBox("爱好")
# 把爱好的内容添加到容器中
container.addWidget(hobby_box)
完整代码
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGroupBox, QVBoxLayout, QHBoxLayout, QRadioButton
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 最外层的垂直布局,包含两部分:爱好和性别
container = QVBoxLayout()
# -----创建第1个组,添加多个组件-----
# hobby 主要是保证他们是一个组。
hobby_box = QGroupBox("爱好")
# v_layout 保证三个爱好是垂直摆放
v_layout = QVBoxLayout()
btn1 = QRadioButton("抽烟")
btn2 = QRadioButton("喝酒")
btn3 = QRadioButton("烫头")
# 添加到v_layout中
v_layout.addWidget(btn1)
v_layout.addWidget(btn2)
v_layout.addWidget(btn3)
# 把v_layout添加到hobby_box中
hobby_box.setLayout(v_layout)
# -----创建第2个组,添加多个组件-----
# 性别组
gender_box = QGroupBox("性别")
# 性别容器
h_layout = QHBoxLayout()
# 性别选项
btn4 = QRadioButton("男")
btn5 = QRadioButton("女")
# 追加到性别容器中
h_layout.addWidget(btn4)
h_layout.addWidget(btn5)
# 添加到 box中
gender_box.setLayout(h_layout)
# 把爱好的内容添加到容器中
container.addWidget(hobby_box)
# 把性别的内容添加到容器中
container.addWidget(gender_box)
# 设置窗口显示的内容是最外层容器
self.setLayout(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
网格布局(九宫格布局)
#创建输入框
edit = QLineEdit()
#设置无输入时显示的内容
edit.setPlaceholderText("请输入内容")
完整代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QGridLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("计算器")
# 准备数据
data = {
0: ["7", "8", "9", "+", "("],
1: ["4", "5", "6", "-", ")"],
2: ["1", "2", "3", "*", "<-"],
3: ["0", ".", "=", "/", "C"]
}
# 整体垂直布局
layout = QVBoxLayout()
# 输入框
edit = QLineEdit()
edit.setPlaceholderText("请输入内容")
# 把输入框添加到容器中
layout.addWidget(edit)
# 网格布局
grid = QGridLayout()
# 循环创建追加进去
for line_number, line_data in data.items():
# 此时line_number是第几行,line_data是当前行的数据
for col_number, number in enumerate(line_data):
# 此时col_number是第几列,number是要显示的符号
btn = QPushButton(number)
# grid.addWidget(btn)
grid.addWidget(btn, line_number, col_number)
# 把网格布局追加到容器中
layout.addLayout(grid)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
创建抽屉布局及其所需的窗口,将窗口添加到布局器中,然后将按钮点击链接到窗口切换的事件中。其余创建最外层容器等基本操作不再赘述。
1. 创建抽屉布局和窗口
def create_stacked_layout(self):
# 创建堆叠(抽屉)布局
self.stacked_layout = QStackedLayout()
# 创建单独的Widget
win1 = Window1()
win2 = Window2()
# 将创建的2个Widget添加到抽屉布局器中
self.stacked_layout.addWidget(win1)
self.stacked_layout.addWidget(win2)
2. 设定窗口函数
class Window1(QWidget):
def __init__(self):
super().__init__()
QLabel("我是抽屉1要显示的内容", self)
#非必要:设定窗口样式
self.setStyleSheet("background-color:green;")
3. 添加事件,链接到显示界面切换。(下图是按钮)
# 给按钮添加事件(即点击后要调用的函数)
btn_press1.clicked.connect(self.btn_press1_clicked)
1. QWidget
一般作为主窗口。当要精心设计时选用。
2. QMainWindow
带有任务栏和状态栏的窗口。
注意与QWidget不同的点,QWidget可以将布局作为最外层,而QMainWindow必须是窗口。因此代码需要添加下面一段。
#QMainWindow需要将窗口作为最外层
widget = QWidget()
widget.setLayout(container)
self.setCentralWidget(widget)
3. QDialog
对话框一般不应该作为主窗口的存在,而是通过点击操作弹出,起到提示作用
对象.信号.connect(槽函数)
必须定义在函数外的类中(建议放在类起始处)。
步骤:
# 1. 声明一个信号 只能放在函数的外面
my_signal = pyqtSignal(str)
# 2. 绑定信号和槽
self.my_signal.connect(self.my_slot)
# 3. 自定义函数
def my_slot(self, msg):
槽实际上是一个函数, 当信号发射出来后,会执行与之绑定的槽函数。
利用Qt Designer设计界面与手写的类似,区别是要加载ui文件,而导入ui文件则需要导入PyQt5
中的 uic
模块,如下面程序所示:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
if __name__ == '__main__':
app = QApplication(sys.argv)
#加载ui
ui = uic.loadUi("./test.ui")
ui.show()
app.exec()
可以把uic.loadUi放在窗口类中:
# 模板
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./login.ui")
...
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.ui.show()
app.exec()
将控件赋给一个已命名的变量 ,该变量即可调用控件的各种属性,例如:
self.user_name_qwidget = self.ui.lineEdit # 用户名输入框
user_name = self.user_name_qwidget.text()
if user_name == "admin"
...
多线程是属于同一个进程中的,当一个进程关闭后,所有的线程都会被关闭。因此pyqt使用多线程来管理。
在pyqt中使用多线程需要以下步骤:
首先是创建一个继承于QThread的类:
class MyThread(QThread):
def __init__(self):
super().__init__()
def run(self):
for i in range(10):
print("是MyThread线程中执行....%d" % (i + 1))
time.sleep(1)
然后创建并开始线程,注意:如果在子函数编写代码,这里的self不能省略,否则会导致my_thread被释放,线程运行被破坏;
self.my_thread = MyThread() # 创建线程
self.my_thread.start() # 开始线程
最终的参考模板:
import sys
import time
from PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThread
class MyThread(QThread):
def __init__(self):
super().__init__()
def run(self):
for i in range(10):
time.sleep(1)
class MyWin(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./thread-1.ui")
xxx.clicked.connect(self.xxx) # 绑定槽函数
def xxx(self):
self.my_thread = MyThread() # 创建线程
self.my_thread.start() # 开始线程
if __name__ == "__main__":
app = QApplication(sys.argv)
myshow = MyWin()
myshow.ui.show()
app.exec()