PyQt5是一个用于创建图形用户界面(GUI)的Python库。它是基于Qt库的,Qt是一个用于创建跨平台应用程序的C++库。PyQt5允许开发人员使用Python语言创建功能强大的应用程序。使用Python开发的优点是高效
PyQt5包括了许多工具,允许开发人员创建多种不同类型的用户界面,如对话框,下拉菜单,工具栏,按钮,文本框等。它还支持使用鼠标和键盘进行交互,以及使用图像和声音等多媒体内容。以下为详细介绍:
总的来说,PyQt5是一个功能强大,易于使用的工具,可以帮助开发人员创建高质量的图形用户界面。如果您正在寻找一种用于创建图形用户界面的Python库,那么PyQt5可能是一个不错的选择。
# 先装好IDE,推荐Pycharm,之后安装python包和PyQt5包。
pip install python
pip install PyQt5
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __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_())
以下是代码的详细解释:
pip install pyqt5-tools
安装之后可以在python目录下找到designer.exe, 我的文件在D:\Python\Python38\Lib\site-packages\qt5_applications\Qt\bin
之后直接可以在Tools-》External Tools中看到QT Designer
打开QT Designer后,我们先创建一个Main Window用来存放所有组件。
界面的简单介绍
方法一:直接使用命令行转换,demo.ui为保存的ui名,demo.py为ui转换为python的文件。
python -m PyQt5.uic.pyuic demo.ui -o demo.py
QMainWindow是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。在QMainWindow中,中心窗口是最重要的部分,它可以是任何Qt窗口部件,如QTextEdit、QTableView、QGraphicsView等。
QMainWindow可以通过Qt Designer进行设计和布局,也可以通过代码进行创建和配置。在使用Qt Designer时,可以拖放各种窗口部件到QMainWindow中,然后通过属性编辑器进行属性设置。在使用代码时,可以通过构造函数或者成员函数进行设置。
QMainWindow的一些常用成员函数包括:
总的来说,QMainWindow是一个非常强大的窗口部件,它可以用于创建各种类型的应用程序界面,如主窗口应用程序、多文档应用程序等。我们通常创建的是这个窗口
QWidget
总之,QWidget是Qt框架中所有用户界面部件的基类,提供了基本的用户界面功能,包括绘制、事件处理、布局等。它是Qt框架中非常重要和常用的部件之一,对于Qt开发者来说是必须要熟练掌握的。
QWidget是Qt框架中所有用户界面部件的基类,包括窗口、对话框、按钮、标签、文本框、图形视图等等,它提供了基本的用户界面功能,例如绘制、事件处理、布局等。而QMainWindow是QWidget的子类,是Qt框架中的一个主窗口类,它提供了一个应用程序的主界面,可以包含菜单栏、工具栏、状态栏、中心窗口等各种窗口部件。具体来说,QWidget与QMainWindow的区别如下:
总的来说,QWidget和QMainWindow都是Qt框架中非常重要的用户界面部件,用于创建不同类型的界面。QWidget提供了基本的用户界面功能,适用于创建各种类型的窗口和控件,而QMainWindow则提供了应用程序主窗口的各种功能,适用于创建包含菜单栏、工具栏、状态栏等的应用程序主窗口。
总结:
QDialog: 是对话窗口的基类,没有菜单栏、工具栏、状态栏。
QMainWindow: 可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的形式。
QWidget: 不确定窗口的用途,就使用Qwidget。
PyQt中的Spacer控件是一种用于布局的空白控件。
Spacer控件可以帮助您在布局中创建空白区域,以便在界面上分隔其他控件,或者在其他控件周围留出空白区域。 Spacer控件的大小可以通过设置其大小策略(size policy)来控制。
Spacer控件有两种类型:水平(QSpacerItem)和垂直(QSpacerItem)。您可以使用QHBoxLayout或QVBoxLayout将Spacer控件添加到布局中。在添加Spacer控件时,您可以指定其最小大小、最大大小和首选大小,以及其大小策略。
QLabel和QLineEdit都是Qt框架中常用的用户界面控件,用于在图形用户界面(GUI)中显示文本信息和接受用户输入。以下是它们的介绍:
QLabel:
QLabel是一个显示文本或图像的控件,它通常被用于显示静态文本信息。可以通过设置其文本、字体、颜色、对齐方式等属性来自定义标签的样式和布局。可以将QLabel放置在主窗口、对话框或其他控件上,以便在应用程序中提供帮助文本、说明、状态消息等。
方法:
属性:
以下是一个简单的例子,展示如何创建一个QLabel控件并设置它的一些属性:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtCore import Qt
class 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_())
以下是QLabel控件的常用信号:
以下是一个简单的例子,演示如何使用linkActivated信号:
import sys
from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QUrl
class 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_())
QLineEdit:
QLineEdit是一个用于接收用户输入的单行文本编辑控件,它允许用户输入和编辑文本信息。可以设置QLineEdit的输入格式,例如只允许输入数字、字母或特定字符,或者限制输入的最大长度。可以使用信号和槽机制来处理用户输入的文本,以便在应用程序中执行特定的操作或验证用户输入的有效性。
总的来说,QLabel和QLineEdit是Qt框架中非常实用的控件,它们可以为应用程序提供各种形式的文本输入和输出。
下图为添加了Qlabel和QLineEdit的FormLayput:
下面是QLineEdit控件的一些常用属性和方法:
下面是一个简单的例子,演示如何创建一个QLineEdit控件并将其添加到窗口中:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QVBoxLayout
class 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_())
限制输入:QlineEdit控件添加校验器
QLineEdit控件可以使用校验器来限制输入,常见的校验器有QIntValidator(整数校验器)、QDoubleValidator(浮点数校验器)和QRegExpValidator(正则表达式校验器)等。
下面是一个使用QIntValidator校验器和QFormLayout表单布局的示例代码,用于限制用户只能输入整数:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QFormLayout, QIntValidator
class 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_())
在这个例子中,我们创建了一个整数校验器,并将其应用于QLineEdit控件,这样用户只能输入整数。然后,我们使用QFormLayout表单布局来组织控件,并将控件添加到布局中。最后,设置窗口布局和大小,并显示窗口。
使用校验器可以有效地限制用户的输入,避免非法输入导致程序崩溃或产生错误结果。同时,QFormLayout表单布局也可以方便地组织控件,使界面更加美观和易用。
下面是一个使用QLineEdit控件的综合案例,包含以下内容:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QMessageBox, QVBoxLayout, QWidget
from PyQt5.QtGui import QDoubleValidator
class 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) ** 2
QMessageBox.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_())
在这个例子中,我们创建了一个主窗口,并在窗口中放置了一个QLineEdit控件和一个按钮。我们使用QDoubleValidator校验器来限制QLineEdit控件的输入为浮点数,并设置了默认值为0.0。在点击按钮时,我们获取QLineEdit控件中的值,并进行简单的计算,并将结果显示在消息框中。
如果输入的值为空,我们会弹出一个警告框提示用户输入一个数字;如果输入的不是数字,我们也会弹出一个警告框提示用户输入一个有效的数字。
在Qt Designer中,添加伙伴关系可以使得某些控件与标签或其他控件关联起来,从而使得用户输入更加方便和明确。以下是添加伙伴关系的步骤:
具体步骤:
下面是一个简单的例子,演示如何将一个QLabel控件和一个QLineEdit控件绑定成伙伴关系,并将它们添加到一个QGridLayout布局中:
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QGridLayout, QWidget
class 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_())
在这个例子中,我们创建了两个QLabel控件和两个QLineEdit控件,并将它们绑定成了伙伴关系。然后我们创建了一个QGridLayout布局,并将这些控件添加到布局中。最后,我们将布局设置为窗口的布局,并显示窗口。
QTextEdit是一个可以用于显示和编辑富文本的多行文本编辑控件。它可以用于创建编辑器、日记、HTML文本查看器等。
QTextEdit可以在文本中插入多媒体内容,如图像、超链接、HTML表格等,并且可以在文本中使用样式来设置字体、颜色、背景、对齐等。QTextEdit还支持拼写检查、撤销/重做、自动缩进、文本选择等基本编辑功能。
下面是一个简单的使用QTextEdit的例子:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QFileDialog
from PyQt5.QtGui import QIcon
class 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_())
在这个例子中,我们创建了一个主窗口,并在窗口中放置了一个QTextEdit控件。我们使用菜单栏来创建“打开”和“保存”操作,当用户点击对应的菜单项时,我们会打开文件对话框,让用户选择要打开或保存的文件。如果选择了文件,则会读取文件内容到QTextEdit控件中,或将QTextEdit控件中的内容保存到文件中。
以下是一个更综合的使用QTextEdit的例子,实现了一个简单的文本编辑器,并包括了多个功能:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QTextEdit, QFileDialog, QFontDialog, QColorDialog
from PyQt5.QtGui import QIcon, QTextCursor, QTextCharFormat
from PyQt5.QtCore import Qt
class 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') + 1
words = 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_())
QDialog是PyQt5中常用的对话框窗口,它是QWidget的子类,用于在应用程序中显示各种对话框,例如询问用户是否要保存文件,输入一些数据,或显示一些信息等。QDialog提供了一些方便的功能,使得它易于使用,例如:
属性
以下是一些常用的QDialog属性:
方法
以下是一些常用的QDialog方法:
信号
以下是一些常用的QDialog信号:
除了基本属性、方法和信号之外,QDialog还具有以下一些特殊的属性、方法和信号:
QDialog是Qt中用于显示对话框的基类。根据对话框的用途和外观,可以将QDialog分为不同的类型,包括以下几种:
除了上述几种类型的QDialog之外,还可以通过自定义QDialog来创建各种特定的对话框。自定义对话框可以包含任意数量和类型的控件,可以根据具体需求进行设计和实现。在自定义对话框中,可以使用QDialog提供的属性、方法和信号,也可以使用其他Qt控件和类库中的各种功能。
消息框(QMessageBox):用于显示消息和提供选项的对话框。可以使用QMessageBox的静态方法创建各种类型的消息框,例如信息框、警告框、错误框、询问框等。
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox, QVBoxLayout, QHBoxLayout, QPushButton
class 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_()
输入如下图所示:
QFontDialog是一个用于选择字体和相关属性的对话框类。它允许用户选择字体、字号、粗细和斜体等属性,并返回所选字体的详细信息。在本节中,我们将详细介绍QFontDialog的用法,以及如何将其集成到PyQt5应用程序中。
下面是一个简单的示例程序,它演示了如何使用QFontDialog。程序创建一个窗口,该窗口包含一个标签和一个按钮。当用户单击按钮时,将显示一个QFontDialog对话框,用户可以在其中选择字体。选择字体后,标签将使用所选字体进行更新。
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget, QFontDialog
class 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_()
输入对话框(QInputDialog):用于获取用户输入的对话框。可以使用QInputDialog的静态方法创建各种类型的输入对话框,例如文本输入对话框、整数输入对话框、浮点数输入对话框等。
下面是一个使用QInputDialog的简单示例,用于显示一个输入对话框并将用户输入的值显示在标签控件中:
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout, QInputDialog
class 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_()
输入如下:
QColorDialog是一个用于选择颜色的标准对话框类。它允许用户选择一个颜色,包括颜色的红、绿、蓝和透明度值。在本文中,我们将介绍如何使用QColorDialog来选择颜色,并演示如何将其集成到PyQt5应用程序中。
要在应用程序中显示QColorDialog,可以调用其静态方法getColor()。此方法的默认参数包括:
下面是一个综合的QColorDialog案例,包括了使用QColorDialog选择颜色和调整RGB值的功能:。
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel, QColorDialog, QSlider
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qt
class 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 slider
def show_color_dialog(self):
# 显示颜色选择器
color = QColorDialog.getColor(self.color, self)
if color.isValid():
self.color = color
self.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 sys
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
PyQt是一个Python编程语言的GUI工具包,它提供了很多容器用来布置和管理GUI组件。下面是一些常见的PyQt容器:
以下为创建QGroupBox分组容器:
以下为将分组容器转换为栅格布局:
水平布局(Horizontal layout):
如下图所示为将五个按钮放置在垂直布局中去:
如下图所示为垂直布局和水平布局结合的案例:
栅格布局(Grid Layout)
总的来说,栅格布局是一种强大的布局工具,可以帮助开发者快速创建复杂的布局结构,并且可以适应不同的屏幕尺寸和设备。
FormLayout是一种用于构建图形用户界面(GUI)中表单的布局管理器。它可以在表单中自动地安排各种控件(例如文本框、复选框、下拉框等)的位置和大小,以便它们以最优化的方式显示在表单上。
总之,FormLayout是一种非常有用的表单布局工具,可以使表单设计和排版变得更加高效和方便。使用FormLayout可以减少手动工作量,提高表单的质量和用户体验。
如下图所示为:右边为QFormLayout,相比于Grid Layout,QFormLayout使用起来更加的灵活。
GridLayout(网格布局)是一种PyQt5中的布局管理器,用于将控件以网格的形式排列在窗口中。每个单元格可以包含一个控件,且所有单元格大小相等。
在GridLayout中,控件被按照行和列的方式排列。行和列从0开始编号。控件可以跨越多个行和列,这是通过指定控件的位置以及它在行和列中所占的单元格数量来实现的。
以下是GridLayout的一些重要特点:
在这个例子中,我们创建了一个计算器窗口,并使用QGridLayout将所有控件排列成表格形式。我们使用QPushButton创建了所有数字和运算符按钮,并将它们添加到网格布局中。我们还使用QLineEdit创建了结果文本框,并将其放置在布局的顶部。
当用户单击按钮时,我们使用on_button_clicked()方法来更新结果文本框。如果用户单击等号按钮,我们计算表达式并在文本框中显示结果。如果表达式无效,则在文本框中显示“Error”。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QPushButton, QLineEdit
class 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_())
输出如下:
复杂案例,感兴趣的可以自己粘贴运行看一下样式。:
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 ToggleSwitch
class ColorToggleButton(QPushButton):
def __init__(self, color, parent=None):
super().__init__(parent)
self.color = color
self.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频率指令')]
# 创建GridLayout
self.grid_layout = QGridLayout()
# 设置行间距为10
self.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中的信号: 用于在对象之间传递信息的一种机制。一个信号表示了一个事件或状态的变化,当这个事件或状态变化时,信号被发射(emit)。可以将信号连接到一个或多个槽函数中,当信号被发射时,连接的槽函数会被调用执行。槽函数则是用于接收和处理信号的函数。(槽本质上就是一个函数或者方法)
在PyQt5中,使用connect()方法来将信号连接到槽函数中。connect()方法的基本语法为:
sender.signal.connect(receiver.slot)
其中,sender表示发送信号的对象,signal表示信号的名称,connect()方法将信号signal连接到receiver对象的槽函数slot中。槽函数可以是任何可调用的Python函数。
除了基本的信号和槽连接,PyQt5还支持一些高级的信号和槽机制,如:
信号和槽机制是PyQt5中非常重要的一个概念,可以用于实现各种功能,如用户界面响应、事件处理、多线程通信等。对于PyQt5的学习和使用来说,熟悉信号和槽机制是至关重要的。
以下为在Qt Designer中的编辑信号与槽:
详细的操作步骤:
**QPushButton是Qt中常用的按钮控件,可以用于在GUI中创建各种类型的按钮,如普通按钮、复选框按钮、单选框按钮等。**它继承自QAbstractButton类,因此具有QAbstractButton类的所有特性和方法。
QpushButton的构造函数如下:
QPushButton(parent=None)
QPushButton(str, parent=None)
QPushButton(QIcon, str, parent=None)
其中,第一个构造函数创建一个无标签的按钮;第二个构造函数创建一个有标签的按钮;第三个构造函数创建一个既有图标又有标签的按钮。
QPushButton可以通过调用:
QPushButton还可以通过信号与槽机制来响应用户的点击事件。当用户单击按钮时,会发出clicked()信号,可以通过连接这个信号来执行特定的操作,例如在文本框中显示一个消息或启动一个特定的函数。此外,QPushButton还支持其他一些与点击相关的信号和槽,例如pressed()和released()信号,用于在按钮被按下和释放时执行操作。
以下是一个简单的示例,演示如何创建一个QPushButton并设置其文本标签、图标和点击事件:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class 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信号到槽函数onBtnClicked
btn.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_())
QRadioButton是一个单选按钮控件,可以用于从多个互斥的选项中选择一个选项。与QCheckBox不同,QRadioButton只允许选择一个选项。
QRadioButton控件的基本属性和方法包括:
下边是一个简单示例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QRadioButton
class 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_())
QCheckBox是一个复选框控件,可以用于从多个选项中选择一个或多个选项。与QRadioButton不同,QCheckBox允许选择多个选项。
QCheckBox控件的基本属性和方法包括:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QCheckBox
class 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_())
QComboBox是一个下拉列表控件,允许用户从预定义的一组选项中选择一个或多个选项。它通常用于表示枚举类型的值或选择一组预定义的选项。
QComboBox控件的基本属性和方法包括:
下面是一个简单的演示示例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QComboBox
class 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()对应的为数字1、2、3。
# 即在选择时,使用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_())
下图为输出:
以下是一个综合案例,展示了如何使用多个QPushButton,包括普通按钮、复选框按钮、单选框按钮和菜单按钮,并演示了这些按钮的基本用法和属性。
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QRadioButton, QMenu, QAction
class 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_())
输出展示如下图所示:
以下是一个使用PyQt5中的各种控件的综合案例,包括标签、按钮、文本框、列表框、进度条、滑块、单选框和复选框。
在这个例子中,我们创建了一个名为MyWindow的QWidget窗口,并向它添加了标签、按钮、文本框、列表框、进度条、滑块、单选框和复选框等控件。我们使用QVBoxLayout和QHBoxLayout等布局管理器将控件放置在窗口中,使用QGroupBox将单选框和复选框包含在一个控件组合框中。我们还绑定了按钮的点击事件,以便在点击按钮时执行一些操作。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit, QListWidget, QProgressBar, QSlider, QRadioButton, QCheckBox, QVBoxLayout, QHBoxLayout, QGroupBox
class 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_())
以下为输出图:
滑块控件(Slider)是图形用户界面中常见的一种控件,也称为滑杆、拖动条、进度条等,用于调节数值类型的参数。用户通过拖动滑块的滑块块(Thumb)来改变滑块的值,滑块的范围和步长可以通过设置属性进行控制。在PyQt5中,QSlider是用于创建滑块控件的类。
QSlider的常用属性和方法如下:
简单案例分析:
该综合案例创建了一个带有滑块控件的窗口,并实现了滑块值的更新和重置按钮的功能。运行该代码将显示一个带有滑块控件和重置按钮的窗口,当滑块的值改变时,标签的文本会更新为当前的滑块值。点击重置按钮将会将滑块的值重置为0,并更新标签的文本。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QHBoxLayout, QVBoxLayout, QPushButton
from PyQt5.QtCore import Qt
class 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_())
QSpinBox是PyQt5中的一个计数器控件,它提供了一个可供用户编辑和选择数字的文本框,用户可以通过点击上下箭头或直接输入数字来更改文本框中的值。
以下是一些QSpinBox控件的常用属性和方法:
以下为简单案例分析:
该示例程序创建了一个带有计数器控件、标签和重置按钮的窗口。当计数器的值更改时,标签的文本会更新为当前计数器的值。当用户点击重置按钮时,计数器的值将重置为默认值0。运行该程序,将会显示一个带有计数器控件、标签和重置按钮的窗口,您可以通过点击上下箭头或直接输入数字来更改计数器的值,也可以点击重置按钮将计数器的值重置为0。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSpinBox, QPushButton, QVBoxLayout, QHBoxLayout
from PyQt5.QtCore import Qt
class 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):
# 点击重置按钮时将计数器的值重置为默认值0
self.spinbox.setValue(0)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = CounterDemo()
demo.show()
sys.exit(app.exec_())
树控件(Tree Widget)是一种常见的用户界面控件,它可以用来展示层次化的数据结构,例如文件系统、目录结构、组织结构等等。树控件通常由多个节点(Node)组成,每个节点都可以包含多个子节点。
在PyQt5中,树控件是通过QTreeWidget类来实现的。下面是一些常用的树控件相关的概念:
树控件通常具有以下特点:
在PyQt5中,可以通过以下方法来操作树控件:
在这个案例中,我们创建了一个名为"组织结构图"的主窗口,并设置了固定的大小。然后,我们创建了一个树控件(QTreeWidget),并设置了树控件的列标题为"姓名"、“职位"和"部门”。
在populateTreeWidget()方法中,我们首先创建了根节点,并将其添加到树控件中。然后,我们创建了两个部门节点(department1和department2)作为根节点的子节点,以及每个部门节点下的员工节点。
每个节点的数据由一个字符串列表表示,其中包括员工的姓名、职位和部门信息。我们使用QTreeWidgetItem类来创建节点,并将其添加为父节点的子节点。
最后,我们展开了根节点,以便在组织结构图中显示默认的部门和员工关系。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidget, QTreeWidgetItem
class 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, ["总经理", "总经理", ""])
# 创建部门节点1
department1 = QTreeWidgetItem(root, ["市场部", "部门经理", ""])
employee1 = QTreeWidgetItem(department1, ["张三", "销售经理", "市场部"])
employee2 = QTreeWidgetItem(department1, ["李四", "市场专员", "市场部"])
# 创建部门节点2
department2 = 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_())
QTabWidget是Qt框架中的一个控件,用于创建和管理标签页(Tab)界面。它提供了一个选项卡式的布局,允许用户在不同的标签页之间切换,并且可以在每个标签页中显示不同的内容。
QTabWidget具有以下特点和功能:
QTabWidget在用户界面设计中经常被用于组织和管理复杂的界面结构。它适用于需要在不同的标签页中显示不同内容的场景,如选项卡式的设置界面、多标签文档编辑器、多标签浏览器等。使用QTabWidget,开发者可以方便地创建交互式、易于导航的界面,提升用户体验和操作效率。
以下是一个简单案例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QTabWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
# 创建主窗口
mainWindow = QMainWindow()
# 创建QTabWidget
tabWidget = QTabWidget(mainWindow)
# 创建标签页1
tab1 = QWidget()
layout1 = QVBoxLayout(tab1)
label1 = QLabel("这是标签页1")
layout1.addWidget(label1)
# 创建标签页2
tab2 = QWidget()
layout2 = QVBoxLayout(tab2)
label2 = QLabel("这是标签页2")
layout2.addWidget(label2)
# 将标签页添加到QTabWidget中
tabWidget.addTab(tab1, "标签页1")
tabWidget.addTab(tab2, "标签页2")
# 设置主窗口的中央部件为QTabWidget
mainWindow.setCentralWidget(tabWidget)
mainWindow.resize(400, 300)
mainWindow.show()
sys.exit(app.exec_())
堆栈窗口控件(QStackedWidget)是Qt框架提供的一种用于管理多个页面或窗口的容器控件。它可以显示多个子窗口,但每次只能显示其中的一个,其它子窗口则被隐藏。通过切换可见的子窗口,堆栈窗口控件允许用户在不同的页面之间进行导航和切换。
以下是堆栈窗口控件的一些特性和使用方法:
页面管理:堆栈窗口控件可以管理多个页面或窗口,每个页面都可以是一个QWidget或其子类。可以通过添加、插入和删除页面来动态管理堆栈中的子窗口。
导航和切换:通过在堆栈窗口控件中的子窗口之间进行切换,可以实现页面导航。可以使用setCurrentIndex()方法或setCurrentWidget()方法来设置当前可见的子窗口,从而切换页面。
信号和槽机制:堆栈窗口控件提供了一些信号,例如currentChanged信号,可以在当前页面发生变化时触发。可以使用这些信号与槽连接来处理页面切换时的逻辑。
堆栈管理:堆栈窗口控件维护一个内部的堆栈,用于跟踪页面的顺序。可以使用堆栈管理方法,如addWidget()、insertWidget()和removeWidget()来管理堆栈中的页面。
堆栈窗口控件适用于需要在不同页面之间进行切换或导航的应用程序场景,例如设置向导、多页表单、步骤流程等。通过使用堆栈窗口控件,可以方便地管理和显示多个页面,并实现简单而直观 的界面切换和导航效果。
停靠控件(Dock Widget)是一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。
在 PyQt 中,停靠控件由 QDockWidget 类实现。它可以与 QMainWindow 或 QMainWindows 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。
停靠控件通常具有以下特点和用途:
可停靠性:停靠控件可以通过拖拽的方式在主窗口中进行停靠,用户可以将其放置在合适的位置,如顶部、底部、左侧或右侧,也可以在主窗口之外浮动显示。这样,用户可以根据需要自定义界面的布局,使得工作区域更加整洁和高效。
提供附加功能:停靠控件通常用于承载应用程序的附加功能模块,如工具栏、属性面板、输出窗口等。通过将相关的功能模块组织在不同的停靠控件中,用户可以方便地切换和使用这些功能,提高工作效率。
用户自定义:停靠控件通常提供了用户自定义的能力,允许用户根据自己的喜好和工作流程调整界面布局。用户可以自由地调整停靠控件的大小、位置和停靠方式,以适应不同的工作环境和任务需求。
在使用停靠控件时,可以通过以下步骤实现:
创建停靠控件对象:使用 QDockWidget 类创建一个停靠控件对象,并将需要承载的内容设置为其子部件。
设置停靠属性:可以设置停靠控件的标题、图标、位置等属性,以及允许的停靠区域和停靠方式。
将停靠控件添加到主窗口:使用 QMainWindow 或 QMainWindows 的派生类将停靠控件添加到主窗口中的合适位置,通常使用 addDockWidget() 方法来完成。
通过使用停靠控件,用户可以轻松实现界面的灵活布局和组织,以适应不同的任务和工作流程。停靠控件的可停靠性、自定义性和附加功能使得应用程序更加可扩展和易用,提供了良停靠控件(Dock Widget)是一种常用的界面布局控件,它允许用户在主窗口中创建可停靠的面板或工具栏,以便对应用程序进行灵活的布局和组织。停靠控件提供了一种便捷的方式来管理和切换应用程序的功能模块,使用户可以根据自己的需求动态调整界面布局。
在 PyQt 中,停靠控件由 QDockWidget 类实现。它可以与 QMainWindow 或 QMainWindow 的派生类一起使用,使得应用程序的主窗口可以容纳多个停靠控件,并支持拖动、停靠和浮动等操作。
停靠控件的主要特点和用途如下:
可停靠性:停靠控件可以通过拖拽的方式在主窗口中进行停靠。用户可以将其放置在合适的位置,如顶部、底部、左侧或右侧,也可以在主窗口之外浮动显示。这种灵活性使得用户可以根据实际需求自定义界面布局,提高工作效率。
提供附加功能:停靠控件通常用于承载应用程序的附加功能模块,如工具栏、属性面板、输出窗口等。通过将相关的功能模块组织在不同的停靠控件中,用户可以方便地切换和使用这些功能,提高工作效率。
用户自定义:停靠控件通常提供了用户自定义的能力,允许用户根据自己的喜好和工作流程调整界面布局。用户可以自由地调整停靠控件的大小、位置和停靠方式,以适应不同的工作环境和任务需求。
在使用停靠控件时,可以按照以下步骤进行:
创建停靠控件对象:使用 QDockWidget 类创建一个停靠控件对象,并将需要承载的内容设置为其子部件。
设置停靠属性:可以设置停靠控件的标题、图标、位置等属性,以及允许的停靠区域和停靠方式。
将停靠控件添加到主窗口:使用 QMainWindow 或 QMainWindow 的派生类将停靠控件添加到主窗口中的合适位置,通常使用 addDockWidget() 方法来完成。
通过使用停靠控件,用户可以轻松实现界面的灵活布局和组织,以适应不同的任务和工作流程。停靠控件的可停靠性、自定义性和附加功能使得应用程序更加可扩展和易用,提供了良好的用户体验。
综合案例实现:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QTextEdit, QAction, QFileDialog, QMessageBox, QVBoxLayout, QWidget, QLabel, QPushButton, QTreeWidget, QTreeWidgetItem
class 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_())
P84