创建主窗口
主窗口的类型
- 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) #单位是ms
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
app.setWindowIcon(QIcon('./images/resume_nor.png')) # 设置图标,没有办法显示图标
main = FirstMainWin()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
让主窗口居中显示
代码
# QDesktopWidget
import 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)
pass
def center(self):
'''
让窗口居中
:return:
'''
# 获取屏幕的坐标
screen = QDesktopWidget.screenGeometry()
# 获取窗口坐标
size = self.geometry()
# 获取中间位置坐标
newLeft = (screen.width()-size.width())/2
newTop = (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) # 设置窗口的尺寸
# 添加Button
self.button1 = QPushButton('退出应用程序')
# 将信号与槽关联,将信号绑定在槽上
self.button1.clicked.connect(self.onc
layout = QHBoxLayout() # 创建水平布局
layout.addWidget(self.button1) # 把组件加到窗口中
mainFrame = QWidget() # 需要有一个主控件
mainFrame.setLayout(layout) # 把水平布局放到主控件中
self.setCentralWidget(mainFrame) # 把主控件放在整个窗口上
pass
# 按钮单击事件的方法(自定义的槽,相当于事件的方法)
def onClick_Button(self):
sender = self.sender() # 通过sender来获得button
print(sender.text() + '按钮被按下')
app = QApplication.instance()
# 退出应用程序
app.quit()
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QuitApplication()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
屏幕坐标系
- 相对于整个屏幕形成的坐标系,知道后可以控制控件的尺寸和位置。
- 格式化输出
- 使用 % 作为占位符:print(‘我的名字是%s:来自【%s】’%(name,classPro))
- .formate:print(‘姓名:{}’.format(name))
- 格式化输出
代码
import sys
from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QPushButton,QWidget
def 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()
pass
def 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) #单位是ms
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
app.setWindowIcon(QIcon('./controls/images/A.ico')) # 只能设计应用程序的图标
main = IconForm()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
为控件添加提示消息
代码
# 显示控件提示消息
import sys
from PyQt5.QtWidgets import QHBoxLayout,QMainWindow,QApplication,QToolTip,QPushButton,QWidget
from PyQt5.QtGui import QFont # 引入字体
class TooltipForm(QMainWindow):
def __init__(self):
super().__init__()
self.intiUI()
pass
def intiUI(self):
QToolTip.setFont(QFont('SansSerif',12))
self.setToolTip('今天是<b>星期五</b>') # 给窗口设置提示符
self.setGeometry(300, 300, 200, 300) # 设置工作区的位置,高度,宽度
self.setWindowTitle('设置控件提示消息')
self.resize(300, 120) # 设置窗口的尺寸
# 添加Button
self.button1 = QPushButton('我的按钮')
self.button1.setToolTip('这是一个按钮,Are you ok?')
layout = QHBoxLayout() # 创建水平布局
layout.addWidget(self.button1) # 把组件加到窗口中
mainFrame = QWidget() # 需要有一个主控件
mainFrame.setLayout(layout) # 把水平布局放到主控件中
self.setCentralWidget(mainFrame) # 把主控件放在整个窗口上
pass
pass
if __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 sys
from PyQt5.QtWidgets import QVBoxLayout, QMainWindow, QApplication, QPushButton, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QPalette # 用于绘图设备的图像显示(用于在标签或按钮上显示图像),设置Qlabel的背景色
from PyQt5.QtCore import Qt # 引入核心模块
class QLabelDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
pass
def 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标签时,触发事件')
pass
def linkClicked(self):
print('当鼠标单击label4标签时,触发事件')
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QLabelDemo()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
QLabel与伙伴控件
热键
只有在菜单显示时才会起作用,只有在 Windows 上才有这么一说。
伙伴关系
设置两个控件之间的关联,用一个控件控制另外一个控件。
概念
最所五个参数,第一个控件对象,第二三是控件位置,第四五是控件的尺寸。
mainLayout.addWidget(控件对象, 行索引, 列索引, 占用的行, 占用的列)
代码
import sys
from PyQt5.QtWidgets import *
class QLabelBuddy(QDialog):
def __init__(self):
super().__init__()
self.initUI()
pass
def 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,宽为2
mainLayout.addWidget(btnOK, 2, 1) # 在栅格的第3行,第2列
mainLayout.addWidget(btnCancel, 2, 2) # 在栅格的第3行,第3列
pass
pass
if __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 sys
from PyQt5.QtWidgets import *
class QLineEditEchoMode(QWidget):
def __init__(self):
super().__init__()
self.initUI()
pass
def 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) # 应用表单布局
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QLineEditEchoMode()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
限制QLineEdit控件的输入
校验器:限制只能输入整数、浮点数或满足一定条件的字符串。
代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator # 引入整数校验器,浮点型校验器,正则表达式校验器
from PyQt5.QtCore import QRegExp
class QLineEditValidator(QWidget):
def __init__(self):
super().__init__()
self.initUI()
pass
def 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)
pass
pass
if __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 sys
from PyQt5.QtWidgets import *
class QLineEditMask(QWidget):
def __init__(self):
super(QLineEditMask, self).__init__()
self.initUI()
pass
def 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)
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QLineEditMask()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
QLineEdit控件综合案例
代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
class QLineEditDemo(QWidget):
def __init__(self): # 实例化对象的时候自动调用,完成一些初始化设置
super(QLineEditDemo, self).__init__()
self.initUI()
pass
def 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)
pass
def textChanged(self, text):
print('输入的内容:' + text)
pass
def enterPress(self):
print('已输入的值')
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QLineEditDemo()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
使用QLineEdit控件输入多行文本
代码
结果
按钮控件QPushButton
在QPushButton上显示文本
代码
# 按钮可以支持图像
# 按钮可以支持开关
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QPushButtonDemo(QDialog):
def __init__(self):
super(QPushButtonDemo, self).__init__()
self.initUI()
pass
def 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)
# 使信号连接
pass
def whichButton(self,btn):
'''
知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定
:return: 返回被单击的按钮
'''
print('被单机的按钮是<' + btn.text() + '>')
pass
def buttonState(self):
if self.button1.isChecked():
print('button1已经被选中')
else:
print('button1未被选中')
pass
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QPushButtonDemo()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
在QPushButton上显示图像
代码
# 按钮可以支持图像
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QPushButtonDemo(QDialog):
def __init__(self):
super(QPushButtonDemo, self).__init__()
self.initUI()
pass
def 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)
pass
def whichButton(self,btn):
'''
知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定
:return: 返回被单击的按钮
'''
print('被单机的按钮是<' + btn.text() + '>')
pass
def buttonState(self):
if self.button1.isChecked():
print('button1已经被选中')
else:
print('button1未被选中')
pass
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QPushButtonDemo()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
让按钮不可用
代码
# 让按钮不可用
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QPushButtonDemo(QDialog):
def __init__(self):
super(QPushButtonDemo, self).__init__()
self.initUI()
pass
def 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)
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QPushButtonDemo()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
设置默认的按钮
没有任何按钮被选中,点击回车就是默认按钮被按下。
代码
# 设置默认按钮
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class QPushButtonDemo(QDialog):
def __init__(self):
super(QPushButtonDemo, self).__init__()
self.initUI()
pass
def 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)
pass
def whichButton(self,btn):
'''
知道哪个按钮被单击了,因为有多个信号同时使用这个槽,通过传参数确定
:return: 返回被单击的按钮
'''
print('被单机的按钮是<' + btn.text() + '>')
pass
pass
if __name__ == '__main__': # 只有这个文件单独执行才会调用该语句
app = QApplication(sys.argv) # 传入参数
main = QPushButtonDemo()
main.show()
sys.exit(app.exec_()) # 进入程序的主循环
结果
单选按钮控件
代码
结果
复选框控件
代码
结果
下拉列表控件
代码
结果
计数器控件
代码
结果
滑块控件
代码
结果
已经发生的事情没有办法改变,想好了补救措施,时间到了就去做,想再多浪费再多的时间也没有用。还不如花时间做好当下的事情。