Einführung und grundlegende Verwendung von PyQT5

PyQt5

1. Download und Installation von PyQt5

1.1 Einführung in PyQt5

Qt (offizielle Aussprache [kju:t]) ist eine plattformübergreifende C++-Entwicklungsbibliothek, die hauptsächlich zur Entwicklung von Programmen für grafische Benutzeroberflächen (GUI) verwendet wird

Qt wird ausschließlich in C++ entwickelt. Unter normalen Umständen müssen Sie zuerst die Sprache C und dann C++ lernen, bevor Sie Qt zum Entwickeln von Programmen mit Schnittstellen verwenden können.

Dank der Open-Source-Community kann Qt auch mit Skriptsprachen wie Python, Ruby und Perl entwickelt werden.

Qt unterstützt viele Betriebssysteme, z. B. allgemeine Betriebssysteme Windows , Linux und Unix, Smartphone-Systeme Android, iOS, eingebettete Systeme usw. Man kann sagen, dass es plattformübergreifend ist

Offizielle QT-Website: https://doc.qt.io/qt-5/index.html

Entwickler von PyQt ist das britische Unternehmen „Riverbank Computing“. Es bietet GPL (einfach ausgedrückt: Sie können die online veröffentlichten Materialien im Rahmen der GPL-Vereinbarung verwenden oder ändern, aber die Materialien, die Sie ändern und dann erneut veröffentlichen, müssen auch der GPL-Vereinbarung entsprechen. Die Hauptanforderung besteht darin, dass es Open Source sein muss kann nicht gelöscht werden. (abzüglich der Erklärungsinformationen des ursprünglichen Autors usw.) und der kommerziellen Vereinbarung, sodass es für die Entwicklung freier Software verwendet werden kann.

PyQt läuft unter Microsoft Windows, Mac OS X, Linux und den meisten Unix-Varianten .

PyQt ist eine der GUI-Programmierlösungen (Graphical User Interface, kurz GUI, auch bekannt als grafische Benutzeroberfläche) in der Python-Sprache

Kann anstelle der in Python integrierten Funktionen verwendet werden Tkinter. Andere Alternativen sind usw. PyGTK, wxPythonwie Qt, PyQt ist eine freie Software

Dokumentbezogene Adresse: https://www.riverbankcomputing.com/software/pyqt/

Eine gute Referenz: https://wiki.python.org/moin/PyQt/Tutorials

  • Qt (C++-Sprach-GUI)

  • PyQt = Python + Qt-Technologie

  • Tkinter

    Die von Python offiziell übernommene Standardbibliothek hat den Vorteil, dass sie eine Python-Standardbibliothek, ein stabiles und kleineres Release-Programm ist. Der Nachteil besteht darin, dass es relativ wenige Steuerelemente gibt.

  • wxPython

    Die auf wxWidgets basierende Python-Bibliothek bietet den Vorteil umfangreicher Steuerelemente, die Nachteile sind jedoch eine relativ schlechte Stabilität, wenige Dokumente und wenige Benutzer.

  • PySide2、PyQt5

    Die auf Qt basierende Python-Bibliothek bietet die Vorteile umfangreicher Steuerelemente, guter plattformübergreifender Erfahrung, vollständiger Dokumentation und vieler Benutzer.

    Der Nachteil besteht darin, dass die Bibliothek relativ groß ist und das veröffentlichte Programm relativ groß ist.

    Der Entwickler von PyQt5 ist das britische Unternehmen „Riverbank Computing“, während PySide2 ein von Qt bereitgestelltes Spezialtool für die Python-Sprache ist.

1.2 Windows PyQt5-Installation

  1. Führen Sie den Befehl aus, um die Erstellung einer virtuellen Umgebung zu ermöglichen
pip install virtualenv
pip install virtualenvwrapper-win
  1. Erstellen Sie eine neue virtuelle Umgebung
mkvirtualenv -p python3 py3-qt --no-download
  1. Installieren Sie pyqt5 (Befehlszeile)
workon py3-qt  #切换到py3-qt环境
pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple

Bild-20230515225937502

  1. Versionstest
# 如果执行成功,没有任何错误提示,则表明环境搭建成功
from PyQt5 import QtWidgets

# 当然也可以查看PyQt版本
from PyQt5.QtCore import *


print(QT_VERSION_STR)

Bild-20230515230526200

  • pip beschleunigt die heimische Spiegelung
阿里云  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. PyQt5-Basis-Benutzeroberfläche

2.1 Das erste PyQt-Programm

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()

Bild-20230515230700956

2.2 argv

import sys

print(sys.argv)

Bild-20230515231412243

2.3 Moduleinführung

Es gibt viele Funktionsmodule in PyQt und die drei am häufigsten verwendeten Funktionsmodule in der Entwicklung:

  • QtCore : Enthält zentrale Nicht-GUI-Funktionalität. Wird hauptsächlich mit Zeit, Dateien und Ordnern, verschiedenen Daten, Streams, URLs, MIME-Klassendateien, Prozessen und Threads verwendet
  • QtGui : Enthält Fenstersystem, Ereignisbehandlung, 2D-Bilder, grundlegende Malerei, Schriftarten und Textklassen
  • QtWidgets : Enthält eine Reihe von UI-Elementen zum Erstellen von Desktop-Anwendungen

Sie können alle Module auf der offiziellen PyQt-Website einsehen, Adresse: https://www.riverbankcomputing.com/static/Docs/PyQt5/module_index.html#ref-module-index

API-Dokumentation für die spezifische Implementierung von C++, Adresse: https://doc.qt.io/qt-5/qtwidgets-module.html

Welche Funktion verwendet wird, hängt von der zugehörigen API oder der von anderen geteilten Nutzungserfahrung ab. Dies ist der schnellste Weg, dies zu lernen.

3. Grundlegende Benutzeroberfläche

Wenn alle Steuerelemente im Fenster im Fenster angezeigt werden sollen, müssen sie angeben, wer ihr Vater ist, und können nicht direkt mit der Show-Funktion angezeigt werden.

3.1 Schaltfläche 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()

Bild-20230515231855120

3.2 Text-QLabel

Der Name des darin QLabelbefindlichen Nur-Text-Steuerelements lautetPyQt5.QtWidgets

Das Klartext-Steuerelement wird nur als Logo angezeigt, ähnlich einer Beschriftungsaufforderung (Kontonummer, Passwort) vor der Eingabe von Inhalten.

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()

Bild-20230515232214756

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()

Bild-20230515232244255

3.3 Eingabefeld

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 Fenstergröße anpassen

  • Größe ändern
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 Passen Sie die Fensteranzeige an die Mitte des Bildschirms an

  • verschieben: Verschieben Sie den Bildschirm
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()

Bild-20230519234729204

3.6 Fenstersymbol festlegen

Herunterladbare Symbol-URL

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()

Bild-20230519235041396

4.Layout

Layouts in Qt sind in vier Hauptkategorien unterteilt:

  • QBoxLayout
  • QGridLayout
  • QFormLayout
  • QStackedLayout

4.1 QBoxLayout

Wörtliche Übersetzung: Box-Layout

Im Allgemeinen werden zwei Unterklassen verwendet QHBoxLayout, die QVBoxLayoutfür das horizontale und vertikale Layout verantwortlich sind

4.1.1 Vertikales Layout

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()

Bild-20230520000242070

4.1.2 Horizontales Layout

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()

Bild-20230526230756063

4.2 QGridLayout

Gitterstruktur

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()

Bild-20230526231843507

4.3 QFormLayout

Im Allgemeinen zum Senden von Datenformularformularen geeignet . Zum Beispiel: Anmeldung, Registrierung ähnliche Szenarien

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()

Bild-20230526232028808

4.4 Schubladenanordnung

Es wird ein mehrseitiges Schaltlayout bereitgestellt, und es ist immer nur eine Schnittstelle gleichzeitig sichtbar. Schubladenanordnung

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()

Bild-20230526232309149

5. Fenster

5.1 Klassifizierung

In Qt gibt es drei Möglichkeiten, ein Fenster zu generieren: QWidget| QMainWindow|QDialog

  1. QWidget

Die übergeordnete Klasse von Steuerelementen und Fenstern mit einem hohen Freiheitsgrad (nichts) und keiner Unterteilung in Menüs, Symbolleisten, Statusleisten, Hauptfenster und andere Bereiche

  1. QMainWindow

Es handelt sich um QWidgeteine Unterklasse, einschließlich Menüleiste, Symbolleiste, Statusleiste, Titelleiste usw. Der mittlere Teil ist der Hauptfensterbereich

  1. QDialog

Basisklasse für Dialogfenster

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()

Bild-20230526232850921

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()

Bild-20230526233306456

5.3 QDialog

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()

Bild-20230526233352946

6. Signale und Slots

6.1 Einführung in Signale und Slots

1. Beschreibung
Signale und Slots sind der Kerninhalt von Qt

  1. Ein Signal
    ist eigentlich ein Ereignis (Schaltflächenklick, Inhaltsänderung, Fensterschließereignis) oder ein Zustand (Häkchen ist ausgewählt, Umschalttaste wechselt).

Wenn das Programm einen bestimmten Zustand auslöst oder ein bestimmtes Ereignis eintritt (z. B. Klicken auf die Schaltfläche, Änderung des Inhalts usw.), kann ein Signal ausgegeben werden.

  1. Wenn Sie dieses Signal
    erfassen und dann den entsprechenden Logikcode ausführen möchten, müssen Sie den Steckplatz verwenden. Der Steckplatz ist eigentlich eine Funktion. Wenn das Signal ausgegeben wird, wird die daran gebundene Steckplatzfunktion ausgeführt.

  2. Signale und Slots verknüpfen
    Um beim Klicken auf eine Schaltfläche eine bestimmte Logik zu implementieren, müssen bestimmte Signale und bestimmte Slot-Funktionen miteinander verknüpft werden.

Der allgemeine Betriebsablauf ist wie folgt

对象.信号.connect(槽函数)

Bild

当出现了某一种信号(某一种事件)的时候,我们需要执行一段代码(用函数来包装这份代码。)

Lösung

信号和槽

6.2 Fall

Funktion: Signal empfangen

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()

Bild-20230526234343799

6.3 Benutzerdefinierte Signale

Zusätzlich zum Empfang der mit Qt einhergehenden Signale können wir auch unsere eigenen Signale definieren und zum richtigen Zeitpunkt Signale aussenden.

Zur Deklaration des Signals müssen benutzerdefinierte Signale pyqtSignalverwendet , die außerhalb der Funktionen in der Klasse deklariert werden müssen

Wenn Sie das Signal anpassen können, sind Signal und Steckplatz grundsätzlich gemastert. Andernfalls erhalten Sie immer Signale, die von anderen gesendet werden.

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()

Bild-20230526235615971

7.Qt-Designer

7.1 Einführung

Die Effizienz beim reinen Code-Schreiben der Schnittstelle ist etwas gering. Heutzutage verwenden wir eine andere Software, um beim Grafikdesign zu helfenQT Designer

7.2 Herunterladen

Mac-Version: [http://download.codetutor.top/software/Mac/Qt%20Designer.dmg](http://download.codetutor.top/software/Mac/Qt Designer.dmg)

Windows-Version: [http://download.codetutor.top/software/win/Qt%20Designer%20Setup.exe](http://download.codetutor.top/software/win/Qt Designer Setup.exe)

7.3 Installation und Betrieb

Der Installationsvorgang ist sehr einfach. Befolgen Sie einfach die normale Softwareinstallation. Das Bild nach der Installation ist wie folgt:

Bild-20201123214407351

Benutzer der Mac-Plattform sollten jedoch beim Ausführen auf die folgenden Probleme achten :

Bild

Problemumgehung : Halten Sie im Ordner „Programme“ controldie Taste gedrückt und führen Sie dann den Befehl aus. Sie müssen es nur zum ersten Mal auf diese Weise ausführen und es dann wie eine normale Software öffnen.

Bild-20201123214951153

7.4 Verwendung von QT Designer

Der Effekt nach der Ausführung auf dem Mac ist wie folgt:

Bild-20201123215209758

7.5 Nutzungsprozess

1. Erstellen Sie eine Schnittstelle basierend auf QWidget

Bild-20201123215321248

2. Zu diesem Zeitpunkt wird ein neues Fenster mit folgendem Effekt erstellt

Bild-20201123215359517

3. Ziehen Sie das gewünschte Steuerelement

Bild-20201123215551661

4. Wählen Sie das Steuerelement aus und sehen Sie sich die Eigenschaften an

Bild-20201123215750887

5. Attribute ändern

Bild-20201123215829602

6. Was soll ich tun, wenn ich das Grundstück und andere Fenster nicht sehe? Schauen Sie sich das Bild unten an

Bild-20201123220059274

7. Signale und Slots (wenn Sie den Singal/Slot-Editor nicht sehen, befolgen Sie bitte den vorherigen Schritt, um ihn anzuzeigen)

Bild-20201123220951729

8. Vorschaueffekt

Bild-20201123221137373

9.Speichern

Bild-20201123221409036

10. Python-Code- test.uiNutzungsdateien

Um die UI-Datei zu laden, müssen Sie uicdas Modul importieren, das sich PyQt5in befindet

"""
动态加载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()

Bild-20201123221857466

Verweise

www.itprojects.cn

Ich denke du magst

Origin blog.csdn.net/weixin_42917352/article/details/131257796
Empfohlen
Rangfolge