Annuaire d'articles
PyQt5
1. Téléchargement et installation de PyQt5
1.1 Introduction à PyQt5
Qt (prononciation officielle [kju:t]
) est une bibliothèque de développement C++ multiplateforme, principalement utilisée pour développer des programmes d'interface utilisateur graphique (GUI).
Qt est développé uniquement en C++. Dans des circonstances normales, vous devez d'abord apprendre le langage C, puis apprendre le C++ avant de pouvoir utiliser Qt pour développer des programmes avec des interfaces.
Grâce à la communauté open source, Qt peut également être développé avec des langages de script tels que Python, Ruby et Perl.
Qt prend en charge de nombreux systèmes d'exploitation, tels que les systèmes d'exploitation généraux Windows, Linux et Unix, les systèmes de smartphones Android, iOS, les systèmes embarqués, etc. On peut dire que c'est multiplateforme
Site officiel de QT : https://doc.qt.io/qt-5/index.html
Le développeur de PyQt est la société britannique « Riverbank Computing ». Il fournit la GPL (en termes simples, vous pouvez utiliser ou modifier les documents publiés en ligne sous l'accord GPL, mais les documents que vous modifiez puis rééditez doivent également être conformes à l'accord GPL. La principale exigence est qu'ils doivent être open source et ne peut pas être supprimé (moins les informations de la déclaration de l'auteur original, etc.) et l'accord commercial, il peut donc être utilisé pour le développement de logiciels libres.
PyQt fonctionne sous Microsoft Windows, Mac OS X, Linux et la plupart des variantes d'Unix .
PyQt est l'une des solutions de programmation GUI (Graphical User Interface, GUI en abrégé, également connue sous le nom d'interface utilisateur graphique) dans le langage Python.
Peut être utilisé à la place de ceux intégrés à Python Tkinter
. D'autres alternatives incluent PyGTK
, wxPython
etc., comme Qt, PyQt est un logiciel gratuit
Adresse relative au document : https://www.riverbankcomputing.com/software/pyqt/
Un bon matériel de référence : https://wiki.python.org/moin/PyQt/Tutorials
-
Qt (interface graphique du langage C++)
-
PyQt = Python + technologie Qt
-
Tkinter
La bibliothèque standard officiellement adoptée par Python a l'avantage d'être une bibliothèque standard Python, stable et de version plus petite. L'inconvénient est qu'il y a relativement peu de contrôles.
-
wxPython
La bibliothèque Python basée sur wxWidgets présente l'avantage de contrôles riches, mais les inconvénients sont une stabilité relativement faible, peu de documents et peu d'utilisateurs.
-
PySide2、PyQt5
La bibliothèque Python basée sur Qt présente les avantages de contrôles riches, d'une bonne expérience multiplateforme, d'une documentation complète et de nombreux utilisateurs.
L'inconvénient est que la bibliothèque est relativement grande et que le programme publié est relativement volumineux.
Le développeur de PyQt5 est la société britannique « Riverbank Computing », tandis que PySide2 est un outil spécialisé fourni par Qt pour le langage Python.
1.2 Installation de Windows PyQt5
- Exécutez la commande pour permettre la création d'un environnement virtuel
pip install virtualenv
pip install virtualenvwrapper-win
- Créer un nouvel environnement virtuel
mkvirtualenv -p python3 py3-qt --no-download
- Installer pyqt5 (ligne de commande)
workon py3-qt #切换到py3-qt环境
pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
- Test de versions
# 如果执行成功,没有任何错误提示,则表明环境搭建成功
from PyQt5 import QtWidgets
# 当然也可以查看PyQt版本
from PyQt5.QtCore import *
print(QT_VERSION_STR)
- pip accélère la mise en miroir domestique
阿里云 https://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) https://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 https://pypi.mirrors.ustc.edu.cn/simple/
2.Interface utilisateur de base de PyQt5
2.1 Le premier programme PyQt
import sys
from PyQt5.QtWidgets import QApplication, QWidget # 1.导入模块
if __name__ == '__main__':
# 2.创建一个 QApplication 对象,指向QApplication ,接受命令行参数
app = QApplication(sys.argv)
# 3. 创建一个 QWidget对象
w = QWidget()
# 4. 设置窗口标题
w.setWindowTitle("第一个PyQt")
# 5. 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
2.2 Argv
import sys
print(sys.argv)
2.3 Présentation du module
Il existe de nombreux modules fonctionnels dans PyQt. Il existe trois modules fonctionnels principaux qui sont les plus couramment utilisés en développement :
- QtCore : contient les fonctions principales non graphiques. Principalement utilisé avec le temps, les fichiers et dossiers, diverses données, flux, URL, fichiers de classe MIME, processus et threads
- QtGui : inclut le système de fenêtres, la gestion des événements, les images 2D, la peinture de base, les polices et les classes de texte
- QtWidgets : Contient une série d'éléments d'interface utilisateur pour créer des applications de bureau
Vous pouvez vous référer à tous les modules sur le site officiel de PyQt, adresse : https://www.riverbankcomputing.com/static/Docs/PyQt5/module_index.html#ref-module-index
Documentation de l'API d'implémentation spécifique C++, adresse : https://doc.qt.io/qt-5/qtwidgets-module.html
La fonction utilisée dépend de son API associée ou de l'expérience d'utilisation partagée par d'autres. C'est le moyen le plus rapide d'apprendre.
3.Interface utilisateur de base
Si tous les contrôles de la fenêtre veulent être affichés dans la fenêtre, ils doivent indiquer qui est leur père et ne peuvent pas être affichés directement à l'aide de la fonction show.
3.1 Bouton QPushButton
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt程序")
# 在窗口里面添加控件
btn = QPushButton("按钮")
# 设置按钮的父亲是当前窗口,等于是添加到窗口中显示
btn.setParent(w)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
3.2 Texte QLabel
Le nom du contrôle en texte brut se QLabel
trouve PyQt5.QtWidgets
à l'intérieur
Le contrôle en texte brut s'affiche uniquement sous forme de logo, semblable à une invite d'étiquette (numéro de compte, mot de passe) avant de saisir le contenu.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt")
# # 下面创建一个Label,然后调用方法指定父类
# label = QLabel("账号: ", w)
# # 设置父对象
# label.setParent(w)
# 下面创建一个Label(纯文本),在创建的时候指定了父对象
label = QLabel("账号: ", w)
# 显示位置与大小 : x, y , w, h
label.setGeometry(20, 20, 30, 30)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt")
# # 下面创建一个Label,然后调用方法指定父类
# label = QLabel("账号: ", w)
# 设置父对象
# label.setParent(w)
# 下面创建一个Label(纯文本),在创建的时候指定了父对象
label = QLabel("账号: ", w)
# 显示位置与大小 : x, y , w, h
label.setGeometry(20, 20, 30, 30)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
3.3 Zone de saisie
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt")
# 纯文本
label = QLabel("账号", w)
label.setGeometry(20, 20, 30, 20)
# 文本框
edit = QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(55, 20, 200, 20)
# 在窗口里面添加控件
btn = QPushButton("注册", w)
# x,y,w,h
btn.setGeometry(50, 80, 70, 30)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
3.4 Ajuster la taille de la fenêtre
- redimensionner
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt5程序")
# 窗口的大小
w.resize(500,500)
# 纯文本
label = QLabel("账号", w)
# 设置位置x,y,w,h
label.setGeometry(20, 20, 30, 20)
# 文本框
edit = QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(55, 20, 200, 20)
# 在窗口里面添加控件
btn = QPushButton("注册", w)
btn.setGeometry(50, 80, 70, 30)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
3.5 Ajuster l'affichage de la fenêtre au milieu de l'écran
- move : déplacer l'écran
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QLineEdit,QDesktopWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
w = QWidget()
# 设置窗口标题
w.setWindowTitle("第一个PyQt5程序")
# 窗口的大小
w.resize(500,500)
# 调整到左上角
# w.move(0,0)
# 获取屏幕中心点
center = QDesktopWidget().availableGeometry().center()
print("center:",center)
x = center.x()
y = center.y()
# print(x/2,y/2)
w.move(x//2,y//2)
# 纯文本
print(w.frameSize())
print(w.frameGeometry())
print(w.frameGeometry().getRect())
# 居中显示
old_x,old_y,width,height = w.frameGeometry().getRect()
w.move(x-width//2,y-height//2)
label = QLabel("账号", w)
# 设置位置x,y,w,h
label.setGeometry(20, 20, 30, 20)
# 文本框
edit = QLineEdit(w)
edit.setPlaceholderText("请输入账号")
edit.setGeometry(55, 20, 200, 20)
# 在窗口里面添加控件
btn = QPushButton("注册", w)
btn.setGeometry(50, 80, 70, 30)
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
3.6 Définir l'icône de la fenêtre
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建一个QWidget
w = QWidget()
# 设置标题
w.setWindowTitle("看看我图标帅吗")
# 设置图标
w.setWindowIcon(QIcon('test.jpg'))
# 显示QWidget
w.show()
app.exec()
4.Mise en page
Les mises en page dans Qt sont divisées en quatre grandes catégories :
- QBoxLayout
- QGridLayout
- QFormLayout
- QStackedLayout
4.1 QBoxLayout
Traduction littérale : disposition en boîte
Utilisez généralement ses deux sous-classes QHBoxLayout
et QVBoxLayout
sont responsables de la disposition horizontale et verticale
4.1.1 Disposition verticale
import sys
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPushButton, QGroupBox, QMainWindow
from PyQt5.QtCore import Qt
class MyWindow(QWidget):
def __init__(self):
# 切记一定要调用父类的__init__方法,因为它里面有很多对UI空间的初始化操作
super().__init__()
# 设置大小
self.resize(300, 300)
# 设置标题
self.setWindowTitle("垂直布局")
# 垂直布局
layout = QVBoxLayout()
# 作用是在布局器中增加一个伸缩量,里面的参数表示QSpacerItem的个数,默认值为零
# 会将你放在layout中的空间压缩成默认的大小
# 下面的笔试1:1:1:2 : 2
layout.addStretch(1)
# 按钮1
btn1 = QPushButton("按钮1")
# 添加到布局器中
# layout.addWidget(btn1, Qt.AlignmentFlag.AlignTop)
layout.addWidget(btn1)
layout.addStretch(1)
# 按钮2
btn2 = QPushButton("按钮2")
# 添加到布局器
layout.addWidget(btn2)
layout.addStretch(1)
# 按钮3
btn3 = QPushButton("按钮3")
# 添加到布局器
layout.addWidget(btn3)
layout.addStretch(2)
btn4 = QPushButton("按钮4")
# 添加到布局器
layout.addWidget(btn4)
layout.addStretch(2)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
# 创建一个QWidget子类
w = MyWindow()
w.show()
app.exec()
4.1.2 Disposition horizontale
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)
# 音乐标签
music_box = QGroupBox("音乐")
m_layout = QHBoxLayout()
btn6 = QRadioButton("古风")
btn7 = QRadioButton("流行")
m_layout.addWidget(btn6)
m_layout.addWidget(btn7)
music_box.setLayout(m_layout)
container.addWidget(music_box)
# 设置窗口显示的内容是最外层容器
self.setLayout(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
4.2 QGridLayout
disposition de la grille
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()
4.3 QFormLayout
Généralement adapté à la soumission de formulaires de données . Par exemple : connexion, enregistrement, scénarios similaires
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QVBoxLayout, QFormLayout, QLineEdit, QPushButton, QApplication, QWidget
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 设定当前Widget的宽高(可以拉伸大小)
# self.resize(300, 200)
# 禁止改变宽高(不可以拉伸)
self.setFixedSize(300, 150)
# 外层容器
container = QVBoxLayout()
# 表单容器
form_layout = QFormLayout()
# 创建1个输入框
edit = QLineEdit()
edit.setPlaceholderText("请输入账号")
form_layout.addRow("账号:", edit)
# 创建另外1个输入框
edit2 = QLineEdit()
edit2.setPlaceholderText("请输入密码")
form_layout.addRow("密码:", edit2)
# 将from_layout添加到垂直布局器中
container.addLayout(form_layout)
# 按钮
login_btn = QPushButton("登录")
login_btn.setFixedSize(100, 30)
# 把按钮添加到容器中,并且指定它的对齐方式
container.addWidget(login_btn, alignment=Qt.AlignRight)
# 设置当前Widget的布局器,从而显示这个布局器中的子控件
self.setLayout(container)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
4.4 Disposition des tiroirs
Une disposition de commutation sur plusieurs pages est fournie et une seule interface peut être vue à la fois. disposition des tiroirs
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QStackedLayout, QLabel
class Window1(QWidget):
def __init__(self):
super().__init__()
QLabel("我辈岂是蓬蒿人", self)
self.setStyleSheet("background-color:green;")
class Window2(QWidget):
def __init__(self):
super().__init__()
QLabel("人生得以须尽欢", self)
self.setStyleSheet("background-color:red;")
class MyWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.create_stacked_layout()
self.init_ui()
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)
def init_ui(self):
# 设置Widget大小以及固定宽高
self.setFixedSize(300, 270)
# 1. 创建整体的布局器
container = QVBoxLayout()
# 2. 创建1个要显示具体内容的子Widget
widget = QWidget()
widget.setLayout(self.stacked_layout)
widget.setStyleSheet("background-color:grey;")
# 3. 创建2个按钮,用来点击进行切换抽屉布局器中的Widget
btn_press1 = QPushButton("抽屉1")
btn_press2 = QPushButton("抽屉2")
# 给按钮添加事件(即点击后要调用的函数)
btn_press1.clicked.connect(self.btn_press1_clicked)
btn_press2.clicked.connect(self.btn_press2_clicked)
# 4. 将需要显示的空间添加到布局器中
container.addWidget(widget)
container.addWidget(btn_press1)
container.addWidget(btn_press2)
# 5. 设置当前要显示的Widget,从而能够显示这个布局器中的控件
self.setLayout(container)
def btn_press1_clicked(self):
# 设置抽屉布局器的当前索引值,即可切换显示哪个Widget
self.stacked_layout.setCurrentIndex(0)
def btn_press2_clicked(self):
# 设置抽屉布局器的当前索引值,即可切换显示哪个Widget
self.stacked_layout.setCurrentIndex(1)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MyWindow()
win.show()
app.exec()
5. fenêtre
5.1 Classement
Dans Qt, il existe trois manières de générer une fenêtre : QWidget
| QMainWindow
|QDialog
- QWidget
La classe parent des contrôles et des fenêtres, avec un haut degré de liberté (rien), et aucune division des menus, barres d'outils, barres d'état, fenêtres principales, etc.
- QFenêtreMain
Oui, QWidget
sous-classe, y compris la barre de menus, la barre d'outils, la barre d'état, la barre de titre, etc. La partie centrale est la zone de la fenêtre principale
- QDialogue
Classe de base pour les fenêtres de dialogue
5.2 QWidget
import sys
from PyQt5.QtWidgets import QWidget, QLabel , QApplication
class mywnd(QWidget):
def __init__(self):
super(mywnd, self).__init__()
self.initUI()
def initUI(self):
label = QLabel("这是文字~~" )
label.setStyleSheet("font-size:30px;color:red")
label.setParent(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = mywnd()
#设置窗口标题
w.setWindowTitle("qwidget")
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
5.2 QMainWindow
import sys
from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
label = QLabel("这是文字~~")
label.setStyleSheet("font-size:30px;color:red")
# 调用父类中的menuBar,从而对菜单栏进行操作
menu = self.menuBar()
# 如果是Mac的话,菜单栏不会在Window中显示而是屏幕顶部系统菜单栏位置
# 下面这一行代码使得Mac也按照Windows的那种方式在Window中显示Menu
menu.setNativeMenuBar(False)
file_menu = menu.addMenu("文件")
file_menu.addAction("新建")
file_menu.addAction("打开")
file_menu.addAction("保存")
edit_menu = menu.addMenu("编辑")
edit_menu.addAction("复制")
edit_menu.addAction("粘贴")
edit_menu.addAction("剪切")
# 设置中心内容显示
self.setCentralWidget(label)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
# 设置窗口标题
w.setWindowTitle("我是窗口标题....")
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
5.3 QDialogue
import sys
from PyQt5.QtWidgets import QDialog, QPushButton, QApplication
class MyDialog(QDialog):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
ok_btn = QPushButton("确定", self)
ok_btn.setGeometry(50, 50, 100, 30)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyDialog()
# 设置窗口标题
w.setWindowTitle("对话框")
# 展示窗口
w.show()
# 程序进行循环等待状态
app.exec()
6. Signaux et emplacements
6.1 Introduction aux signaux et aux slots
1. Description
Les signaux et les slots constituent le contenu principal de Qt
- Un signal
est en fait un événement (clic sur un bouton, changement de contenu, événement de fermeture de fenêtre) ou un état (une coche est sélectionnée, des commutateurs à bascule.)
Lorsque le programme déclenche un certain état ou qu'un certain événement se produit (par exemple : le bouton est cliqué, le contenu change, etc.), alors un signal peut être émis.
-
Si vous souhaitez capturer ce signal
puis exécuter le code logique correspondant, vous devez utiliser le slot. Le slot est en fait une fonction. Lorsque le signal est émis, la fonction slot qui lui est liée sera exécutée. -
Lier les signaux et les emplacements
Afin d'implémenter une certaine logique lorsqu'un bouton est cliqué, des signaux spécifiques et des fonctions d'emplacement spécifiques doivent être liés ensemble.
Le processus de fonctionnement général est le suivant
对象.信号.connect(槽函数)
当出现了某一种信号(某一种事件)的时候,我们需要执行一段代码(用函数来包装这份代码。)
Solution
信号和槽
6.2 Cas
Fonction: recevoir le signal
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 更改当前Widge的宽高
self.resize(500, 300)
# 创建一个按钮
btn = QPushButton("点我点我", self)
# 设置窗口位置、宽高
btn.setGeometry(200, 200, 100, 30)
# 将按钮被点击时触发的信号与我们定义的函数(方法)进行绑定
# 注意:这里没有(),即写函数的名字,而不是名字()
btn.clicked.connect(self.click_my_btn)
def click_my_btn(self, arg):
# 槽函数,点击按钮则调用该函数
# 这里的参数正好是信号发出,传递的参数
print("点击按钮啦~", arg)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
6.3 Signal personnalisé
En plus de recevoir les signaux fournis avec Qt, nous pouvons également définir nos propres signaux et émettre des signaux au bon moment.
Des signaux personnalisés doivent être pyqtSignal
utilisés déclarer le signal, et ils doivent être déclarés en dehors des fonctions de la classe
Si vous pouvez personnaliser les signaux, vous pouvez essentiellement maîtriser les signaux et les emplacements. Sinon, vous ne recevrez pour toujours que des signaux des autres.
import sys
import time
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MyWindow(QWidget):
# 声明一个信号 只能放在函数的外面
my_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.init_ui()
self.msg_history = list() # 用来存放消息
def init_ui(self):
self.resize(500, 200)
# 创建一个整体布局器
container = QVBoxLayout()
# 用来显示检测到漏洞的信息
self.msg = QLabel("")
self.msg.resize(440, 15)
# print(self.msg.frameSize())
self.msg.setWordWrap(True) # 自动换行
self.msg.setAlignment(Qt.AlignCenter) # 靠上
self.msg.setStyleSheet("background-color: yellow; color: red;")
# 创建一个滚动对象
scroll = QScrollArea()
scroll.setWidget(self.msg)
# 创建垂直布局器,用来添加自动滚动条
v_layout = QVBoxLayout()
v_layout.addWidget(scroll)
# 创建水平布局器
h_layout = QHBoxLayout()
btn = QPushButton("开始检测", self)
# 绑定按钮的点击,点击按钮则开始检测
btn.clicked.connect(self.check)
h_layout.addStretch(1) # 伸缩器
h_layout.addWidget(btn)
h_layout.addStretch(1)
# 操作将要显示的控件以及子布局器添加到container
container.addLayout(v_layout)
container.addLayout(h_layout)
# 设置布局器
self.setLayout(container)
# 绑定信号和槽
self.my_signal.connect(self.my_slot)
def my_slot(self, msg):
# 更新内容
print(msg)
self.msg_history.append(msg)
self.msg.setText("<br>".join(self.msg_history))
self.msg.resize(440, self.msg.frameSize().height() + 15)
self.msg.repaint() # 更新内容,如果不更新可能没有显示新内容
def check(self):
for i, ip in enumerate(["192.168.1.%d" % x for x in range(1, 255)]):
msg = "模拟,正在检查 %s 上的漏洞...." % ip
# print(msg)
if i % 5 == 3:
# 表示发射信号 对象.信号.发射(参数)
self.my_signal.emit(msg + "【发现漏洞】")
time.sleep(0.01)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
w.show()
app.exec()
7.Concepteur Qt
7.1 Présentation
L'efficacité de l'écriture d'interfaces uniquement par code est très faible. Aujourd'hui, nous utilisons un autre logiciel graphique pour aider à la conception.QT Designer
Téléchargement 7.2
Version Mac : [http://download.codetutor.top/software/Mac/Qt%20Designer.dmg](http://download.codetutor.top/software/Mac/Qt Designer.dmg)
Version Windows : [http://download.codetutor.top/software/win/Qt%20Designer%20Setup.exe](http://download.codetutor.top/software/win/Qt Designer Setup.exe)
7.3 Installation et fonctionnement
Le processus d'installation est très simple, suivez simplement l'installation normale du logiciel. L'image après l'installation est la suivante :
Cependant, les utilisateurs de la plateforme Mac doivent prêter attention aux problèmes suivants lors de l'exécution :
Solution de contournement : Dans le dossier Applications, maintenez control
la touche enfoncée puis exécutez. Il vous suffit de l'exécuter de cette façon pour la première fois, puis de l'ouvrir comme un logiciel ordinaire.
7.4 Utilisation du Concepteur QT
L'effet une fois le Mac exécuté est le suivant :
7.5 Processus d'utilisation
1. Créez une interface basée sur QWidget
2. Une nouvelle fenêtre sera créée à ce moment, avec l'effet suivant
3. Faites glisser le contrôle souhaité
4. Sélectionnez le contrôle et consultez les propriétés
5. Modifier les attributs
6. Que dois-je faire si je ne vois pas la propriété et les autres fenêtres ? Regardez l'image ci-dessous
7. Signaux et slots (si vous ne voyez pas l'éditeur Singal/Slot, veuillez suivre l'étape précédente pour l'afficher)
8. Effet de prévisualisation
9.Enregistrer
10. Le code Python utilise test.ui
des fichiers
Pour charger le fichier ui, vous devez importer uic
le module, qui se trouve PyQt5
dans
"""
动态加载ui文件
"""
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = uic.loadUi("./test.ui")
# 展示窗口
ui.show()
app.exec()