PyQt5入门:一篇就够
后台-插件-广告管理-内容页头部广告(手机) |
PyQt5入门
(一)、窗口基本功能
1、第一个程序
编写一个PyQt5程序必须使用两个类:QApplication 和 QWidget ,这两个类都在PyQt5.QtWidgets模块中,所以首先要导入这个模块。
- QApplication 类的实例表示整个应用程序,该类得构造方法需要传入Python程序得命令行参数(需要导入sys模块)
- QWidget 类的实例相当于一个窗口
- show 方法显示串口
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
2、为窗口添加图标
import sys from PyQt5.QtWidgets import QApplication, QWidget # 导入QIcon类,用于装载图像文件 from PyQt5.QtGui import QIcon if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() # 设置窗口 位置(左,上) + 尺寸(宽,高) w.setGeometry(200, 100, 500, 300) w.setWindowTitle("图标效果") # 设置窗口图标 w.setWindowIcon(QIcon("./icon.png")) w.show() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
3、鼠标悬浮显示提示框
- 显示提示框需要使用 QWidget类的setToolTip方法,需要引入QToolTip
- setToolTip 方法接收一个字符串类型的参数值,作为提示框显示文本;将鼠标放置在设置的区域不动,1秒后显示提示框,如果鼠标不动,提示框会在几秒后消失
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
4、关闭窗口
QCoreApplication类是一个基础的应用程序类,它提供了Qt应用程序的事件循环、命令行参数处理、消息翻译和应用程序版本号等基本功能。它是PyQt5应用程序的基础,可以用来实现很多不同类型的应用程序。
- 关闭窗口可以使用系统内置的quit方法
- 如果要通过按键关闭窗口,可以间按键的单击事件与quit绑定
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
5、消息盒子
消息盒子(MessageBox)其实就是各种类型的消息对话框,如消息对话框、警告对话框、询问对话框等
- 主要组成:图标,提示信息,按键
QMessageBox类提供了若干个静态方法可以显示各种类型的对话框
- information方法用于显示信息对话框
- warning方法用于显示警告对话框
- question方法用于显示询问对话框
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
6、窗口居中
import sys from PyQt5.QtWidgets import QApplication, QWidget class CenterWindow(QWidget): def __init__(self): super(CenterWindow, self).__init__() self.initUI() def initUI(self): self.resize(500, 300) # 调用center方法将窗口在屏幕中心显示 self.center() self.setWindowTitle("窗口居中") self.show() def center(self): desktop = app.desktop() # 需要int类型的数据,float可能在后续版本会删除 self.move(int((desktop.width() - self.width()) / 2), int((desktop.height() - self.height()) / 2)) if __name__ == "__main__": app = QApplication(sys.argv) ex = CenterWindow() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 代码改进(将app写入类中)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
(二)、布局
1、绝对布局
绝对布局非常灵活,但是又局限性
- 不会随着窗口的变化而变化
- 无法使用不同平台和不同分辨率的显示器
- 更改字体大小会破坏布局
- 重构时,需要对每个控件重新设置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
2、盒布局
使用盒布局能让程序具有更强的适应性。盒布局分为: 水平盒布局QHBoxLayout 和 垂直盒布局QVBoxLayout
- 水平盒布局是将控件沿水平反向摆放
- 垂直盒布局是将控件沿垂直反向摆放
如果要对控件使用盒布局,需要通过盒布局对象的addWidget方法将控件添加到盒布局中。如果要将一个布局添加到盒布局中作为子布局存在,需要通过盒布局对象的addLayout方法将布局对象添加到盒布局中。
例子:在屏幕右下角放置两个按键,思路:
- 先建立一个水平盒布局,让两个按键始终在右侧
- 然后建立一个垂直盒布局,将水平盒布局添加到垂直盒布局中
- 最后让垂直盒布局始终在屏幕下方
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
3、网格布局
网格布局相当于一个二维表,将窗口划分为若干个行 和 若干个列。一个控件可以摆放在一个单元格中,也可以横跨多行多列。
- 网格布局用QGridLayout类表示
- 该类常用的方法是addWidget,可以将一个控件添加到网格布局中,并指定该控件从第几行第几列开始,以及张勇几行几列
- 还可以使用addSpacing方法指定在水平和垂直方向单元格之间的距离
例子:创建一个提交数据的表单窗口,包含 QLabel控件 和 三个文本编辑框(QLineEdit 和 QTextEdit)
- QLineEdit:单行文本编辑框
- QTextEdit:多行文本编辑框
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
(三)、控件
1、QPushButton控件
QPushButton是一个按钮控件,支持两种状态,一种是Normal状态,另外一种是Checked状态
- Normal 状态就是未按下的状态
- Checked 状态就是被按下的状态,按下后颜色变成蓝色,表示被选中
例子:用三个按键控制 QFrame 控件的背景颜色
import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QFrame from PyQt5.QtGui import QColor class PushButton(QWidget): def __init__(self): super(PushButton, self).__init__() self.initUI() def initUI(self): # 初始化颜色为黑色 self.color = QColor(0, 0, 0) btn_red = QPushButton("红", self) btn_green = QPushButton("绿", self) btn_blue = QPushButton("蓝", self) # 将按键设为 可选中 状态,点击按钮后,按键状态将保持在选中(checked)状态,再次点击后将取消选中状态 btn_red.setCheckable(True) btn_green.setCheckable(True) btn_blue.setCheckable(True) # 按键是否按下装换成 bool型数据(True, False) 传递到下面的 setColor 方法中,设置self.color的颜色 btn_red.clicked[bool].connect(self.setColor) btn_green.clicked[bool].connect(self.setColor) btn_blue.clicked[bool].connect(self.setColor) self.frame_show = QFrame(self) self.frame_show.resize(300, 300) # setStyleSheet()设置QFrame背景颜色,默认语句是:frame_show.setStyleSheet("background-color: red") self.frame_show.setStyleSheet("background-color:{}".format(self.color.name())) grid = QGridLayout() grid.setSpacing(15) grid.addWidget(btn_red, 1, 0) grid.addWidget(btn_green, 1, 1) grid.addWidget(btn_blue, 1, 2) grid.addWidget(self.frame_show, 3, 0, 5, 3) self.setLayout(grid) self.setGeometry(200, 200, 800, 500) self.setWindowTitle("QPushButton控件") self.show() def setColor(self, pressed): # QWidget.sender() 返回发送信号的对象,获取单击了哪个按键 source = self.sender() # 设置颜色的rgb值,按下设置255,没按下设置0 if pressed: flag = 255 else: flag = 0 if source.text() == "红": self.color.setRed(flag) elif source.text() == "绿": self.color.setGreen(flag) elif source.text() == "蓝": self.color.setBlue(flag) self.frame_show.setStyleSheet("background-color:{}".format(self.color.name())) if __name__ == "__main__": app = QApplication(sys.argv) LW = PushButton() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
2、QLineEdit控件
单行文本编辑框
例子:QLineEdit中输入内容,会同步显示再QLabel控件中
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QLabel, QGridLayout class LineEdit(QWidget): def __init__(self): super(LineEdit, self).__init__() self.initUI() def initUI(self): self.label = QLabel(self) lineEdit = QLineEdit(self) grid = QGridLayout() grid.setSpacing(5) grid.addWidget(self.label, 1, 0, 1, 3) grid.addWidget(lineEdit, 2, 0, 1, 3) self.setLayout(grid) # 将QLineEdit中的数据发送到下面的 changeText 方法中(使用textChanged方法) lineEdit.textChanged[str].connect(self.changeText) self.setGeometry(200, 200, 500, 500) self.setWindowTitle("QLineEdit控件") self.show() def changeText(self, text): self.label.setText(text) # 将QLabel设置成自适应 self.label.adjustSize() if __name__ == "__main__": app = QApplication(sys.argv) LW = LineEdit() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
3、QCheckBox控件
QCheckBox控件常用的事件是stateChanged,当QCheckBox控件选中状态发生变化是会触发该事件
例子:勾选改变title
- 此方法是通过 sender 方法接收信号,一次只能接收一个信号,导致与我们要的效果不符
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 改进:通过判断 全局按键 是否按压,并将数据导入列表中来实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
4、 QRadionButton控件
import sys from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton, QVBoxLayout class RadioButton(QWidget): def __init__(self): super(RadioButton, self).__init__() self.initUI() def initUI(self): vbox = QVBoxLayout() self.btn_radio_a = QRadioButton("A", self) # 默认选中 self.btn_radio_a.setChecked(True) # 发送被选中的按键的信息 self.btn_radio_a.toggled.connect(self.radioToggle) self.btn_radio_b = QRadioButton("B", self) self.btn_radio_b.toggled.connect(self.radioToggle) self.btn_radio_c = QRadioButton("C", self) self.btn_radio_c.toggled.connect(self.radioToggle) self.btn_radio_d = QRadioButton("D", self) self.btn_radio_d.toggled.connect(self.radioToggle) vbox.addWidget(self.btn_radio_a) vbox.addWidget(self.btn_radio_b) vbox.addWidget(self.btn_radio_c) vbox.addWidget(self.btn_radio_d) self.setLayout(vbox) self.setGeometry(200, 200, 500, 300) self.setWindowTitle("QRadioButton控件") self.show() def radioToggle(self): sender = self.sender() if sender == self.btn_radio_a and self.btn_radio_a.isChecked(): print("A") elif sender == self.btn_radio_b and self.btn_radio_b.isChecked(): print("B") elif sender == self.btn_radio_c and sender.isChecked(): print("C") elif sender == self.btn_radio_d and sender.isChecked(): print("D") if __name__ == "__main__": app = QApplication(sys.argv) LW = RadioButton() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
5、QSlider控件
QSlider滑块控件,用于控制值在一定的范围变化。
- 可以将QSlider控件的valueChanged事件与一个方法绑定,用来监听滑块移动的动作。
- 可以使用setMinimum方法和setMaximum设置滑块的限度(变化的最小值和最大值)
例子:QSlider 改变 QLabel 的值
import sys from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QLabel from PyQt5.QtCore import Qt class Slider(QWidget): def __init__(self): super(Slider, self).__init__() self.initUI() def initUI(self): # 创建滑块 (滑块移动的方向,所在位置) sld = QSlider(Qt.Horizontal, self) sld.setMinimum(0) sld.setMaximum(300) sld.setGeometry(30, 40, 300, 30) # 事件绑定 sld.valueChanged[int].connect(self.changeValue) self.label = QLabel(self) self.label.setGeometry(350, 40, 80, 30) self.setGeometry(200, 200, 500, 300) self.setWindowTitle("QSlider控件") self.show() def changeValue(self, value): self.label.setText(str(value)) if __name__ == "__main__": app = QApplication(sys.argv) LW = Slider() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
6、QProgressBar控件
QProgressBar 是进度条控件,效果与 QSlider控件类似,只是没有滑块
- 要改变QProgressBar 控件的当前值,需要通过QProgressBar控件的setValue方法
- QProgressBar 控件默认最小值为0,默认最大值为100,可以使用setMinimum方法和setMaximum设置最小值和最大值
- 可以通过minimum和maximum方法获取最小值和最大值
例子:点击按键开始,开始计时(按键变成取消),100ms更新一次QProgressBar控件的值,直到最大值
import sys from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QPushButton from PyQt5.QtCore import QBasicTimer class ProgressBar(QWidget): def __init__(self): super(ProgressBar, self).__init__() self.initUI() def initUI(self): self.pbar = QProgressBar(self) self.pbar.setGeometry(30, 30, 400, 30) self.btn = QPushButton("开始", self) self.btn.move(440, 30) self.btn.clicked.connect(self.changeButtonState) # 创建定时器 self.timer = QBasicTimer() # 初始化QProgressBar的值 self.value = 0 self.setGeometry(200, 200, 800, 300) self.setWindowTitle("QProgressBar控件") self.show() def changeButtonState(self): if self.timer.isActive(): self.timer.stop() self.btn.setText("继续") else: # 启动定时器,时间间隔是100ms self.timer.start(100, self) self.btn.setText("暂停") # 定时器调用的方法,名字必须是timeEvent def timerEvent(self, e: 'QTimerEvent') -> None: if self.value >= 100: self.timer.stop() self.btn.setText("完成") # return 空,程序结束才不会自动退出 return self.value += 1 # 更新QProgressBar的值 self.pbar.setValue(self.value) if __name__ == "__main__": app = QApplication(sys.argv) LW = ProgressBar() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
7、QPixmap控件
QPixmap是用于显示图像的控件,通过QPixmap类的构造方法可以指定要显示的图像文件名
例子:在窗口的左边显示一张照片
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout from PyQt5.QtGui import QPixmap class Pixmap(QWidget): def __init__(self): super(Pixmap, self).__init__() self.initUI() def initUI(self): pixmap = QPixmap("./icon.png") label = QLabel(self) label.setPixmap(pixmap) hbox = QHBoxLayout(self) hbox.addWidget(label) self.setLayout(hbox) self.setGeometry(200, 200, 800, 800) self.setWindowTitle("QPixmap控件") self.show() if __name__ == "__main__": app = QApplication(sys.argv) LW = Pixmap() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
8、QComboBox控件
QComboBox 是下拉列表控件,允许在列表中显示多个值,并且选择其中一个
- 可以使用QComboBox对象的addItem方法添加列表项,并通过QComboBox控件的activated事件处理选择列表项的动作
例子:QComboBox 选中后将数据显示在 QLabel 中
注意:setFixedSize() 方法将控件大小限制为一个固定的值,而 resize() 方法允许控件的大小随着内容的改变而自适应
import sys from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QLabel, QHBoxLayout, QVBoxLayout from PyQt5.QtCore import Qt class ComboBox(QWidget): def __init__(self): super(ComboBox, self).__init__() self.initUI() def initUI(self): combobox = QComboBox(self) # 设置控件的固定长宽 combobox.setFixedSize(100, 30) # 将显示内容居中(需要开启编辑功能) combobox.setEditable(True) combobox.lineEdit().setAlignment(Qt.AlignCenter) # 添加数据 combobox.addItems(["1", "2", "3", "4", "5"]) # 默认不选择数据(当前的索引为-1),要在数据设置之后才会生效 combobox.setCurrentIndex(-1) combobox.activated[str].connect(self.showComboBoxItem) self.label = QLabel("None", self) # 将显示内容居中 self.label.setAlignment(Qt.AlignCenter) self.label.setFixedSize(100, 30) # 为QLabel添加背景颜色 self.label.setStyleSheet("background-color:{}".format("#3399FF")) hbox = QHBoxLayout() hbox.addWidget(combobox) hbox.addWidget(self.label) hbox.addStretch() vbox = QVBoxLayout() vbox.addLayout(hbox) vbox.addStretch() self.setLayout(vbox) self.setGeometry(200, 200, 500, 500) self.setWindowTitle("QComboBox控件") self.show() def showComboBoxItem(self, text): self.label.setText(text) if __name__ == "__main__": app = QApplication(sys.argv) LW = ComboBox() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
9、QCalendarWidget控件
QCalendarWidget 是用于显示日历的控件,可以按年、月显示日历
- 通过setGridVisibel方法可以设置是否在日期中显示网格
- 通过绑定 clicked事件,可以处理单击日历某一天的动作
例子:单击 QCalendarWidget 控件的某一天时,会在 QLable控件 中显示这一天的完整日期(包括星期)
import sys from PyQt5.QtWidgets import QApplication, QWidget, QCalendarWidget, QVBoxLayout, QLabel from PyQt5.QtCore import Qt, QDate class CalendarWidget(QWidget): def __init__(self): super(CalendarWidget, self).__init__() self.initUI() def initUI(self): calendar = QCalendarWidget(self) # 显示日历网格 calendar.setGridVisible(True) # 绑定事件 calendar.clicked[QDate].connect(self.showDate) self.label = QLabel("None", self) self.label.setAlignment(Qt.AlignCenter) self.label.setFixedHeight(40) self.label.setStyleSheet("background-color:{}".format("#0099FF")) vbox = QVBoxLayout() vbox.addWidget(calendar) vbox.addWidget(self.label) self.setLayout(vbox) self.setGeometry(200, 200, 500, 500) self.setWindowTitle("CalendarWidget控件") self.show() def showDate(self, date): strDate = str(date.toString()) strDateList = strDate.split(" ") setDate = strDateList[3] + "年-" + strDateList[1] + "-" + strDateList[2] + "日-" + strDateList[0] self.label.setText(setDate) if __name__ == "__main__": app = QApplication(sys.argv) LW = CalendarWidget() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
(四)、菜单
调用 QMainWindow类的 menuBar方法可以获得主窗口的 QMenuBar对象,该对象表示主窗口的菜单栏
- 通过 QMenuBar对象的addMenu方法可以在菜单栏中添加菜单项,然后通过addAction方法添加子菜单项
- QMainWindow.menuBar():菜单栏对象
- addMenu:一级菜单
- QMenu:二级菜单,可以在其内部添加QAction或三级菜单
- QAction:最小级别的菜单,不能在其内部添加二级菜单
例子:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QMenu class Menu(QMainWindow): def __init__(self): super(Menu, self).__init__() self.initUI() def initUI(self): # menuBar = QMenuBar(self) 这样生成的菜单栏不能自适应宽度 # 改进,使用QMainWindow.menuBar() menuBar = self.menuBar() fileMenu = menuBar.addMenu("文件") fMNew = QAction("新建", self) fMOpen = QAction("打开", self) # 绑定事件 fMOpen.triggered.connect(self.open) fMExit = QAction("退出", self) # 添加快捷键,并显示 fMExit.setShortcut("Ctrl+Q") # 调用内部方法关闭 fMExit.triggered.connect(self.close) fMSave = QMenu("保存", self) fMS1 = QAction("保存为.txt", self) fMS1.triggered.connect(self.saveAsTxt) fMS2 = QAction("保存为.csv", self) fMS3 = QAction("保存为.md", self) fMSave.addActions([fMS1, fMS2, fMS3]) fileMenu.addActions([fMNew, fMOpen, fMExit]) # 添加分割线 fileMenu.addSeparator() # fMSave 包含 子菜单,所以要用 addMenu 添加到菜单栏中 fileMenu.addMenu(fMSave) editMenu = menuBar.addMenu("编辑") eMCopy = QAction("复制", self) eMPaste = QAction("粘贴", self) eMDelete = QMenu("删除", self) eMD1 = QAction("删除当前", self) eMD2 = QAction("删除全部", self) eMDelete.addActions([eMD1, eMD2]) editMenu.addActions([eMCopy, eMPaste]) editMenu.addSeparator() editMenu.addMenu(eMDelete) helpMenu = menuBar.addMenu("帮助") hMAbout = QAction("关于", self) helpMenu.addAction(hMAbout) self.setGeometry(200, 200, 500, 500) self.setWindowTitle("菜单") self.show() # 响应菜单的方法 就写几个(文件-打开)、(文件-保存-保存为.txt)示范 def open(self): print("打开") def saveAsTxt(self): print("保存为.txt") if __name__ == "__main__": app = QApplication(sys.argv) LW = Menu() sys.exit(app.exec_())- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |