首页 >> 大全

手把手教你学习PyQT5:打造精美、功能强大的桌面应用程序(更新中。。)

2023-06-18 大全 89 作者:考证青年

目录 二、QT 三、PyQt5基本窗口控件(QMain 、、、、、、、菜单、工具栏、) 3-5、添加伙伴关系、-6、介绍 3-7、介绍 四、PyQt5高级组件(、、容器、多线程等) 五、PyQt5布局管理(、、、嵌套布局) 六、PyQt5信号与槽(事件处理、数据传递等)以及关联控件、、、等 七、PyQt5高级控件(滑块控件、计数器控件、树控件、) 7-4、控件7-5、堆栈窗口控件()7-6、停靠控件 八、PyQt5图形与特效(定制窗口风格、绘图、QSS与UI美化、不规则窗口、设置样式等)九、PyQt5扩展应用(制作PyQt5安装程序、数据处理、第三方图绘图库在PyQt5中的应用、UI自动化测试等)总结

前言 PyQt5是一个用于创建图形用户界面(GUI)的库。它是基于Qt库的,Qt是一个用于创建跨平台应用程序的C++库。PyQt5允许开发人员使用语言创建功能强大的应用程序一、PyQt5介绍&开发环境安装&简单案例分析 1-1、PyQt5的介绍

PyQt5是一个用于创建图形用户界面(GUI)的库。它是基于Qt库的,Qt是一个用于创建跨平台应用程序的C++库。PyQt5允许开发人员使用语言创建功能强大的应用程序。使用开发的优点是高效

PyQt5包括了许多工具,允许开发人员创建多种不同类型的用户界面,如对话框,下拉菜单,工具栏,按钮,文本框等。它还支持使用鼠标和键盘进行交互,以及使用图像和声音等多媒体内容。以下为详细介绍:

总的来说,PyQt5是一个功能强大,易于使用的工具,可以帮助开发人员创建高质量的图形用户界面。如果您正在寻找一种用于创建图形用户界面的库,那么PyQt5可能是一个不错的选择。

1-2、开发环境安装

# 先装好IDE,推荐Pycharm,之后安装python包和PyQt5包。
pip install python
pip install PyQt5

1-3、简单案例分析

import sys
from PyQt5.QtWidgets import QApplication, QWidgetif __name__ == '__main__':# 创建Qt应用程序实例app = QApplication(sys.argv)# 创建一个QWidget对象,作为主窗口w = QWidget()w.resize(250, 150)w.move(300, 300)w.setWindowTitle('Simple')w.show()# 运行Qt应用程序sys.exit(app.exec_())

以下是代码的详细解释:

二、QT 2-1、安装和配置

pip install pyqt5-tools

安装之后可以在目录下找到.exe, 我的文件在D:\\\Lib\site-\\Qt\bin

之后直接可以在Tools-》 Tools中看到QT

2-2、QT 基础入门

打开QT 后,我们先创建一个Main 用来存放所有组件。

界面的简单介绍

2-3、ui文件转换为文件

方法一:直接使用命令行转换,demo.ui为保存的ui名,demo.py为ui转换为的文件。

python -m PyQt5.uic.pyuic demo.ui -o demo.py

转换为的代码如下所示:

三、PyQt5基本窗口控件(QMain 、、、、、、、菜单、工具栏、) 3-0、QMain

是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。在中,中心窗口是最重要的部分,它可以是任何Qt窗口部件,如、、等。

可以通过Qt 进行设计和布局,也可以通过代码进行创建和配置。在使用Qt 时,可以拖放各种窗口部件到中,然后通过属性编辑器进行属性设置。在使用代码时,可以通过构造函数或者成员函数进行设置。

的一些常用成员函数包括:

总的来说,是一个非常强大的窗口部件,它可以用于创建各种类型的应用程序界面,如主窗口应用程序、多文档应用程序等。我们通常创建的是这个窗口

3-1、

总之,是Qt框架中所有用户界面部件的基类,提供了基本的用户界面功能,包括绘制、事件处理、布局等。它是Qt框架中非常重要和常用的部件之一,对于Qt开发者来说是必须要熟练掌握的。

3-2、QMain 、、的区别

是Qt框架中所有用户界面部件的基类,包括窗口、对话框、按钮、标签、文本框、图形视图等等,它提供了基本的用户界面功能,例如绘制、事件处理、布局等。而是的子类,是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。具体来说,与的区别如下:

总的来说,和都是Qt框架中非常重要的用户界面部件,用于创建不同类型的界面。提供了基本的用户界面功能,适用于创建各种类型的窗口和控件,而则提供了应用程序主窗口的各种功能,适用于创建包含菜单栏、工具栏、状态栏等的应用程序主窗口。

总结:

: 是对话窗口的基类,没有菜单栏、工具栏、状态栏。

: 可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的形式。

: 不确定窗口的用途,就使用。

3-3、控件

PyQt中的控件是一种用于布局的空白控件。

3-4、、

和都是Qt框架中常用的用户界面控件,用于在图形用户界面(GUI)中显示文本信息和接受用户输入。以下是它们的介绍:

3-4-1、介绍

是一个显示文本或图像的控件,它通常被用于显示静态文本信息。可以通过设置其文本、字体、颜色、对齐方式等属性来自定义标签的样式和布局。可以将放置在主窗口、对话框或其他控件上,以便在应用程序中提供帮助文本、说明、状态消息等。

方法:

属性:

3-4-2、简单案例分析

以下是一个简单的例子,展示如何创建一个控件并设置它的一些属性:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtCore import Qtclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建一个QLabel控件并设置文本内容label1 = QLabel('Hello, PyQt5!', self)label1.move(15, 10)# 创建一个QLabel控件并设置图像内容label2 = QLabel(self)pixmap = QPixmap('蓝色背景光柱.png')label2.setPixmap(pixmap)label2.move(15, 40)# 设置对齐方式label3 = QLabel(self)label3.setText('Align Center')label3.setAlignment(Qt.AlignCenter)label3.move(15, 160)# 设置字体和颜色label4 = QLabel(self)label4.setText('Font and Color')label4.setFont(QFont('Arial', 20))label4.setStyleSheet('color: red')label4.move(15, 190)self.setGeometry(300, 300, 250, 250)self.setWindowTitle('QLabel Example')self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

3-4-3、案例:使用信号(详细介绍请见第六章)

以下是控件的常用信号:

以下是一个简单的例子,演示如何使用信号:

import sys
from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QUrlclass Example(QLabel):def __init__(self):super().__init__()self.setText('Google')self.setOpenExternalLinks(True)# 绑定到指定的事件函数。# 点击后触发打开链接!self.linkActivated.connect(self.openLink)def openLink(self, url):QDesktopServices.openUrl(QUrl(url))if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()ex.show()sys.exit(app.exec_())

3-4-4、介绍

是一个用于接收用户输入的单行文本编辑控件,它允许用户输入和编辑文本信息。可以设置的输入格式,例如只允许输入数字、字母或特定字符,或者限制输入的最大长度。可以使用信号和槽机制来处理用户输入的文本,以便在应用程序中执行特定的操作或验证用户输入的有效性。

总的来说,和是Qt框架中非常实用的控件,它们可以为应用程序提供各种形式的文本输入和输出。

下图为添加了和的:

下面是控件的一些常用属性和方法:

3-4-5、简单案例

下面是一个简单的例子,演示如何创建一个控件并将其添加到窗口中:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QVBoxLayoutclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建QLabel控件和QLineEdit控件nameLabel = QLabel('Name:')nameEdit = QLineEdit()# QLineEdit控件有三种回显模式,用于指定文本框中的内容如何显示:# Normal:默认的回显模式,输入的文本会直接显示在文本框中。# Password:将输入的文本用星号或其他字符替代,用于密码输入等场景。可以使用setEchoChar(char)方法来指定用于替代文本的字符,默认情况下使用星号。# NoEcho:不显示输入的文本,用于输入敏感信息等场景。可以使用setEchoMode(QLineEdit.NoEcho)方法来指定回显模式为NoEcho。# 下边为示例:# 设置回显模式为密码模式nameEdit.setEchoMode(QLineEdit.Password)# 创建垂直布局,并将控件添加到布局中vbox = QVBoxLayout()vbox.addWidget(nameLabel)vbox.addWidget(nameEdit)# 设置窗口布局和大小self.setLayout(vbox)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('QLineEdit Example')self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

3-4-6、案例:添加校验器

限制输入:控件添加校验器

控件可以使用校验器来限制输入,常见的校验器有(整数校验器)、(浮点数校验器)和(正则表达式校验器)等。

下面是一个使用校验器和表单布局的示例代码,用于限制用户只能输入整数:


import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QFormLayout, QIntValidatorclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建QLabel控件和QLineEdit控件nameLabel = QLabel('Name:')nameEdit = QLineEdit()# 创建整数校验器,并将其应用于QLineEdit控件intValidator = QIntValidator()nameEdit.setValidator(intValidator)# 创建表单布局,并将控件添加到布局中formLayout = QFormLayout()formLayout.addRow(nameLabel, nameEdit)# 设置窗口布局和大小self.setLayout(formLayout)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('QLineEdit Example')self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

以下为输出的图示:

在这个例子中,我们创建了一个整数校验器,并将其应用于控件,这样用户只能输入整数。然后,我们使用表单布局来组织控件,并将控件添加到布局中。最后,设置窗口布局和大小,并显示窗口。

使用校验器可以有效地限制用户的输入,避免非法输入导致程序崩溃或产生错误结果。同时,表单布局也可以方便地组织控件,使界面更加美观和易用。

3-4-7、综合案例

下面是一个使用控件的综合案例,包含以下内容:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QMessageBox, QVBoxLayout, QWidget
from PyQt5.QtGui import QDoubleValidatorclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建QLabel控件和QLineEdit控件self.label = QLabel('Enter a number:', self)self.lineedit = QLineEdit(self)# 设置默认值和浮点数校验器self.lineedit.setText('0.0')validator = QDoubleValidator()self.lineedit.setValidator(validator)# 创建QPushButton控件self.button = QPushButton('Calculate', self)self.button.setToolTip('Click to calculate the square of the input value')self.button.clicked.connect(self.calculate)# 设置控件布局vbox = QVBoxLayout()vbox.addWidget(self.label)vbox.addWidget(self.lineedit)vbox.addWidget(self.button)widget = QWidget()widget.setLayout(vbox)self.setCentralWidget(widget)# 设置窗口属性self.setGeometry(300, 300, 250, 150)self.setWindowTitle('QLineEdit Example')self.show()def calculate(self):# 获取QLineEdit控件中的值value = self.lineedit.text()# 如果值为空,则弹出警告框if not value:QMessageBox.warning(self, 'Warning', 'Please enter a number.')return# 进行计算,并显示结果try:result = float(value) ** 2QMessageBox.information(self, 'Result', f'The square of {value} is {result}.')except ValueError:QMessageBox.warning(self, 'Warning', 'Please enter a valid number.')if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

输出界面如下:

在这个例子中,我们创建了一个主窗口,并在窗口中放置了一个控件和一个按钮。我们使用校验器来限制控件的输入为浮点数,并设置了默认值为0.0。在点击按钮时,我们获取控件中的值,并进行简单的计算,并将结果显示在消息框中。

如果输入的值为空,我们会弹出一个警告框提示用户输入一个数字;如果输入的不是数字,我们也会弹出一个警告框提示用户输入一个有效的数字。

3-5、添加伙伴关系、

在Qt 中,添加伙伴关系可以使得某些控件与标签或其他控件关联起来,从而使得用户输入更加方便和明确。以下是添加伙伴关系的步骤:

具体步骤:

下面是一个简单的例子,演示如何将一个控件和一个控件绑定成伙伴关系,并将它们添加到一个布局中:

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QGridLayout, QWidgetclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建QLabel和QLineEdit控件,并将它们绑定成伙伴关系nameLabel = QLabel('Name:')nameEdit = QLineEdit()nameLabel.setBuddy(nameEdit)ageLabel = QLabel('Age:')ageEdit = QLineEdit()ageLabel.setBuddy(ageEdit)# 创建QGridLayout布局,并将控件添加到其中grid = QGridLayout()grid.addWidget(nameLabel, 0, 0)grid.addWidget(nameEdit, 0, 1)grid.addWidget(ageLabel, 1, 0)grid.addWidget(ageEdit, 1, 1)# 设置窗口布局和大小self.setLayout(grid)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Buddy Example')self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

如下图所示:

在这个例子中,我们创建了两个控件和两个控件,并将它们绑定成了伙伴关系。然后我们创建了一个布局,并将这些控件添加到布局中。最后,我们将布局设置为窗口的布局,并显示窗口。

3-6、介绍 3-6-1、简单介绍

是一个可以用于显示和编辑富文本的多行文本编辑控件。它可以用于创建编辑器、日记、HTML文本查看器等。

可以在文本中插入多媒体内容,如图像、超链接、HTML表格等,并且可以在文本中使用样式来设置字体、颜色、背景、对齐等。还支持拼写检查、撤销/重做、自动缩进、文本选择等基本编辑功能。

下面是一个简单的使用的例子:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QFileDialog
from PyQt5.QtGui import QIconclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建QTextEdit控件self.textedit = QTextEdit(self)self.setCentralWidget(self.textedit)# 创建菜单栏menubar = self.menuBar()# 创建文件菜单filemenu = menubar.addMenu('File')# 创建“打开”操作openact = QAction(QIcon('open.png'), 'Open', self)openact.setShortcut('Ctrl+O')openact.triggered.connect(self.openFile)filemenu.addAction(openact)# 创建“保存”操作saveact = QAction(QIcon('save.png'), 'Save', self)saveact.setShortcut('Ctrl+S')saveact.triggered.connect(self.saveFile)filemenu.addAction(saveact)# 设置窗口属性self.setGeometry(300, 300, 350, 250)self.setWindowTitle('QTextEdit Example')self.show()def openFile(self):# 打开文件对话框filename = QFileDialog.getOpenFileName(self, 'Open File')[0]# 如果选择了文件,则读取文件内容到QTextEdit控件中if filename:with open(filename, 'r') as f:text = f.read()self.textedit.setText(text)def saveFile(self):# 打开文件对话框filename = QFileDialog.getSaveFileName(self, 'Save File')[0]# 如果选择了文件,则将QTextEdit控件中的内容保存到文件中if filename:with open(filename, 'w') as f:f.write(self.textedit.toPlainText())if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

输出界面如下图所示:

在这个例子中,我们创建了一个主窗口,并在窗口中放置了一个控件。我们使用菜单栏来创建“打开”和“保存”操作,当用户点击对应的菜单项时,我们会打开文件对话框,让用户选择要打开或保存的文件。如果选择了文件,则会读取文件内容到控件中,或将控件中的内容保存到文件中。

3-6-2、综合案例

以下是一个更综合的使用的例子,实现了一个简单的文本编辑器,并包括了多个功能:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QFileDialog, QFontDialog, QColorDialog
from PyQt5.QtGui import QIcon, QTextCursor, QTextCharFormat
from PyQt5.QtCore import Qtclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建QTextEdit控件self.textedit = QTextEdit(self)self.setCentralWidget(self.textedit)# 创建菜单栏menubar = self.menuBar()# 创建文件菜单filemenu = menubar.addMenu('File')# 创建“新建”操作newact = QAction(QIcon('new.png'), 'New', self)newact.setShortcut('Ctrl+N')newact.triggered.connect(self.newFile)filemenu.addAction(newact)# 创建“打开”操作openact = QAction(QIcon('open.png'), 'Open', self)openact.setShortcut('Ctrl+O')openact.triggered.connect(self.openFile)filemenu.addAction(openact)# 创建“保存”操作saveact = QAction(QIcon('save.png'), 'Save', self)saveact.setShortcut('Ctrl+S')saveact.triggered.connect(self.saveFile)filemenu.addAction(saveact)# 创建编辑菜单editmenu = menubar.addMenu('Edit')# 创建“剪切”操作cutact = QAction(QIcon('cut.png'), 'Cut', self)cutact.setShortcut('Ctrl+X')cutact.triggered.connect(self.textedit.cut)editmenu.addAction(cutact)# 创建“复制”操作copyact = QAction(QIcon('copy.png'), 'Copy', self)copyact.setShortcut('Ctrl+C')copyact.triggered.connect(self.textedit.copy)editmenu.addAction(copyact)# 创建“粘贴”操作pasteact = QAction(QIcon('paste.png'), 'Paste', self)pasteact.setShortcut('Ctrl+V')pasteact.triggered.connect(self.textedit.paste)editmenu.addAction(pasteact)# 创建“撤销”操作undoact = QAction(QIcon('undo.png'), 'Undo', self)undoact.setShortcut('Ctrl+Z')undoact.triggered.connect(self.textedit.undo)editmenu.addAction(undoact)# 创建“重做”操作redoact = QAction(QIcon('redo.png'), 'Redo', self)redoact.setShortcut('Ctrl+Y')redoact.triggered.connect(self.textedit.redo)editmenu.addAction(redoact)# 创建格式菜单formatmenu = menubar.addMenu('Format')# 创建“字体”操作fontact = QAction(QIcon('font.png'), 'Font', self)fontact.setShortcut('Ctrl+F')fontact.triggered.connect(self.setFont)formatmenu.addAction(fontact)# 创建“颜色”coloract = QAction(QIcon('color.png'), 'Color', self)coloract.setShortcut('Ctrl+Shift+C')coloract.triggered.connect(self.setColor)formatmenu.addAction(coloract)# 创建“左对齐”操作leftact = QAction(QIcon('left.png'), 'Align Left', self)leftact.setShortcut('Ctrl+L')leftact.triggered.connect(lambda: self.setAlignment(Qt.AlignLeft))formatmenu.addAction(leftact)# 创建“居中对齐”操作centeract = QAction(QIcon('center.png'), 'Align Center', self)centeract.setShortcut('Ctrl+E')centeract.triggered.connect(lambda: self.setAlignment(Qt.AlignCenter))formatmenu.addAction(centeract)# 创建“右对齐”操作rightact = QAction(QIcon('right.png'), 'Align Right', self)rightact.setShortcut('Ctrl+R')rightact.triggered.connect(lambda: self.setAlignment(Qt.AlignRight))formatmenu.addAction(rightact)# 创建状态栏,显示行数和字数self.statusBar().showMessage('Lines: 1, Words: 0')self.textedit.textChanged.connect(self.updateStatus)self.setGeometry(300, 300, 800, 600)self.setWindowTitle('Text Editor')self.show()def newFile(self):# 新建文件self.textedit.clear()def openFile(self):# 打开文件filename, _ = QFileDialog.getOpenFileName(self, 'Open File', '', 'Text Files (*.txt);;All Files (*)')if filename:with open(filename, 'r') as f:self.textedit.setText(f.read())def saveFile(self):# 保存文件filename, _ = QFileDialog.getSaveFileName(self, 'Save File', '', 'Text Files (*.txt);;All Files (*)')if filename:with open(filename, 'w') as f:f.write(self.textedit.toPlainText())def setFont(self):# 设置字体font, ok = QFontDialog.getFont(self.textedit.currentFont(), self)if ok:self.textedit.setCurrentFont(font)def setColor(self):# 设置颜色color = QColorDialog.getColor(self.textedit.textColor(), self)if color.isValid():self.textedit.setTextColor(color)def setAlignment(self, alignment):# 设置对齐方式self.textedit.setAlignment(alignment)def updateStatus(self):# 更新状态栏cursor = self.textedit.textCursor()lines = self.textedit.toPlainText().count('\n') + 1words = len(self.textedit.toPlainText().split())self.statusBar().showMessage(f'Lines: {lines}, Words: {words}')if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

生成界面如下:

3-7、介绍 3-7-1、简单介绍

是PyQt5中常用的对话框窗口,它是的子类,用于在应用程序中显示各种对话框,例如询问用户是否要保存文件,输入一些数据,或显示一些信息等。提供了一些方便的功能,使得它易于使用,例如:

属性

以下是一些常用的属性:

方法

以下是一些常用的方法:

信号

以下是一些常用的信号:

除了基本属性、方法和信号之外,还具有以下一些特殊的属性、方法和信号:

3-7-2、不同类型介绍

是Qt中用于显示对话框的基类。根据对话框的用途和外观,可以将分为不同的类型,包括以下几种:

除了上述几种类型的之外,还可以通过自定义来创建各种特定的对话框。自定义对话框可以包含任意数量和类型的控件,可以根据具体需求进行设计和实现。在自定义对话框中,可以使用提供的属性、方法和信号,也可以使用其他Qt控件和类库中的各种功能。

3-7-3、消息框()(最常用)

消息框():用于显示消息和提供选项的对话框。可以使用的静态方法创建各种类型的消息框,例如信息框、警告框、错误框、询问框等。

from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox, QVBoxLayout, QHBoxLayout, QPushButtonclass MainWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle('QMessageBox案例')self.setGeometry(100, 100, 400, 200)# 创建布局管理器和控件layout = QVBoxLayout()self.label = QLabel('请选择一种操作:')self.button_ok = QPushButton('确定')self.button_ok.clicked.connect(self.show_confirm_dialog)self.button_cancel = QPushButton('取消')self.button_cancel.clicked.connect(self.close)# 将控件添加到布局管理器中h_layout = QHBoxLayout()h_layout.addWidget(self.button_ok)h_layout.addWidget(self.button_cancel)layout.addWidget(self.label)layout.addLayout(h_layout)# 设置窗口的布局管理器self.setLayout(layout)def show_confirm_dialog(self):dialog = QMessageBox(self)dialog.setWindowTitle('确认对话框')dialog.setText('是否执行此操作?')dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No)dialog.setDefaultButton(QMessageBox.No)# 显示对话框并获取用户的选择button = dialog.exec_()if button == QMessageBox.Yes:self.label.setText('已执行此操作。')else:self.label.setText('已取消此操作。')if __name__ == '__main__':app = QApplication([])window = MainWindow()window.show()app.exec_()

输入如下图所示:

3-7-4、字体对话框()

是一个用于选择字体和相关属性的对话框类。它允许用户选择字体、字号、粗细和斜体等属性,并返回所选字体的详细信息。在本节中,我们将详细介绍的用法,以及如何将其集成到PyQt5应用程序中。

下面是一个简单的示例程序,它演示了如何使用。程序创建一个窗口,该窗口包含一个标签和一个按钮。当用户单击按钮时,将显示一个对话框,用户可以在其中选择字体。选择字体后,标签将使用所选字体进行更新。

from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget, QFontDialogclass FontDialogExample(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.label = QLabel('Hello, World!')self.button = QPushButton('选择字体', self)self.button.clicked.connect(self.showFontDialog)vbox = QVBoxLayout()vbox.addWidget(self.label)vbox.addWidget(self.button)self.setLayout(vbox)self.setWindowTitle('QFontDialog示例')self.show()def showFontDialog(self):font, ok = QFontDialog.getFont()if ok:self.label.setFont(font)if __name__ == '__main__':app = QApplication([])ex = FontDialogExample()app.exec_()

输出如下所示:

3-7-5、输入对话框()

输入对话框():用于获取用户输入的对话框。可以使用的静态方法创建各种类型的输入对话框,例如文本输入对话框、整数输入对话框、浮点数输入对话框等。

下面是一个使用的简单示例,用于显示一个输入对话框并将用户输入的值显示在标签控件中:

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QInputDialogclass MainWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle('QInputDialog案例')self.setGeometry(100, 100, 400, 200)# 创建布局管理器和控件layout = QVBoxLayout()self.label = QLabel('请输入一个字符串:')self.button_text = QPushButton('文本输入')self.button_text.clicked.connect(self.get_text)self.button_int = QPushButton('整数输入')self.button_int.clicked.connect(self.get_int)self.button_double = QPushButton('浮点数输入')self.button_double.clicked.connect(self.get_double)self.button_combo = QPushButton('下拉列表输入')self.button_combo.clicked.connect(self.get_combo)# 将控件添加到布局管理器中layout.addWidget(self.label)layout.addWidget(self.button_text)layout.addWidget(self.button_int)layout.addWidget(self.button_double)layout.addWidget(self.button_combo)# 设置窗口的布局管理器self.setLayout(layout)def get_text(self):text, ok = QInputDialog.getText(self, '文本输入对话框', '请输入一个字符串:')if ok:self.label.setText('你输入的是:{}'.format(text))def get_int(self):value, ok = QInputDialog.getInt(self, '整数输入对话框', '请输入一个整数:')if ok:self.label.setText('你输入的是:{}'.format(value))def get_double(self):value, ok = QInputDialog.getDouble(self, '浮点数输入对话框', '请输入一个浮点数:')if ok:self.label.setText('你输入的是:{}'.format(value))def get_combo(self):items = ['Python', 'Java', 'C++', 'JavaScript']item, ok = QInputDialog.getItem(self, '下拉列表输入对话框', '请选择一种语言:', items)if ok and item:self.label.setText('你选择的是:{}'.format(item))if __name__ == '__main__':app = QApplication([])window = MainWindow()window.show()app.exec_()

输入如下:

3-7-6、颜色对话框()

是一个用于选择颜色的标准对话框类。它允许用户选择一个颜色,包括颜色的红、绿、蓝和透明度值。在本文中,我们将介绍如何使用来选择颜色,并演示如何将其集成到PyQt5应用程序中。

要在应用程序中显示,可以调用其静态方法()。此方法的默认参数包括:

下面是一个综合的案例,包括了使用选择颜色和调整RGB值的功能:。

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QColorDialog, QSlider
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qtclass Example(QWidget):def __init__(self):super().__init__()self.color = QColor(255, 0, 0) # 默认为红色self.initUI()def initUI(self):# 创建标签self.lbl = QLabel('Hello, PyQt5!')self.lbl.setAlignment(Qt.AlignCenter)self.lbl.setStyleSheet('background-color: {}'.format(self.color.name()))# 创建按钮self.btn_color = QPushButton('Choose Color', self)self.btn_color.clicked.connect(self.show_color_dialog)# 创建RGB值标签和调整条self.lbl_r = QLabel('R:')self.lbl_g = QLabel('G:')self.lbl_b = QLabel('B:')self.slider_r = self.create_slider()self.slider_g = self.create_slider()self.slider_b = self.create_slider()# 创建布局hbox = QHBoxLayout()hbox.addWidget(self.lbl_r)hbox.addWidget(self.slider_r)hbox.addWidget(self.lbl_g)hbox.addWidget(self.slider_g)hbox.addWidget(self.lbl_b)hbox.addWidget(self.slider_b)vbox = QVBoxLayout()vbox.addWidget(self.lbl)vbox.addWidget(self.btn_color)vbox.addLayout(hbox)self.setLayout(vbox)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Color Dialog')self.show()def create_slider(self):slider = QSlider(Qt.Horizontal, self)slider.setRange(0, 255)slider.setSingleStep(1)slider.setValue(255)slider.valueChanged.connect(self.update_color)slider.setMaximumWidth(100)return sliderdef show_color_dialog(self):# 显示颜色选择器color = QColorDialog.getColor(self.color, self)if color.isValid():self.color = colorself.lbl.setStyleSheet('background-color: {}'.format(self.color.name()))self.slider_r.setValue(self.color.red())self.slider_g.setValue(self.color.green())self.slider_b.setValue(self.color.blue())def update_color(self):# 更新RGB值和颜色self.color.setRed(self.slider_r.value())self.color.setGreen(self.slider_g.value())self.color.setBlue(self.slider_b.value())self.lbl.setStyleSheet('background-color: {}'.format(self.color.name()))if __name__ == '__main__':import sysapp = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

下边是输出的图形:

四、PyQt5高级组件(、、容器、多线程等) 4-1、容器

PyQt是一个编程语言的GUI工具包,它提供了很多容器用来布置和管理GUI组件。下面是一些常见的PyQt容器:

以下为创建分组容器:

以下为将分组容器转换为栅格布局:

五、PyQt5布局管理(、、、嵌套布局) 5-1、水平布局、垂直布局、栅格布局

水平布局( ):

如下图所示为将五个按钮放置在垂直布局中去:

如下图所示为垂直布局和水平布局结合的案例:

栅格布局(Grid )

总的来说,栅格布局是一种强大的布局工具,可以帮助开发者快速创建复杂的布局结构,并且可以适应不同的屏幕尺寸和设备。

如下图所示为一个栅格布局的案例:

5-2、

是一种用于构建图形用户界面(GUI)中表单的布局管理器。它可以在表单中自动地安排各种控件(例如文本框、复选框、下拉框等)的位置和大小,以便它们以最优化的方式显示在表单上。

总之,是一种非常有用的表单布局工具,可以使表单设计和排版变得更加高效和方便。使用可以减少手动工作量,提高表单的质量和用户体验。

如下图所示为:右边为,相比于Grid ,使用起来更加的灵活。

5-3、 5-3-1、简单介绍

(网格布局)是一种PyQt5中的布局管理器,用于将控件以网格的形式排列在窗口中。每个单元格可以包含一个控件,且所有单元格大小相等。

在中,控件被按照行和列的方式排列。行和列从0开始编号。控件可以跨越多个行和列,这是通过指定控件的位置以及它在行和列中所占的单元格数量来实现的。

以下是的一些重要特点:

5-3-2、案例分析(简单计算器实现)

在这个例子中,我们创建了一个计算器窗口,并使用将所有控件排列成表格形式。我们使用创建了所有数字和运算符按钮,并将它们添加到网格布局中。我们还使用创建了结果文本框,并将其放置在布局的顶部。

当用户单击按钮时,我们使用()方法来更新结果文本框。如果用户单击等号按钮,我们计算表达式并在文本框中显示结果。如果表达式无效,则在文本框中显示“Error”。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QPushButton, QLineEditclass CalculatorWindow(QMainWindow):def __init__(self):super().__init__()# 设置窗口属性self.setWindowTitle("Calculator")self.setFixedSize(300, 300)# 设置中心窗口central_widget = QWidget(self)self.setCentralWidget(central_widget)# 创建布局grid_layout = QGridLayout()central_widget.setLayout(grid_layout)# 添加文本框self.result_line_edit = QLineEdit()self.result_line_edit.setAlignment(Qt.AlignRight)self.result_line_edit.setReadOnly(True)grid_layout.addWidget(self.result_line_edit, 0, 0, 1, 4)# 添加按钮buttons = ["7", "8", "9", "/","4", "5", "6", "*","1", "2", "3", "-","0", ".", "=", "+"]positions = [(i, j) for i in range(1, 5) for j in range(4)]for position, button_label in zip(positions, buttons):button = QPushButton(button_label)button.setMaximumWidth(50)button.clicked.connect(self.on_button_clicked)grid_layout.addWidget(button, *position)def on_button_clicked(self):button = self.sender()button_label = button.text()if button_label == "=":try:result = str(eval(self.result_line_edit.text()))except (SyntaxError, ZeroDivisionError):result = "Error"self.result_line_edit.setText(result)else:self.result_line_edit.setText(self.result_line_edit.text() + button_label)if __name__ == "__main__":app = QApplication(sys.argv)calculator = CalculatorWindow()calculator.show()sys.exit(app.exec_())

输出如下:

5-3-3、综合案例分析

复杂案例,感兴趣的可以自己粘贴运行看一下样式。:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QLabel, QVBoxLayout, QLineEdit, QGridLayout
from pyqt5Custom import ToggleSwitchclass ColorToggleButton(QPushButton):def __init__(self, color, parent=None):super().__init__(parent)self.color = colorself.setCheckable(True)self.setMinimumSize(50, 50)self.setStyleSheet(f"background-color: {self.color.name()}")def mousePressEvent(self, event):super().mousePressEvent(event)self.setChecked(True)class ColorPicker(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建垂直布局vBox = QVBoxLayout()# 将垂直布局设置为主布局self.setLayout(vBox)###################################################                                                ##               plc_device_parm                  ##                                                ###################################################self.plc_device_parm = QWidget()self.plc_device_lyt = QVBoxLayout()self.plc_device_lyt.setSpacing(5)self.plc_device_lyt.setAlignment(Qt.AlignTop | Qt.AlignCenter)self.plc_device_parm.setLayout(self.plc_device_lyt)# 设置背景色# self.plc_device_parm.setStyleSheet("background-color: #E6E6FA;")self.plc_device_lyt.addWidget(QLabel("设备参数"),alignment=Qt.AlignHCenter)self.plc_device_lyt.addWidget(QLabel("Detailed information of device."),alignment=Qt.AlignHCenter)self.plc_device_lyt.addSpacing(100)# -------------------------------#           添加表格# -------------------------------# 第一行标题labels = [QLabel('APC投入切除'), QLabel('当前运行状态'), QLabel('当前运行频率'), QLabel('手动频率'),QLabel('手动频率设置'), QLabel('频率运行上限'), QLabel('频率运行下限'), QLabel('手动启停按钮'),QLabel('APC运行指令'), QLabel('APC频率指令')]# 创建GridLayoutself.grid_layout = QGridLayout()# 设置行间距为10self.grid_layout.setVerticalSpacing(10)# 所有的列都设置为固定宽度for i in range(10):self.grid_layout.setColumnMinimumWidth(i, 150)for i in range(11):if i < 7:self.grid_layout.addWidget(QLabel(f"{i + 1}#冷却塔风机"), i + 1, 0)elif i < 9:self.grid_layout.addWidget(QLabel(f"{i - 6}#冷却泵"), i + 1, 0)else:self.grid_layout.addWidget(QLabel(f"{i - 8}#冷冻泵"), i + 1, 0)# 设置第一行标题for j in range(10):self.grid_layout.addWidget(labels[j], 0, j + 1, alignment=Qt.AlignCenter)# 添加第二列按钮self.grid_layout.addWidget(ToggleSwitch(text="", style="ios", on=True), i + 1, 1, alignment=Qt.AlignCenter)# 添加第三列文本框line_edit = QLineEdit("运行")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: #00FF00; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 2, alignment=Qt.AlignCenter)# 添加第四列文本框line_edit = QLineEdit("45.0")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: white; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 3, alignment=Qt.AlignCenter)# 添加第五列文本框line_edit = QLineEdit("45.0")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: #C0C0C0; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 4, alignment=Qt.AlignCenter)# 第六列添加一组按钮# 因为QButtonGroup并不是QWidget的子类,所以不能直接添加到QGridLayout中。如果需要将QButtonGroup添加到布局中,# 需要使用一个QWidget包装一下QButtonGroup,然后将QWidget添加到布局中。button_widget = QWidget()button_layout = QHBoxLayout(button_widget)button_1 = QPushButton("➕")button_1.setFixedSize(60, 30)button_layout.addWidget(button_1)button_2 = QPushButton("➖")button_2.setFixedSize(60, 30)button_layout.addWidget(button_2)self.grid_layout.addWidget(button_widget, i + 1, 5, alignment=Qt.AlignCenter)# 第七列line_edit = QLineEdit("50.0")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: #C0C0C0; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 6, alignment=Qt.AlignCenter)# 第八列line_edit = QLineEdit("25.0")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: #C0C0C0; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 7, alignment=Qt.AlignCenter)# 第9列button_widget = QWidget()button_layout = QHBoxLayout(button_widget)button_1 = QPushButton("启动")button_1.setFixedSize(60, 30)button_1.setStyleSheet("background-color: lightgreen;")button_layout.addWidget(button_1)button_2 = QPushButton("停机")button_2.setFixedSize(60, 30)button_2.setStyleSheet("background-color: lightgray;")button_layout.addWidget(button_2)self.grid_layout.addWidget(button_widget, i + 1, 8, alignment=Qt.AlignCenter)# 第十列line_edit = QLineEdit("0.000")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: white; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 9, alignment=Qt.AlignCenter)# 第十一列line_edit = QLineEdit("0.000")line_edit.setEnabled(False)line_edit.setStyleSheet("background-color: white; color: black")line_edit.setFixedWidth(60)line_edit.setFixedHeight(30)self.grid_layout.addWidget(line_edit, i + 1, 10, alignment=Qt.AlignCenter)# 将GridLayout添加到主布局中去vBox.addLayout(self.grid_layout)# -------------------------------#        添加调控背景色的按钮# -------------------------------self.plc_device_lyt.addSpacing(50)self.color_Layout = QHBoxLayout()self.color_widget = QWidget()self.color_widget.setFixedSize(300, 100)self.color_widget.setLayout(self.color_Layout)colors = [QColor("#F5F5DC"),QColor("#E6E6FA"),QColor("#E4F2F2"),QColor("#F2E4E4"),QColor("#F2EEE4"),QColor("#E4F2E4"),QColor("#E4E4F2"),QColor("#F2F2E4")]for color in colors:button = ColorToggleButton(color)button.setFixedSize(30, 30)button.clicked.connect(self.update_color)self.color_Layout.addWidget(button)# 将颜色块添加到布局中去self.plc_device_lyt.addWidget(self.color_widget, alignment=Qt.AlignHCenter)def update_color(self):# 设置背景色self.plc_device_parm.setStyleSheet(f"background-color: {self.sender().color.name()};")if __name__ == '__main__':app = QApplication(sys.argv)picker = ColorPicker()picker.show()sys.exit(app.exec_())

六、PyQt5信号与槽(事件处理、数据传递等)以及关联控件、、、等 6-1、PyQt5信号与槽的介绍

PyQt5中的信号: 用于在对象之间传递信息的一种机制。一个信号表示了一个事件或状态的变化,当这个事件或状态变化时,信号被发射(emit)。可以将信号连接到一个或多个槽函数中,当信号被发射时,连接的槽函数会被调用执行。槽函数则是用于接收和处理信号的函数。(槽本质上就是一个函数或者方法)

在PyQt5中,使用()方法来将信号连接到槽函数中。()方法的基本语法为:

sender.signal.connect(receiver.slot)

其中,表示发送信号的对象,表示信号的名称,()方法将信号连接到对象的槽函数slot中。槽函数可以是任何可调用的函数。

除了基本的信号和槽连接,PyQt5还支持一些高级的信号和槽机制,如:

信号和槽机制是PyQt5中非常重要的一个概念,可以用于实现各种功能,如用户界面响应、事件处理、多线程通信等。对于PyQt5的学习和使用来说,熟悉信号和槽机制是至关重要的。

6-2、在Qt 中的操作

以下为在Qt 中的编辑信号与槽:

详细的操作步骤:

6-3、介绍

**是Qt中常用的按钮控件,可以用于在GUI中创建各种类型的按钮,如普通按钮、复选框按钮、单选框按钮等。**它继承自类,因此具有类的所有特性和方法。

的构造函数如下:

QPushButton(parent=None)
QPushButton(str, parent=None)
QPushButton(QIcon, str, parent=None)

其中,第一个构造函数创建一个无标签的按钮;第二个构造函数创建一个有标签的按钮;第三个构造函数创建一个既有图标又有标签的按钮。

可以通过调用:

还可以通过信号与槽机制来响应用户的点击事件。当用户单击按钮时,会发出()信号,可以通过连接这个信号来执行特定的操作,例如在文本框中显示一个消息或启动一个特定的函数。此外,还支持其他一些与点击相关的信号和槽,例如()和()信号,用于在按钮被按下和释放时执行操作。

以下是一个简单的示例,演示如何创建一个并设置其文本标签、图标和点击事件:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qtclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('QPushButton Demo')self.setGeometry(300, 300, 400, 300)# 创建一个QPushButton并设置文本标签和图标btn = QPushButton('Click me!', self)btn.setIcon(QIcon('icon.png'))# 连接按钮的clicked信号到槽函数onBtnClickedbtn.clicked.connect(self.onBtnClicked)# 创建一个QLabel用于显示按钮状态self.label = QLabel('Button not clicked', self)# 创建水平布局和垂直布局,并将按钮和标签添加到布局中hbox = QHBoxLayout()hbox.addStretch(1)hbox.addWidget(btn)hbox.addStretch(1)vbox = QVBoxLayout()vbox.addStretch(1)vbox.addLayout(hbox)vbox.addStretch(1)vbox.addWidget(self.label, alignment=Qt.AlignCenter)# 创建一个QWidget,并将垂直布局添加到QWidget中widget = QWidget()widget.setLayout(vbox)self.setCentralWidget(widget)def onBtnClicked(self):self.label.setText('Button clicked')if __name__ == '__main__':app = QApplication(sys.argv)win = MyMainWindow()win.show()sys.exit(app.exec_())

如下图为输出示例:

6-3、介绍

是一个单选按钮控件,可以用于从多个互斥的选项中选择一个选项。与不同,只允许选择一个选项。

控件的基本属性和方法包括:

下边是一个简单示例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QRadioButtonclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('QRadioButton Demo')self.setGeometry(300, 300, 400, 300)# 创建两个单选框按钮rb1 = QRadioButton('Option 1', self)rb1.move(50, 50)rb1.setChecked(True)rb2 = QRadioButton('Option 2', self)rb2.move(50, 80)# 绑定toggled()信号rb1.toggled.connect(self.onToggled)rb2.toggled.connect(self.onToggled)def onToggled(self, checked):sender = self.sender()if checked:print(sender.text() + ' is checked')if __name__ == '__main__':app = QApplication(sys.argv)win = MyMainWindow()win.show()sys.exit(app.exec_())

下图为输出图:

6-4、复选框控件()介绍

是一个复选框控件,可以用于从多个选项中选择一个或多个选项。与不同,允许选择多个选项。

控件的基本属性和方法包括:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBoxclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('QCheckBox Demo')self.setGeometry(300, 300, 400, 300)# 创建两个复选框cb1 = QCheckBox('Option 1', self)cb1.move(50, 50)cb2 = QCheckBox('Option 2', self)cb2.move(50, 80)# 绑定stateChanged()信号cb1.stateChanged.connect(self.onStateChanged)cb2.stateChanged.connect(self.onStateChanged)def onStateChanged(self, state):sender = self.sender()if state == 2:print(sender.text() + ' is checked')else:print(sender.text() + ' is unchecked')if __name__ == '__main__':app = QApplication(sys.argv)win = MyMainWindow()win.show()sys.exit(app.exec_())

下列为输出:

6-5、下拉列表控件()介绍

是一个下拉列表控件,允许用户从预定义的一组选项中选择一个或多个选项。它通常用于表示枚举类型的值或选择一组预定义的选项。

控件的基本属性和方法包括:

下面是一个简单的演示示例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBoxclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('QComboBox Demo')self.setGeometry(300, 300, 400, 300)# 创建一个下拉列表并添加几个选项combo = QComboBox(self)combo.addItem('Option 1')combo.addItem('Option 2')combo.addItem('Option 3')combo.move(50, 50)# 绑定currentIndexChanged()信号combo.currentIndexChanged.connect(self.onIndexChanged)def onIndexChanged(self, index):# 选择下拉列表的某一项时,sender.currentText()对应的为数字123。# 即在选择时,使用sender.currentText()来做出选择每一项对应的操作。sender = self.sender()print('Current selection is ' + sender.currentText())if __name__ == '__main__':app = QApplication(sys.argv)win = MyMainWindow()win.show()sys.exit(app.exec_())

下图为输出:

6-9、综合案例

以下是一个综合案例,展示了如何使用多个,包括普通按钮、复选框按钮、单选框按钮和菜单按钮,并演示了这些按钮的基本用法和属性。

import sysfrom PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QRadioButton, QMenu, QActionclass MyMainWindow(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('QPushButton Demo')self.setGeometry(300, 300, 400, 300)# 创建一个普通按钮和一个带图标的按钮btn1 = QPushButton('Button', self)btn1.move(30, 50)btn2 = QPushButton(self)btn2.setIcon(QIcon('switchicon.png'))btn2.move(150, 50)# 创建一个复选框按钮cb = QCheckBox('Show Title', self)cb.move(30, 100)cb.stateChanged.connect(self.toggleTitle)# 创建两个单选框按钮rb1 = QRadioButton('Button 1', self)rb1.move(30, 150)rb2 = QRadioButton('Button 2', self)rb2.move(150, 150)# 创建一个菜单按钮和一个菜单mb = QPushButton('Menu', self)mb.move(30, 200)menu = QMenu(self)menu.addAction('Action 1', self.onAction1)menu.addAction('Action 2', self.onAction2)mb.setMenu(menu)def toggleTitle(self, state):if state == Qt.Checked:self.setWindowTitle('QPushButton Demo - Title Visible')else:self.setWindowTitle('QPushButton Demo')def onAction1(self):print('Action 1 clicked')def onAction2(self):print('Action 2 clicked')if __name__ == '__main__':app = QApplication(sys.argv)win = MyMainWindow()win.show()sys.exit(app.exec_())

输出展示如下图所示:

6-10、控件综合案例

以下是一个使用PyQt5中的各种控件的综合案例,包括标签、按钮、文本框、列表框、进度条、滑块、单选框和复选框。

在这个例子中,我们创建了一个名为的窗口,并向它添加了标签、按钮、文本框、列表框、进度条、滑块、单选框和复选框等控件。我们使用和等布局管理器将控件放置在窗口中,使用将单选框和复选框包含在一个控件组合框中。我们还绑定了按钮的点击事件,以便在点击按钮时执行一些操作。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit, QListWidget, QProgressBar, QSlider, QRadioButton, QCheckBox, QVBoxLayout, QHBoxLayout, QGroupBoxclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("Widget Example")# 创建标签、按钮和文本框控件label = QLabel("Enter your name:")button = QPushButton("Submit")self.text_box = QLineEdit()# 创建列表框控件list_widget = QListWidget()list_widget.addItems(["Item 1", "Item 2", "Item 3"])# 创建进度条和滑块控件progress_bar = QProgressBar()slider = QSlider()slider.setOrientation(1)slider.setRange(0, 100)slider.setValue(50)slider.valueChanged.connect(progress_bar.setValue)# 创建单选框和复选框控件radio_button_1 = QRadioButton("Option 1")radio_button_2 = QRadioButton("Option 2")check_box = QCheckBox("Check me")# 将控件添加到布局中v_layout_1 = QVBoxLayout()v_layout_1.addWidget(label)v_layout_1.addWidget(self.text_box)v_layout_1.addWidget(button)v_layout_1.addWidget(list_widget)v_layout_2 = QVBoxLayout()v_layout_2.addWidget(progress_bar)v_layout_2.addWidget(slider)h_layout = QHBoxLayout()h_layout.addWidget(radio_button_1)h_layout.addWidget(radio_button_2)h_layout.addWidget(check_box)# 创建控件组合框group_box = QGroupBox("Options")group_box.setLayout(h_layout)# 将布局添加到主布局中main_layout = QVBoxLayout()main_layout.addLayout(v_layout_1)main_layout.addLayout(v_layout_2)main_layout.addWidget(group_box)# 设置主布局self.setLayout(main_layout)# 绑定按钮的点击事件button.clicked.connect(self.button_clicked)# 按钮的点击事件def button_clicked(self):name = self.text_box.text()print("Hello,", name)if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec_())

以下为输出图:

七、PyQt5高级控件(滑块控件、计数器控件、树控件、) 7-1、滑块控件

滑块控件()是图形用户界面中常见的一种控件,也称为滑杆、拖动条、进度条等,用于调节数值类型的参数。用户通过拖动滑块的滑块块(Thumb)来改变滑块的值,滑块的范围和步长可以通过设置属性进行控制。在PyQt5中,是用于创建滑块控件的类。

的常用属性和方法如下:

简单案例分析:

该综合案例创建了一个带有滑块控件的窗口,并实现了滑块值的更新和重置按钮的功能。运行该代码将显示一个带有滑块控件和重置按钮的窗口,当滑块的值改变时,标签的文本会更新为当前的滑块值。点击重置按钮将会将滑块的值重置为0,并更新标签的文本。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QHBoxLayout, QVBoxLayout, QPushButton
from PyQt5.QtCore import Qtclass SliderDemo(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建一个水平布局和垂直布局hlayout = QHBoxLayout()vlayout = QVBoxLayout()# 创建一个标签和滑块控件,并添加到水平布局中self.label = QLabel('Value: 0')self.slider = QSlider(Qt.Horizontal)self.slider.valueChanged[int].connect(self.onSliderValueChanged)hlayout.addWidget(self.label)hlayout.addWidget(self.slider)# 创建一个重置按钮,并添加到垂直布局中reset_btn = QPushButton('Reset')reset_btn.clicked.connect(self.onResetBtnClicked)vlayout.addLayout(hlayout)vlayout.addWidget(reset_btn)# 设置窗口的布局self.setLayout(vlayout)# 设置窗口的标题和大小self.setWindowTitle('Slider Demo')self.resize(300, 200)def onSliderValueChanged(self, value):# 当滑块的值改变时更新标签的文本self.label.setText(f'Value: {value}')def onResetBtnClicked(self):# 重置滑块的值为0,并更新标签的文本self.slider.setValue(0)self.label.setText('Value: 0')if __name__ == '__main__':app = QApplication(sys.argv)demo = SliderDemo()demo.show()sys.exit(app.exec_())

输出如下图所示:

7-2、计数器()控件

是PyQt5中的一个计数器控件,它提供了一个可供用户编辑和选择数字的文本框,用户可以通过点击上下箭头或直接输入数字来更改文本框中的值。

以下是一些控件的常用属性和方法:

以下为简单案例分析:

该示例程序创建了一个带有计数器控件、标签和重置按钮的窗口。当计数器的值更改时,标签的文本会更新为当前计数器的值。当用户点击重置按钮时,计数器的值将重置为默认值0。运行该程序,将会显示一个带有计数器控件、标签和重置按钮的窗口,您可以通过点击上下箭头或直接输入数字来更改计数器的值,也可以点击重置按钮将计数器的值重置为0。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSpinBox, QPushButton, QVBoxLayout, QHBoxLayout
from PyQt5.QtCore import Qtclass CounterDemo(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建一个垂直布局vlayout = QVBoxLayout()# 创建一个标签和计数器控件,并添加到垂直布局中self.label = QLabel('Value: 0')self.spinbox = QSpinBox()self.spinbox.setMinimum(0)self.spinbox.setMaximum(100)self.spinbox.setSingleStep(1)self.spinbox.valueChanged[int].connect(self.onSpinBoxValueChanged)vlayout.addWidget(self.label)vlayout.addWidget(self.spinbox)# 创建一个水平布局,并添加一个重置按钮hlayout = QHBoxLayout()reset_btn = QPushButton('Reset')reset_btn.clicked.connect(self.onResetClicked)hlayout.addWidget(reset_btn)hlayout.addStretch(1)vlayout.addLayout(hlayout)# 设置窗口的布局self.setLayout(vlayout)# 设置窗口的标题和大小self.setWindowTitle('Counter Demo')self.resize(300, 200)def onSpinBoxValueChanged(self, newValue):# 当计数器的值改变时更新标签的文本self.label.setText(f'Value: {newValue}')def onResetClicked(self):# 点击重置按钮时将计数器的值重置为默认值0self.spinbox.setValue(0)if __name__ == '__main__':app = QApplication(sys.argv)demo = CounterDemo()demo.show()sys.exit(app.exec_())

···

7-3、树(Tree )控件 7-3-1、树控件的简单介绍

树控件(Tree )是一种常见的用户界面控件,它可以用来展示层次化的数据结构,例如文件系统、目录结构、组织结构等等。树控件通常由多个节点(Node)组成,每个节点都可以包含多个子节点。

在PyQt5中,树控件是通过类来实现的。下面是一些常用的树控件相关的概念:

树控件通常具有以下特点:

在PyQt5中,可以通过以下方法来操作树控件:

7-3-2、树控件综合案例分析

在这个案例中,我们创建了一个名为"组织结构图"的主窗口,并设置了固定的大小。然后,我们创建了一个树控件(),并设置了树控件的列标题为"姓名"、“职位"和"部门”。


import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItemclass OrganizationChart(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("组织结构图")self.resize(500, 400)self.treeWidget = QTreeWidget()self.treeWidget.setHeaderLabels(["姓名", "职位", "部门"])self.populateTreeWidget()self.setCentralWidget(self.treeWidget)def populateTreeWidget(self):# 创建根节点root = QTreeWidgetItem(self.treeWidget, ["总经理", "总经理", ""])# 创建部门节点1department1 = QTreeWidgetItem(root, ["市场部", "部门经理", ""])employee1 = QTreeWidgetItem(department1, ["张三", "销售经理", "市场部"])employee2 = QTreeWidgetItem(department1, ["李四", "市场专员", "市场部"])# 创建部门节点2department2 = QTreeWidgetItem(root, ["技术部", "部门经理", ""])employee3 = QTreeWidgetItem(department2, ["王五", "技术总监", "技术部"])employee4 = QTreeWidgetItem(department2, ["赵六", "开发工程师", "技术部"])# 展开根节点self.treeWidget.expandItem(root)if __name__ == "__main__":app = QApplication(sys.argv)organizationChart = OrganizationChart()organizationChart.show()sys.exit(app.exec_())

输出如下图所示:

7-4、控件

是Qt框架中的一个控件,用于创建和管理标签页(Tab)界面。它提供了一个选项卡式的布局,允许用户在不同的标签页之间切换,并且可以在每个标签页中显示不同的内容。

具有以下特点和功能:

在用户界面设计中经常被用于组织和管理复杂的界面结构。它适用于需要在不同的标签页中显示不同内容的场景,如选项卡式的设置界面、多标签文档编辑器、多标签浏览器等。使用,开发者可以方便地创建交互式、易于导航的界面,提升用户体验和操作效率。

以下是一个简单案例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QTabWidgetif __name__ == "__main__":app = QApplication(sys.argv)# 创建主窗口mainWindow = QMainWindow()# 创建QTabWidgettabWidget = QTabWidget(mainWindow)# 创建标签页1tab1 = QWidget()layout1 = QVBoxLayout(tab1)label1 = QLabel("这是标签页1")layout1.addWidget(label1)# 创建标签页2tab2 = QWidget()layout2 = QVBoxLayout(tab2)label2 = QLabel("这是标签页2")layout2.addWidget(label2)# 将标签页添加到QTabWidget中tabWidget.addTab(tab1, "标签页1")tabWidget.addTab(tab2, "标签页2")# 设置主窗口的中央部件为QTabWidgetmainWindow.setCentralWidget(tabWidget)mainWindow.resize(400, 300)mainWindow.show()sys.exit(app.exec_())

7-5、堆栈窗口控件()

堆栈窗口控件()是Qt框架提供的一种用于管理多个页面或窗口的容器控件。它可以显示多个子窗口,但每次只能显示其中的一个,其它子窗口则被隐藏。通过切换可见的子窗口,堆栈窗口控件允许用户在不同的页面之间进行导航和切换。

以下是堆栈窗口控件的一些特性和使用方法:

页面管理:堆栈窗口控件可以管理多个页面或窗口,每个页面都可以是一个或其子类。可以通过添加、插入和删除页面来动态管理堆栈中的子窗口。

导航和切换:通过在堆栈窗口控件中的子窗口之间进行切换,可以实现页面导航。可以使用()方法或()方法来设置当前可见的子窗口,从而切换页面。

信号和槽机制:堆栈窗口控件提供了一些信号,例如信号,可以在当前页面发生变化时触发。可以使用这些信号与槽连接来处理页面切换时的逻辑。

堆栈管理:堆栈窗口控件维护一个内部的堆栈,用于跟踪页面的顺序。可以使用堆栈管理方法,如()、()和()来管理堆栈中的页面。

堆栈窗口控件适用于需要在不同页面之间进行切换或导航的应用程序场景,例如设置向导、多页表单、步骤流程等。通过使用堆栈窗口控件,可以方便地管理和显示多个页面,并实现简单而直观 的界面切换和导航效果。

7-6、停靠控件

停靠控件(Dock )是一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。

在 PyQt 中,停靠控件由 类实现。它可以与 或 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。

停靠控件通常具有以下特点和用途:

在使用停靠控件时,可以通过以下步骤实现:

通过使用停靠控件,用户可以轻松实现界面的灵活布局和组织,以适应不同的任务和工作流程。停靠控件的可停靠性、自定义性和附加功能使得应用程序更加可扩展和易用,提供了良停靠控件(Dock )是一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。

在 PyQt 中,停靠控件由 类实现。它可以与 或 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。

停靠控件的主要特点和用途如下:

通过使用停靠控件,用户可以轻松实现界面的灵活布局和组织,以适应不同的任务和工作流程。停靠控件的可停靠性、自定义性和附加功能使得应用程序更加可扩展和易用,提供了良好的用户体验。

综合案例实现:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit, QAction, QFileDialog, QMessageBox, QVBoxLayout, QWidget, QLabel, QPushButton, QTreeWidget, QTreeWidgetItemclass NotePad(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("NotePad")self.setGeometry(100, 100, 800, 600)# 创建文本编辑区域self.textEdit = QTextEdit()self.setCentralWidget(self.textEdit)# 创建停靠控件dock = QDockWidget("File Actions", self)dock.setAllowedAreas(Qt.LeftDockWidgetArea)# 创建停靠控件中的内容,包括打开文件按钮和保存文件按钮openButton = QPushButton("Open File")openButton.clicked.connect(self.openFile)saveButton = QPushButton("Save File")saveButton.clicked.connect(self.saveFile)layout = QVBoxLayout()layout.addWidget(openButton)layout.addWidget(saveButton)widget = QWidget()widget.setLayout(layout)dock.setWidget(widget)# 将停靠控件添加到主窗口的左侧停靠区域self.addDockWidget(Qt.LeftDockWidgetArea, dock)# 创建菜单和动作self.createActions()self.createMenus()# 创建侧边栏self.createSidebar()self.show()def createActions(self):self.openAction = QAction("Open File", self)self.openAction.triggered.connect(self.openFile)self.saveAction = QAction("Save File", self)self.saveAction.triggered.connect(self.saveFile)def createMenus(self):self.fileMenu = self.menuBar().addMenu("File")self.fileMenu.addAction(self.openAction)self.fileMenu.addAction(self.saveAction)def createSidebar(self):# 创建侧边栏sidebarDock = QDockWidget("Notes", self)sidebarDock.setAllowedAreas(Qt.LeftDockWidgetArea)# 创建树控件treeWidget = QTreeWidget()treeWidget.setHeaderLabels(["Notes"])# 添加示例笔记root = QTreeWidgetItem(treeWidget)root.setText(0, "Notebook")note1 = QTreeWidgetItem(root)note1.setText(0, "Note 1")note2 = QTreeWidgetItem(root)note2.setText(0, "Note 2")# 将树控件添加到侧边栏sidebarDock.setWidget(treeWidget)self.addDockWidget(Qt.LeftDockWidgetArea, sidebarDock)def openFile(self):fileName, _ = QFileDialog.getOpenFileName(self, "Open File")if fileName:try:with open(fileName, 'r') as file:content = file.read()self.textEdit.setPlainText(content)except Exception as e:QMessageBox.critical(self, "Error", str(e))def saveFile(self):fileName, _ = QFileDialog.getSaveFileName(self, "Save File")if fileName:try:with open(fileName, 'w') as file:content = self.textEdit.toPlainText()file.write(content)QMessageBox.information(self, "Success", "File saved successfully.")except Exception as e:QMessageBox.critical(self, "Error", str(e))if __name__ == '__main__':app = QApplication(sys.argv)notepad = NotePad()sys.exit(app.exec_())

输出界面如下所示:

八、PyQt5图形与特效(定制窗口风格、绘图、QSS与UI美化、不规则窗口、设置样式等) 九、PyQt5扩展应用(制作PyQt5安装程序、数据处理、第三方图绘图库在PyQt5中的应用、UI自动化测试等) 总结

P84

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了