文章目录
- 1. 按钮类
- 1.1 QPushButton
- 1.2 QRadioButton
- 1.3 QCheckBox
- 1.4 QComboBox 下拉列表
- 1.5 QSpinBox 计数器
- 1.6 QSlider 滑动条
- 2. 对话框类
- 2.1 QDialog
- 2.2 QMessageBox
- 2.3 QInputDialog
- 2.4 QFontDialog
- 2.5 QFileDialog
learn from 《PyQt5 快速开发与实战》
https://doc.qt.io/qtforpython/index.html
https://www.riverbankcomputing.com/static/Docs/PyQt5
1. 按钮类
所有的按钮都是继承自 QAbstractButton
1.1 QPushButton
- 长方形,文本标题 or 图标
设置快捷键:QPushButton('&Download')
, &
后面的字符就是快捷键,ALT + D
执行
# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 21:01
# @Author : Michael
# @File : qpush_button1.py
# @desc :import sysfrom PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QPushButton, QApplicationclass Form(QDialog):def __init__(self, parent=None):super().__init__(parent)self.setWindowTitle("QPushButton例子")layout = QVBoxLayout()self.button1 = QPushButton("Button1")self.button1.setCheckable(True) # 设置按钮已经被选中,表示按钮保持已点击和释放状态self.button1.toggle() # 切换按钮的状态self.button1.clicked.connect(lambda: self.whichButton(self.button1))# lambda 函数作用,可以传递更多的参数进去 self.button1self.button1.clicked.connect(self.btnstate)layout.addWidget(self.button1)self.button2 = QPushButton("image")self.button2.setIcon(QIcon(QPixmap("logo.png"))) # 设置图标self.button2.clicked.connect(lambda: self.whichButton(self.button2))layout.addWidget(self.button2)self.button3 = QPushButton("disabled button")self.button3.setEnabled(False) # 禁用layout.addWidget(self.button3)self.button4 = QPushButton("&Cancel")self.button4.setDefault(True)self.button4.clicked.connect(lambda: self.whichButton(self.button4))layout.addWidget(self.button4)self.setLayout(layout)def btnstate(self):if self.button1.isChecked():print("button1 is pressed")else:print("button1 is released")def whichButton(self, btn):print("clicked button is " + btn.text())if __name__ == '__main__':app = QApplication(sys.argv)ui = Form()ui.show()sys.exit(app.exec_())
1.2 QRadioButton
- 单选按钮组里,一次只能选中一个单选按钮
- 要选中多个,需要使用
QGroupBox,QButtonGroup
多个按钮组合 - 按钮切换状态时,会发送
toggled
信号
# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 21:34
# @Author : Michael
# @File : radio_button1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QRadioButton, QApplicationclass radio_button(QWidget):def __init__(self):super(radio_button, self).__init__()layout = QHBoxLayout()self.button1 = QRadioButton("Button1")self.button1.setChecked(True) # 默认选中self.button1.toggled.connect(lambda: self.btnstate(self.button1))layout.addWidget(self.button1)self.button2 = QRadioButton("Button2")self.button2.toggled.connect(lambda: self.btnstate(self.button2))layout.addWidget(self.button2)self.setLayout(layout)self.setWindowTitle("RadioButton例子")def btnstate(self, btn):if btn.text() == "Button1":if btn.isChecked():print("Button1 is selected")else:print("Button1 is deselected")elif btn.text() == "Button2":if btn.isChecked():print("Button2 is selected")else:print("Button2 is deselected")if __name__ == '__main__':import sysapp = QApplication(sys.argv)example = radio_button()example.show()sys.exit(app.exec_())
1.3 QCheckBox
一组带文本标签的复选框(可设置文本 or 图标),可选多个选项
注意:有选中、没选中、半选中(setTristate
)3 种状态
# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 21:58
# @Author : Michael
# @File : check_box1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QGroupBox, QHBoxLayout, QCheckBox, QVBoxLayout, QApplication
from PyQt5.QtCore import Qtclass checkBox(QWidget):def __init__(self):super().__init__()groupbox = QGroupBox("CheckBoxes")groupbox.setFlat(True)layout = QHBoxLayout()self.checkbox1 = QCheckBox("&CheckBox1")self.checkbox1.setChecked(True)self.checkbox1.stateChanged.connect(lambda: self.checkbox_state(self.checkbox1))layout.addWidget(self.checkbox1)self.checkbox2 = QCheckBox("CheckBox2")self.checkbox2.toggled.connect(lambda: self.checkbox_state(self.checkbox2))layout.addWidget(self.checkbox2)self.checkbox3 = QCheckBox("CheckBox3")self.checkbox3.setTristate(True)self.checkbox3.setCheckState(Qt.PartiallyChecked)self.checkbox3.stateChanged.connect(lambda: self.checkbox_state(self.checkbox3))layout.addWidget(self.checkbox3)groupbox.setLayout(layout)main_layout = QVBoxLayout()main_layout.addWidget(groupbox)self.setLayout(main_layout)self.setWindowTitle("CheckBoxes例子")def checkbox_state(self, checkbox):checkbox1_state = self.checkbox1.text() + ', isChecked=' + str(self.checkbox1.isChecked()) + ', checkState=' + str(self.checkbox1.checkState()) + '\n'checkbox2_state = self.checkbox2.text() + ', isChecked=' + str(self.checkbox2.isChecked()) + ', checkState=' + str(self.checkbox2.checkState()) + '\n'checkbox3_state = self.checkbox3.text() + ', isChecked=' + str(self.checkbox3.isChecked()) + ', checkState=' + str(self.checkbox3.checkState()) + '\n'print(checkbox1_state, checkbox2_state, checkbox3_state)if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = checkBox()main.show()sys.exit(app.exec_())
1.4 QComboBox 下拉列表
# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 22:19
# @Author : Michael
# @File : qcomboBox1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QComboBox, QApplicationclass combo_box1(QWidget):def __init__(self):super(combo_box1, self).__init__()self.setWindowTitle("combo_box例子")self.resize(300, 200)layout = QVBoxLayout()self.label1 = QLabel("选择语言")self.cb = QComboBox()self.cb.addItem("C")self.cb.addItem("C++")self.cb.addItem("Python")self.cb.addItems(["Java", "C#", "PHP"])self.cb.currentIndexChanged.connect(self.selectionchange)layout.addWidget(self.label1)layout.addWidget(self.cb)self.setLayout(layout)def selectionchange(self):self.label1.setText("你选择的语言是:" + self.cb.currentText())print('items in the list are:')for i in range(self.cb.count()):print(f'item {i} = {self.cb.itemText(i)}')print(f'current idx {i} selection changed to {self.cb.currentIndex()}')print('-'*10)if __name__ == '__main__':import sysapp = QApplication(sys.argv)combo_box1 = combo_box1()combo_box1.show()sys.exit(app.exec_())
1.5 QSpinBox 计数器
# _*_ coding: utf-8 _*_
# @Time : 2022/5/4 22:43
# @Author : Michael
# @File : spin_box1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QSpinBox, QDoubleSpinBox, QApplication
from PyQt5.QtCore import Qtclass spin_box1(QWidget):def __init__(self):super(spin_box1, self).__init__()self.setWindowTitle("SpinBox例子")self.resize(300, 100)layout = QVBoxLayout()self.lb1 = QLabel("当前得分:")self.lb1.setAlignment(Qt.AlignCenter)layout.addWidget(self.lb1)self.spbox = QSpinBox()self.spbox.setRange(0, 100)self.spbox.setValue(60)self.spbox.setSingleStep(2)self.spbox.valueChanged.connect(self.value_change)layout.addWidget(self.spbox)self.lb2 = QLabel("当前平均分:")self.lb2.setAlignment(Qt.AlignCenter)layout.addWidget(self.lb2)self.spbox_double = QDoubleSpinBox()self.spbox_double.setRange(0.0, 100.0)self.spbox_double.setValue(60.0)self.spbox_double.setDecimals(2)self.spbox_double.setSingleStep(0.50)self.spbox_double.valueChanged.connect(self.value_change1)layout.addWidget(self.spbox_double)self.setLayout(layout)def value_change(self):self.lb1.setText("当前得分:" + str(self.spbox.value()))def value_change1(self):self.lb2.setText("当前平均分:" + str(self.spbox_double.value()))if __name__ == '__main__':import sysapp = QApplication(sys.argv)w = spin_box1()w.show()sys.exit(app.exec_())
1.6 QSlider 滑动条
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 8:20
# @Author : Michael
# @File : slider1.py
# @desc :
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QSlider, QApplication
from PyQt5.QtCore import Qtclass slider_demo(QWidget):def __init__(self):super().__init__()self.setWindowTitle("滑块控件")self.resize(300, 100)layout = QVBoxLayout()self.label1 = QLabel('hello michael')self.label1.setAlignment(Qt.AlignCenter)layout.addWidget(self.label1)self.slider1 = QSlider(Qt.Horizontal) # 水平方向self.slider1.setMinimum(10) # 最小值self.slider1.setMaximum(50) # 最大值self.slider1.setSingleStep(3) # 步长self.slider1.setValue(20) # 当前值self.slider1.setTickPosition(QSlider.TicksBelow) # 刻度位置self.slider1.setTickInterval(5) # 刻度间隔layout.addWidget(self.slider1)self.slider1.valueChanged.connect(self.value_changed)self.setLayout(layout)def value_changed(self):print('当前滑块的值为:', self.slider1.value())size = self.slider1.value()self.label1.setFont(QFont('Arial', size))if __name__ == '__main__':import sysapp = QApplication(sys.argv)demo = slider_demo()demo.show()sys.exit(app.exec_())
2. 对话框类
2.1 QDialog
- 窗口模态
非模态,可以和程序其他窗口交互
窗口模态,程序未处理完当前窗口时,将阻止与父窗口对话
应用程序模态,阻止与任何其他窗口进行交互
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 8:57
# @Author : Michael
# @File : qdialog1.py
# @desc :
from PyQt5.QtWidgets import QMainWindow, QPushButton, QDialog, QApplication
from PyQt5.QtCore import Qtclass qdialog_demo(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("QDialog例子")self.resize(300, 200)self.button = QPushButton("弹出对话框", self)self.button.move(50, 50)self.button.clicked.connect(self.showdialog)def showdialog(self):dialog = QDialog()btn = QPushButton("ok", dialog)btn.move(50, 50)dialog.setWindowTitle("提交文件")dialog.setWindowModality(Qt.ApplicationModal)# 设置应用程序模态,只有关闭弹出窗口后,才能关闭主窗口dialog.exec_()
if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = qdialog_demo()main.show()sys.exit(app.exec_())
2.2 QMessageBox
有很多常用的,提示,警告,错误,询问,关于等,差别只是样式图标不一样
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 9:30
# @Author : Michael
# @File : qmessagebox1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QPushButton, QMessageBox, QApplicationclass QMessageBox1(QWidget):def __init__(self):super(QMessageBox1, self).__init__()self.setWindowTitle("QMessageBox1例子")self.resize(300, 200)self.button1 = QPushButton('点击弹出消息', self)self.button1.move(50, 50)self.button1.clicked.connect(self.msg)def msg(self):reply = QMessageBox.warning(self, 'Message标题', '你好,世界!', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:print('点击了Yes')else:print('点击了No')if __name__ == '__main__':import sysapp = QApplication(sys.argv)main = QMessageBox1()main.show()sys.exit(app.exec_())
2.3 QInputDialog
- 由一个文本框,两个按钮(OK,Cancel),提交的信息可以被父窗口使用
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 9:49
# @Author : Michael
# @File : input_dialog1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QFormLayout, QPushButton, QLineEdit, QInputDialog, QApplicationclass input_dialog1(QWidget):def __init__(self):super().__init__()layout = QFormLayout()self.btn1 = QPushButton('获取列表里的选项')self.btn1.clicked.connect(self.get_list_item)self.lineEdit1 = QLineEdit()layout.addRow(self.btn1, self.lineEdit1)self.btn2 = QPushButton('获取字符串')self.btn2.clicked.connect(self.get_str)self.lineEdit2 = QLineEdit()layout.addRow(self.btn2, self.lineEdit2)self.btn3 = QPushButton('获取整数')self.btn3.clicked.connect(self.get_int)self.lineEdit3 = QLineEdit()layout.addRow(self.btn3, self.lineEdit3)self.setLayout(layout)self.setWindowTitle('获取输入')def get_list_item(self):items = ('C', 'C++', 'Java', 'Python')item, ok = QInputDialog.getItem(self, '请选择语言', '语言列表', items, 0, False)if ok and item:self.lineEdit1.setText(item)def get_str(self):text, ok = QInputDialog.getText(self, '输入字符串对话框', '请输入字符串')if ok:self.lineEdit2.setText(text)def get_int(self):num, ok = QInputDialog.getInt(self, '输入整数对话框', '请输入整数')if ok:self.lineEdit3.setText(str(num))
if __name__ == '__main__':import sysapp = QApplication(sys.argv)win = input_dialog1()win.show()sys.exit(app.exec_())
2.4 QFontDialog
- 字体选择对话框
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 22:18
# @Author : Michael
# @File : qfont_dialog1.py
# @desc :
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QFontDialog, QApplicationclass fontDialog(QWidget):def __init__(self):super().__init__()layout = QVBoxLayout()self.fontButton = QPushButton('选择字体')self.fontButton.clicked.connect(self.chooseFont)layout.addWidget(self.fontButton)self.line1 = QLabel('hello michael, 你好啊')layout.addWidget(self.line1)self.setLayout(layout)self.setWindowTitle('字体对话框')def chooseFont(self):font, ok = QFontDialog.getFont()if ok:self.line1.setFont(font)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)ui = fontDialog()ui.show()sys.exit(app.exec_())
2.5 QFileDialog
- 打开、保存文件,可以设置文件类型过滤和初始位置
# _*_ coding: utf-8 _*_
# @Time : 2022/5/5 22:40
# @Author : Michael
# @File : file_dialog1.py
# @desc :
import timefrom PyQt5.QtCore import QDir
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QLabel, QTextEdit, QFileDialog, QApplicationclass file_dialog1(QWidget):def __init__(self):super(file_dialog1, self).__init__()layout = QVBoxLayout()self.btn = QPushButton('加载图片')self.btn.clicked.connect(self.loadfile)layout.addWidget(self.btn)self.label = QLabel()layout.addWidget(self.label)self.btn1 = QPushButton('加载文本文件')self.btn1.clicked.connect(self.loadfiles)layout.addWidget(self.btn1)self.content = QTextEdit() # 文本框layout.addWidget(self.content)self.setLayout(layout)self.setWindowTitle('文件对话框')def loadfile(self):fname, _ = QFileDialog.getOpenFileName(self, '打开文件', './', '图片文件(*.jpg *.png *gif)')self.label.setPixmap(QPixmap(fname))def loadfiles(self):dlog = QFileDialog()dlog.setFileMode(QFileDialog.AnyFile)dlog.setFilter(QDir.Files)if dlog.exec_():fnames = dlog.selectedFiles()print(fnames)with open(fnames[0], 'r', encoding='utf-8') as f:data = f.read()self.content.setText(data)
if __name__ == '__main__':import sysapp = QApplication(sys.argv)ui = file_dialog1()ui.show()sys.exit(app.exec_())