创建主窗口
主窗口的类型
- QMainWindow(主窗口):可以包含菜单栏、工具栏、状态栏、标题栏;(最常见的窗口形式)
- QDialog:是对话窗口的基类;(没有菜单栏、工具栏、状态栏)
- QWidget :不确定窗口的用途,就是用QWidget;(即可以代替主窗口,又可以代替对话窗口)

代码
import sys # 获取参数from PyQt5.QtWidgets import QMainWindow,QApplication # 导入整个应用程序和窗口部件类from PyQt5.QtGui import QIcon # 添加图标class FirstMainWin(QMainWindow): #继承主窗口的方法def __init__(self):'''初始化方法:param parent:'''super(FirstMainWin,self).__init__() #第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)# 设置主窗口的标题self.setWindowTitle('第一个主窗口应用')# 设置窗口的尺寸self.resize(400,300)# 获得状态栏self.status=self.statusBar()# 在状态栏上显现消息self.status.showMessage('只存在5s的消息',5000) #单位是msif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数app.setWindowIcon(QIcon('./images/resume_nor.png')) # 设置图标,没有办法显示图标main = FirstMainWin()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

让主窗口居中显示
代码
# QDesktopWidgetimport sys # 获取参数from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication # 导入整个应用程序和窗口部件类from PyQt5.QtGui import QIcon # 添加图标class CenterForm(QMainWindow): #继承主窗口的方法def __init__(self):'''初始化方法:param parent:'''super(CenterForm,self).__init__() #第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)# 设置主窗口的标题self.setWindowTitle('让窗口居中')# 设置窗口的尺寸self.resize(400,300)passdef center(self):'''让窗口居中:return:'''# 获取屏幕的坐标screen = QDesktopWidget.screenGeometry()# 获取窗口坐标size = self.geometry()# 获取中间位置坐标newLeft = (screen.width()-size.width())/2newTop = (screen.height()-size.height())/2# 移动窗口坐标self.move(newLeft,newTop)if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = CenterForm()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

退出应用程序
QPushButton
QPushButton 类专门用来创建可按压的按钮。QPushButton 按钮上除了可以放置一串文本,文本左侧还可以放置图标,必要时还可以在按钮上放置图片。

QHBoxLayout
水平布局,是指将所有控件从左到右(或者从右到左)依次摆放。

代码
import sys # 获取参数from PyQt5.QtWidgets import QMainWindow, QApplication, QHBoxLayout, QPushButton, QWidget # QHBoxLayout水平布局class QuitApplication(QMainWindow): # 继承主窗口的方法def __init__(self):super(QMainWindow, self).__init__() # 第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)self.setWindowTitle('退出应用程序') # 设置主窗口的标题self.resize(300, 120) # 设置窗口的尺寸# 添加Buttonself.button1 = QPushButton('退出应用程序')# 将信号与槽关联,将信号绑定在槽上self.button1.clicked.connect(self.onclayout = QHBoxLayout() # 创建水平布局layout.addWidget(self.button1) # 把组件加到窗口中mainFrame = QWidget() # 需要有一个主控件mainFrame.setLayout(layout) # 把水平布局放到主控件中self.setCentralWidget(mainFrame) # 把主控件放在整个窗口上pass# 按钮单击事件的方法(自定义的槽,相当于事件的方法)def onClick_Button(self):sender = self.sender() # 通过sender来获得buttonprint(sender.text() + '按钮被按下')app = QApplication.instance()# 退出应用程序app.quit()passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QuitApplication()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果


屏幕坐标系
- 相对于整个屏幕形成的坐标系,知道后可以控制控件的尺寸和位置。
- 格式化输出
- 使用 % 作为占位符:print(‘我的名字是%s:来自【%s】’%(name,classPro))
- .formate:print(‘姓名:{}’.format(name))
- 格式化输出
代码
import sysfrom PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidgetdef onClinkButton():print('第一种获取坐标系的方法')print('widget.x() = %d' % widget.x()) # 250(窗口坐标),使用%做占位符,格式化输出print('widget.y() = %d' % widget.y()) # 200(窗口坐标),包含标题栏print('widget.width() = %d' % widget.width()) # 200(工作区宽度)print('widget.height() = %d' % widget.height()) # 240(工作区高度)print('第二种获取坐标系的方法')print('widget.geometry().x() = %d' % widget.geometry().x()) # 250(工作区横坐标),windows横着有边框print('widget.geometry().y() = %d' % widget.geometry().y()) # 228(工作区的纵坐标),窗口坐标系,不包含标题栏,由像素决定print('widget.geometry().width() = %d' % widget.geometry().width()) # 200(工作区宽度)print('widget.geometry().height() = %d' % widget.geometry().height()) # 240(工作区高度)print('第三种获取坐标系的方法')print('widget.frameGeometry().x() = %d' % widget.frameGeometry().x()) # 250(窗口横坐标)print('widget.frameGeometry().y() = %d' % widget.frameGeometry().y()) # 200(窗口纵坐标)print('widget.frameGeometry().width() = %d' % widget.frameGeometry().width()) # 200(窗口宽度)print('widget.frameGeometry().height() = %d' % widget.frameGeometry().height()) # 260(窗口高度)把标题栏包含在内的高度pass# 使用面向对象的方式app = QApplication(sys.argv)widget = QWidget()btn = QPushButton(widget)btn.setText('按钮')btn.clicked.connect(onClinkButton)btn.move(24,52)widget.resize(200,240) # 设置工作区的尺寸widget.move(250,200)widget.setWindowTitle('屏幕坐标系')widget.show()sys.exit(app.exec_())
结果

设置窗口和应用程序图标
- 窗口的 setWindowIcon 方法用于设置窗口的图标,只在 Windows、Linux 中可用;
- QApplication 中的 setWindowIcon 方法用于设置主窗口的图标和应用程序图标,但调用了窗口 setWindowIcon 方法,QApplication 方法就只能用于设置应用程序图标了。
代码
import sys # 获取参数from PyQt5.QtWidgets import QMainWindow,QApplication # 导入整个应用程序和窗口部件类from PyQt5.QtGui import QIcon # 添加图标class IconForm(QMainWindow): #继承主窗口的方法def __init__(self):super(QMainWindow,self).__init__() #第二种继承父类的方法,super().父类方法名;第一种父类名.方法名(self)self.initUI()passdef initUI(self):# 设置窗口的位置和尺寸self.setGeometry(0,0,250,250)# 设置主窗口的标题self.setWindowTitle('设置窗口图标')# 设置窗口图标# self.setWindowIcon(QIcon('./controls/images/A.ico')) # 在Mac上不显示任何图标,只能在windows下左上角显示图标# 获得状态栏self.status=self.statusBar()# 在状态栏上显现消息self.status.showMessage('只存在5s的消息',5000) #单位是msif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数app.setWindowIcon(QIcon('./controls/images/A.ico')) # 只能设计应用程序的图标main = IconForm()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

为控件添加提示消息
代码
# 显示控件提示消息import sysfrom PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QToolTip,QPushButton,QWidgetfrom PyQt5.QtGui import QFont # 引入字体class TooltipForm(QMainWindow):def __init__(self):super().__init__()self.intiUI()passdef intiUI(self):QToolTip.setFont(QFont('SansSerif',12))self.setToolTip('今天是<b>星期五</b>') # 给窗口设置提示符self.setGeometry(300, 300, 200, 300) # 设置工作区的位置,高度,宽度self.setWindowTitle('设置控件提示消息')self.resize(300, 120) # 设置窗口的尺寸# 添加Buttonself.button1 = QPushButton('我的按钮')self.button1.setToolTip('这是一个按钮,Are you ok?')layout = QHBoxLayout() # 创建水平布局layout.addWidget(self.button1) # 把组件加到窗口中mainFrame = QWidget() # 需要有一个主控件mainFrame.setLayout(layout) # 把水平布局放到主控件中self.setCentralWidget(mainFrame) # 把主控件放在整个窗口上passpassif __name__ == '__main__':app = QApplication(sys.argv)main = TooltipForm()main.show()sys.exit(app.exec_())
结果


QLabel控件的基本用法
用来显示文本信息
- setAlignment():设置文本的对齐方式
- setIndent():设置文本缩进
- text():获取文本内容
- setBuddy():设置伙伴关系
- setText():设置文本内容
- selectedText():返回所选择的字符
- setWordWrap():设置是否允许换行
QLabel常用的信号(事件)
- 当鼠标滑过QLabel控件时触发:linkHovered
- 当鼠标单机QLabel控件时触发:linkActivated
代码
import sysfrom PyQt5.QtWidgets import QVBoxLayout, QMainWindow, QApplication, QPushButton, QLabel, QWidgetfrom PyQt5.QtGui import QPixmap, QPalette # 用于绘图设备的图像显示(用于在标签或按钮上显示图像),设置Qlabel的背景色from PyQt5.QtCore import Qt # 引入核心模块class QLabelDemo(QWidget):def __init__(self):super().__init__()self.initUI()passdef initUI(self):label1 = QLabel(self)label2 = QLabel(self)label3 = QLabel(self)label4 = QLabel(self)label1.setText('<font color=yellow>这是一个文本标签')label1.setAutoFillBackground(True)palette = QPalette()palette.setColor(QPalette.Window, Qt.blue)label1.setPalette(palette)label1.setAlignment(Qt.AlignCenter) # 设置文本居中对齐label2.setText("<a href='#'>欢迎使用Python GUI程序</a>") # 后续会控制网页,跳转到事件label3.setAlignment(Qt.AlignCenter)label3.setToolTip('这是一个图片标签')label3.setPixmap(QPixmap('./images/picture.ico'))# 如果设为True,用浏览器打开网页,如果设为Flase,调用槽函数label4.setOpenExternalLinks(True)label4.setText("<a href='https://item.jd.com/12417265.html'>感谢关注《Python从菜鸟到高手》</a>")label4.setAlignment(Qt.AlignRight) # 让文字右对齐label4.setToolTip('这是一个超级链接')vbox = QVBoxLayout() # 创建垂直布局vbox.addWidget(label1) # 把组件添加到窗口中vbox.addWidget(label2)vbox.addWidget(label3)vbox.addWidget(label4)# 将信号与槽绑定label2.linkHovered.connect(self.linkHovered)label4.linkActivated.connect(self.linkClicked)self.setLayout(vbox)self.setWindowTitle('Qlabel控件演示')def linkHovered(self):print('当鼠标滑过label2标签时,触发事件')passdef linkClicked(self):print('当鼠标单击label4标签时,触发事件')passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QLabelDemo()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

QLabel与伙伴控件
热键
只有在菜单显示时才会起作用,只有在 Windows 上才有这么一说。
伙伴关系
设置两个控件之间的关联,用一个控件控制另外一个控件。
概念
最所五个参数,第一个控件对象,第二三是控件位置,第四五是控件的尺寸。
mainLayout.addWidget(控件对象, 行索引, 列索引, 占用的行, 占用的列)
代码
import sysfrom PyQt5.QtWidgets import *class QLabelBuddy(QDialog):def __init__(self):super().__init__()self.initUI()passdef initUI(self):self.setWindowTitle('QLabel与伙伴关系')nameLabel = QLabel('&Name',self)nameLineEdit = QLineEdit(self)nameLabel.setBuddy(nameLineEdit) # 设置伙伴关系passwordLabel = QLabel('&Name', self)passwordLineEdit = QLineEdit(self)passwordLabel.setBuddy(passwordLineEdit)btnOK = QPushButton('&OK')btnCancel = QPushButton('$Cancel')# 使用栅格布局mainLayout = QGridLayout(self)mainLayout.addWidget(nameLabel, 0, 0) # 在栅格的第1行,第1列mainLayout.addWidget(nameLineEdit, 0, 1, 1, 2) # 在栅格的第1行,第2列,高为1,宽为2.最多五个参数,第一个参数是把什么控件添加到里面,mainLayout.addWidget(passwordLabel, 1, 0) # 在栅格的第2行,第1列mainLayout.addWidget(passwordLineEdit, 1, 1, 1, 2) # 在栅格的第2行,第2列,高为1,宽为2mainLayout.addWidget(btnOK, 2, 1) # 在栅格的第3行,第2列mainLayout.addWidget(btnCancel, 2, 2) # 在栅格的第3行,第3列passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QLabelBuddy()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果
苹果系统不显示热键,alt+热键可以直接跳转到该对话框。

QLineEdit控件与回显模式
基本功能
输入单行文本
高级功能
- 设置回显模式(EchoMode):当我们在 QLineEdit 里面输入文本时,会怎样将输入的文本显示,一共有四种回显模式;
- Normal:正常回显;
- NoEcho:没有回显(在 Linux 中输入密码时);
- Password:显示的时候是点,可以防止别人看到(在密码输入框中常见);
- PasswordEchoOnEdit:编辑的时候是正常的,焦点改变后变成点,先是 Normal 后是 Password。
代码
import sysfrom PyQt5.QtWidgets import *class QLineEditEchoMode(QWidget):def __init__(self):super().__init__()self.initUI()passdef initUI(self):self.setWindowTitle('文本输入框的回显模式')# 创建四个控件normalLineEdit = QLineEdit()noEchoLineEdit = QLineEdit()passwordLineEdit = QLineEdit()passwordOnEditLineEdit = QLineEdit()# 创建表单布局formLayout = QFormLayout()formLayout.addRow('normal', normalLineEdit) # 前面是控件的标签,后面是控件formLayout.addRow('noEcho', noEchoLineEdit)formLayout.addRow('password', passwordLineEdit)formLayout.addRow('passwordOnEdit', passwordOnEditLineEdit)# 显示提示信息,输入内容时提示会消失(placeholdertext)normalLineEdit.setPlaceholderText('normal')noEchoLineEdit.setPlaceholderText('noEcho')passwordLineEdit.setPlaceholderText('password')passwordOnEditLineEdit.setPlaceholderText('passwordOnEdit')# 设置文本输入框的模式normalLineEdit.setEchoMode(QLineEdit.Normal)noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)passwordLineEdit.setEchoMode(QLineEdit.Password)passwordOnEditLineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)self.setLayout(formLayout) # 应用表单布局passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QLineEditEchoMode()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果


限制QLineEdit控件的输入
校验器:限制只能输入整数、浮点数或满足一定条件的字符串。
代码
import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator # 引入整数校验器,浮点型校验器,正则表达式校验器from PyQt5.QtCore import QRegExpclass QLineEditValidator(QWidget):def __init__(self):super().__init__()self.initUI()passdef initUI(self):self.setWindowTitle('校验器')# 创建三个文本输入框,分别用来输入整数类型,浮点类型,满足正则表达式的(只能是数字和字母)intLineEdit = QLineEdit()doubleLineEdit = QLineEdit()regExpLineEdit = QLineEdit()# 设置提示文本intLineEdit.setPlaceholderText('请输入整型')doubleLineEdit.setPlaceholderText('请输入浮点类型')regExpLineEdit.setPlaceholderText('数字和字母')# 创建表单布局,把三个控件加入到表单中formlayout = QFormLayout()formlayout.addRow('整数类型 :', intLineEdit)formlayout.addRow('浮点类型 :', doubleLineEdit)formlayout.addRow('数字和字母:', regExpLineEdit)# 整数校验器[1,99]intValidator = QIntValidator(self) # self表明父对象intValidator.setRange(1, 99) # 设置校验器的范围# 浮点校验器[-360,360],精度要求小数点后2位(限制不是很准确,只能限制位数,不能限制范围)doubleValidator = QDoubleValidator()doubleValidator.setRange(-360, 360)doubleValidator.setNotation(QDoubleValidator.StandardNotation) # 标准的表示法,正常显示浮点数doubleValidator.setDecimals(2) # 设置精度,小数点后两位# 正则校验器,字符和数字reg = QRegExp('[a-zA-Z0-9]+') # 正则表达式,匹配范围内的值,至少有1次匹配成功regExpValidator = QRegExpValidator() # 创建正则表达式的校验器regExpValidator.setRegExp(reg) # 将正则表达式和正则校验器绑定在一起# 把创建的3个校验器和3个文本输入框绑定intLineEdit.setValidator(intValidator) # 只有文本控件才能设置校验器doubleLineEdit.setValidator(doubleValidator)regExpLineEdit.setValidator(regExpValidator)# 应用表单布局self.setLayout(formlayout)passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QLineEditValidator()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

使用掩码限制QLineEdit控件的输入
不理解什么是必须输入的,允许输入的?| 字符 | 含义 |
|---|---|
| A | ASCII字母字符是必须输入的(A-Z、a-z) |
| a | ASCII字母字符是允许输入的,但不是必须的(A-Z、a-z) |
| N | ASCII字母字符是必须输入的(A-Z、a-z、0-9) |
| n | ASCII字母字符是允许输入的,但不是必须的(A-Z、a-z、0-9) |
| X | 任何字符都是必须输入的 |
| x | 任何字符都是允许输入的,但不是必须输入的 |
| 9 | ASCII数字字符是必须输入的(0-9) |
| 0 | ASCII数字字符是允许输入的,但不是必须的(0-9) |
| D | ASCII数字字符是必须输入的(1-9) |
| d | ASCII数字字符是允许输入的,但不是必须的(1-9) |
| # | ASCII数字字符或加减符号是允许输入的,但不是必须的 |
| H | 十六进制格式字符是必须输入的(A-F、a-f、0-9) |
| h | 十六进制格式字符是允许输入的,但不是必须输入的(A-F、a-f、0-9) |
| B | 二进制格式字符是必须输入的(0-1) |
| b | 二进制格式字符是允许输入的,但不是必须的(0-1) |
| > | 所有的字母字符都大写 |
| < | 所有的字母字符都是小写 |
| ! | 关闭大小写转换 |
| \ | 使用”\”转义上面列出的字符 |
代码
import sysfrom PyQt5.QtWidgets import *class QLineEditMask(QWidget):def __init__(self):super(QLineEditMask, self).__init__()self.initUI()passdef initUI(self):self.setWindowTitle('用掩码限制QLineEdit控件的输入')# 创建四个控件ipLineEdit = QLineEdit()macLineEdit = QLineEdit()dateLineEdit = QLineEdit()licenseEdit = QLineEdit()#设置掩码ipLineEdit.setInputMask('000.000.00.00;_') # 192.168.21.45,当没有输入时是下划线,0:ASCII数字字符是允许输入的,但不是必须的(0-9)macLineEdit.setInputMask('HH:HH:HH:HH:HH:HH;_') # mac地址是两个两个的,H:十六进制格式字符是必须输入的(A-F、a-f、0-9)dateLineEdit.setInputMask('0000-00-00') # 设置日期licenseEdit.setInputMask('>AAAAA-AAAAA-AAAAA-AAAAA;#') # >:设置所有的字母字符都大写,A:ASCII字母字符是必须输入的(A-Z、a-z)# 创建表单布局,把三个控件加入到表单中formlayout = QFormLayout()formlayout.addRow('数字掩码 :', ipLineEdit)formlayout.addRow('Mac掩码 :', macLineEdit)formlayout.addRow('日期掩码 :', dateLineEdit)formlayout.addRow('许可证掩码:', licenseEdit)# 应用表单布局self.setLayout(formlayout)passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QLineEditMask()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

QLineEdit控件综合案例
代码
import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import Qtclass QLineEditDemo(QWidget):def __init__(self): # 实例化对象的时候自动调用,完成一些初始化设置super(QLineEditDemo, self).__init__()self.initUI()passdef initUI(self):self.setWindowTitle('QLineEdit控件综合案例')# 创建多个QLineEdit控件edit1 = QLineEdit()edit2 = QLineEdit()edit3 = QLineEdit()edit4 = QLineEdit()edit5 = QLineEdit()# 使用整数校验器edit1.setValidator(QIntValidator()) # 使用整数校验器edit1.setMaxLength(4) # 最多不超过四位edit1.setAlignment(Qt.AlignRight) # 设置文本对齐方式为右对齐edit1.setFont(QFont('Arial', 20)) # 设置字体为Arial,字号为20# 使用浮点校验器edit2.setValidator(QDoubleValidator(0.99, 99.99, 2)) # 范围(0.99,99.99)精度是2# 使用掩码edit3.setInputMask('99_9999_999999;#')# 用信号绑定事件edit4.textChanged.connect(self.textChanged)# 使用密码类型的回显模式,绑定事件edit5.setEchoMode(QLineEdit.Password)edit5.editingFinished.connect(self.enterPress)# 设置为只读模式edit6 = QLineEdit('Hello PyQt5')edit6.setReadOnly(True)# 创建表单布局,将控件放在表单中formLayout = QFormLayout()formLayout.addRow('整数校验器', edit1)formLayout.addRow('浮点数校验器', edit2)formLayout.addRow('Input Mask', edit3)formLayout.addRow('文本变化', edit4)formLayout.addRow('密码', edit5)formLayout.addRow('只读', edit6)# 应用表单布局self.setLayout(formLayout)passdef textChanged(self, text):print('输入的内容:' + text)passdef enterPress(self):print('已输入的值')passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QLineEditDemo()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

使用QLineEdit控件输入多行文本
代码
结果
按钮控件QPushButton

在QPushButton上显示文本
代码
# 按钮可以支持图像# 按钮可以支持开关import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *class QPushButtonDemo(QDialog):def __init__(self):super(QPushButtonDemo, self).__init__()self.initUI()passdef initUI(self):self.setWindowTitle('QPushButton Demo')# 创建Button控件self.button1 = QPushButton('第一个按钮')# 使用垂直布局layout = QVBoxLayout()# 设置第一个按钮self.button1.setText('First Button') # 用setTex来获得文本self.button1.setCheckable(True) # 要设置开关,先要设置为可复选的self.button1.toggle() # 用来设置开关,按一下不会自动的弹起来self.button1.clicked.connect(lambda: self.whichButton(self.button1)) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用self.button1.clicked.connect(self.buttonState) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用# 将按钮加到布局中layout.addWidget(self.button1)# 应用垂直布局self.setLayout(layout)# 使信号连接passdef whichButton(self,btn):'''知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定:return: 返回被单击的按钮'''print('被单机的按钮是<' + btn.text() + '>')passdef buttonState(self):if self.button1.isChecked():print('button1已经被选中')else:print('button1未被选中')passpasspassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QPushButtonDemo()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

在QPushButton上显示图像
代码
# 按钮可以支持图像import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *class QPushButtonDemo(QDialog):def __init__(self):super(QPushButtonDemo, self).__init__()self.initUI()passdef initUI(self):self.setWindowTitle('QPushButton Demo')# 创建Button控件self.button1 = QPushButton('图像按钮')# 使用垂直布局layout = QVBoxLayout()# 设置第一个按钮,在QPushButton上显示图像self.button1.setIcon(QIcon(QPixmap('./images/camera.ico')))# 将按钮加到布局中layout.addWidget(self.button1)# 绑定槽self.button1.clicked.connect(lambda: self.whichButton(self.button1)) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用# 应用垂直布局self.setLayout(layout)self.resize(400, 300)passdef whichButton(self,btn):'''知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定:return: 返回被单击的按钮'''print('被单机的按钮是<' + btn.text() + '>')passdef buttonState(self):if self.button1.isChecked():print('button1已经被选中')else:print('button1未被选中')passpasspassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QPushButtonDemo()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

让按钮不可用
代码
# 让按钮不可用import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *class QPushButtonDemo(QDialog):def __init__(self):super(QPushButtonDemo, self).__init__()self.initUI()passdef initUI(self):self.setWindowTitle('QPushButton Demo')# 创建Button控件self.button1 = QPushButton('不可用的按钮')self.button1.setEnabled(False) # 设置按钮不可用# 使用垂直布局layout = QVBoxLayout()# 将按钮加到布局中layout.addWidget(self.button1)# 应用垂直布局self.setLayout(layout)self.resize(400, 300)passif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QPushButtonDemo()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

设置默认的按钮
没有任何按钮被选中,点击回车就是默认按钮被按下。
代码
# 设置默认按钮import sysfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *class QPushButtonDemo(QDialog):def __init__(self):super(QPushButtonDemo, self).__init__()self.initUI()passdef initUI(self):self.setWindowTitle('QPushButton Demo')# 创建Button控件self.button1 = QPushButton('&MyButton') # 添加热键Alt+M# 设置默认按钮,一个窗口只能有一个self.button1.setDefault(True)# 使用垂直布局layout = QVBoxLayout()# 设置第一个按钮,在QPushButton上显示图像self.button1.setIcon(QIcon(QPixmap('./images/camera.ico')))# 将按钮加到布局中layout.addWidget(self.button1)# 绑定槽self.button1.clicked.connect(lambda: self.whichButton(self.button1)) # 用lambda表达式调用whichButton方法,不写的话是内部自动调用# 应用垂直布局self.setLayout(layout)self.resize(400, 300)passdef whichButton(self,btn):'''知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定:return: 返回被单击的按钮'''print('被单机的按钮是<' + btn.text() + '>')passpassif __name__ == '__main__': # 只有这个文件单独执行才会调用该语句app = QApplication(sys.argv) # 传入参数main = QPushButtonDemo()main.show()sys.exit(app.exec_()) # 进入程序的主循环
结果

单选按钮控件
代码
结果
复选框控件
代码
结果
下拉列表控件
代码
结果
计数器控件
代码
结果
滑块控件
代码
结果
已经发生的事情没有办法改变,想好了补救措施,时间到了就去做,想再多浪费再多的时间也没有用。还不如花时间做好当下的事情。
