按钮控件(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()
def initUI(self):
self.setWindowTitle("QPushButton Demo")
self.resize(400, 300)
layout = QVBoxLayout()
# 创建button时可以设置button上的文本
self.button1 = QPushButton("第1个按钮")
# 也可以通过setText方法来设置button的文本
self.button1.setText("First Button1")
# 设置按钮类型为按下后不回弹起
self.button1.setCheckable(True)
# 绑定按钮和槽函数,其中使用lambda表达式来规定信号传入槽函数的参数
self.button1.clicked.connect(lambda:self.whichButton(self.button1))
# 按钮再绑定一个槽函数
self.button1.clicked.connect(self.buttonState)
# 在文本前显示图像
self.button2 = QPushButton("图像按钮")
self.button2.setIcon(QIcon("./image/pic1.ico"))
self.button2.clicked.connect(lambda:self.whichButton(self.button2))
# 设置一个不可用的按钮
self.button3 = QPushButton("不可用")
self.button3.setEnabled(False)
# 设置一个热键为Alt+M,且为默认按钮的按钮
self.button4 = QPushButton("&MyButton")
self.button4.setDefault(True)
self.button4.clicked.connect(lambda:self.whichButton(self.button4))
layout.addWidget(self.button1)
layout.addWidget(self.button2)
layout.addWidget(self.button3)
layout.addWidget(self.button4)
self.setLayout(layout)
def buttonState(self):
if self.button1.isCheckable():
print("按钮1已经被选中")
else:
print("按钮1未被选中")
def whichButton(self, btn):
print("被单击的按钮是<" + btn.text() + ">")
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QPushButtonDemo()
main.show()
sys.exit(app.exec_())
运行效果:
可以看到,按钮的文本有两种设置方法,一种是在设置QPushButton对象时,填入按钮名称,作为参数创建一个;第二种是在创建完后,使用QPushButton对象的setText()
方法设置。
此处,我们还使用了setCheckable()
(设为True)来将按钮设置为按下去不会弹起。
与其他的控件对象类似,QPushButton对象可以通过setIcon()
对象来设置按钮的图标,参数是一个可以用图片的文件路径初始化的QIcon对象。
注意到这里的信号和槽函数绑定操作使用了lambda表达式,作用是指定信号触发后,传入槽函数的参数;如果不指定,系统会自动匹配。
此外setEnable()
设定这个按钮可不可用,默认为True,即可用。
setDault()
函数的作用顾名思义,就是设定改按钮是否为开始时的默认按钮。默认为False,即不是默认的按钮。
单选按钮控件(QRadioButton)
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QRadioButtonDemo(QWidget):
def __init__(self):
super(QRadioButtonDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QRadioButton")
layout = QHBoxLayout()
self.button1 = QRadioButton("单选按钮1")
# 默认button1被选中
self.button1.setCheckable(True)
# toggled信号代表切换
self.button1.toggled.connect(self.buttonState)
self.button2 = QRadioButton("单选按钮2")
self.button2.toggled.connect(self.buttonState)
layout.addWidget(self.button1)
layout.addWidget(self.button2)
self.setLayout(layout)
def buttonState(self):
radioButton = self.sender()
if radioButton.text() == "单选按钮1":
if radioButton.isChecked() == True:
print('<' + radioButton.text() + "> 被选中")
else:
print('<' + radioButton.text() + "> 被取消选中")
if radioButton.text() == "单选按钮2":
if radioButton.isChecked() == True:
print('<' + radioButton.text() + "> 被选中")
else:
print('<' + radioButton.text() + "> 被取消选中")
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QRadioButtonDemo()
main.show()
sys.exit(app.exec_())
运行结果:
QRadioButton
:代表单选按钮类toggled
:信号。当控件的状态改变时,控件便会发出信号self.sender()
:代表当前窗口对象最新的一次发射信号的控件对象isChecked()
:表示当前对象是否被选中
复选框控件(QCheckBox)
复选框有三种状态:未选中:0、半选中:1、选中:2。都可以通过常量调用来使用。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QCheckBoxDemo(QWidget):
def __init__(self):
super(QCheckBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("复选框控件演示")
layout = QHBoxLayout()
self.checkBox1 = QCheckBox("复选框控件1")
self.checkBox1.setChecked(True)
self.checkBox1.stateChanged.connect(lambda:self.checkboxState(self.checkBox1))
self.checkBox2 = QCheckBox("复选框控件2")
self.checkBox2.stateChanged.connect(lambda:self.checkboxState(self.checkBox2))
self.checkBox3 = QCheckBox("半选中")
self.checkBox3.stateChanged.connect(lambda:self.checkboxState(self.checkBox3))
# 设置成半选中状态
self.checkBox3.setTristate(True) # 允许半选中
self.checkBox3.setCheckState(Qt.PartiallyChecked) # 初始状态为半选中
layout.addWidget(self.checkBox1)
layout.addWidget(self.checkBox2)
layout.addWidget(self.checkBox3)
self.setLayout(layout)
def checkboxState(self, cb):
check1Status = self.checkBox1.text() + ", isChecked=" + str(self.checkBox1.isChecked()) + "n"
check2Status = self.checkBox2.text() + ", isChecked=" + str(self.checkBox2.isChecked()) + "n"
check3Status = self.checkBox3.text() + ", isChecked=" + str(self.checkBox3.isChecked()) + "n"
print(check1Status + check2Status + check3Status)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QCheckBoxDemo()
main.show()
sys.exit(app.exec_())
运行结果:
在创建了checkBox1后,我们使用了setChecked()
方法使checkBox1处于被选中状态。需要注意的是setChecked()
方法和setCheckState()
方法的区别,setChecked()
只能在两种状态(选中和未选中之间切换),参数是True或False;setCheckState()
必须在半选中开启时才能用(也就是写入setTristate(True)
)
可以在三种状态之间切换,参数是用参数名封装的常数:
Qt.Unchecked
:未选中Qt.PartiallyChecked
:半选中Qt.Checked
:选中
下拉列表控件(QCombaBox)
什么是下拉列表控件呢?就拿我正在使用的Pycharm来说,右上角的工具栏都是下拉列表:
下面介绍如何在Python中创建并编辑下拉列表。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QComBoBoxDemo(QWidget):
def __init__(self):
super(QComBoBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("下拉列表控件演示")
self.resize(300, 100)
layout = QVBoxLayout()
self.label = QLabel("请选择编程语言")
self.cb = QComboBox()
self.cb.addItem("C++")
self.cb.addItem("Python")
self.cb.addItems(["Java", "C#", "Ruby"])
self.cb.currentIndexChanged.connect(self.selectionChange)
layout.addWidget(self.label)
layout.addWidget(self.cb)
self.setLayout(layout)
def selectionChange(self, i):
self.label.setText(self.cb.currentText())
# 根据设置的文本调整尺寸
self.label.adjustSize()
for count in range(self.cb.count()):
print("item" + str(count) + "=" + self.cb.itemText(count))
print("current index", i, "selection changed", self.cb.currentText())
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QComBoBoxDemo()
main.show()
sys.exit(app.exec_())
运行效果:
QComboBox()
:下拉菜单控件对象。addItem()
:QComboBox对象的方法,作用是往下拉菜单中添加一个选项,参数是字符串(str对象)addItems()
:QComboBox对象的方法,参数是列表,作用是将每一个列表成员作为一个选项添加到下拉菜单中。currentIndexChanged
:信号。顾名思义,当控件被选中的索引发生改变后,触发信号。adjustSize()
:label控件对象的方法,根据label当前的文本内容改变label控件的大小。count()
:QComboBox对象的方法,返回当前下拉菜单的选项数。itemText()
:QComboBox对象的方法,参数是索引,根据索引返回选项的文本内容。比如self.cb.itemText(0)
就是返回cb
这个下拉菜单的第一个选项的文本内容。currentText()
:QComboBox对象的方法,返回当前被选中的选项的文本内容。
滑块控件
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QSliderDemo(QWidget):
def __init__(self):
super(QSliderDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("滑块控件演示")
self.resize(300, 100)
layout = QVBoxLayout()
self.label = QLabel("你好 PyQt5")
self.label.setAlignment(Qt.AlignCenter)
self.slider = QSlider(Qt.Horizontal)
# 设置最小值
self.slider.setMinimum(12)
# 设置最大值
self.slider.setMaximum(48)
# 步长
self.slider.setSingleStep(3)
# 设置当前值
self.slider.setValue(18)
# 设置刻度的位置, 刻度在下方
self.slider.setTickPosition(QSlider.TicksBelow)
# 设置刻度的间隔
self.slider.setTickInterval(6)
self.slider.valueChanged.connect(self.valueChange)
layout.addWidget(self.label)
layout.addWidget(self.slider)
self.setLayout(layout)
def valueChange(self):
print("当前值:{}".format(self.slider.value()))
size = self.slider.value()
self.label.setFont(QFont("Arial", size))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QSliderDemo()
main.show()
sys.exit(app.exec_())
运行结果:
拉动滑块,“你好 PyQt5”会慢慢变大
QSlider()
:滑块对象。参数为Qt下的常量,根据参数的不同创建不同的滑块类型。Qt.Horizontal
:创建水平滑块。Qt.Vertical
:创建垂直滑块。
setMinimum()
&setMaximum()
:QSlider对象的方法,设置滑块代表的值的最小/最大值。value()
:QSlider对象的数据成员,代表当前滑块代表的值的大小。setSingleStep()
:QSlider对象的方法,设置滑动时的步长。setValue()
:设置当前滑块代表的值的大小。setTickPosition()
:设置滑块刻度的位置。参数是QSlider下的常量:QSlider.TicksBelow
:刻度在滑块下方。QSlider.TicksAbove
:刻度在滑块上方。QSlider.TicksLeft
:刻度在滑块左侧。QSlider.TickRight
:刻度在滑块右侧。QSlider.TicksBothSides
:刻度在滑块两侧都显示。QSlider.NoTicks
:没有刻度。
setTickInterval()
:设置刻度的间隔。valueChanged
:信号。滑块值变化触发的信号。
计数器控件
什么是计数器控件呢?计数器控件就是结合了可以输入直接输入数字的文本框和点击按钮调整数字大小的框。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class QSpinBoxDemo(QWidget):
def __init__(self):
super(QSpinBoxDemo, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("QSpinBox演示")
self.resize(300, 100)
layout = QVBoxLayout()
self.label = QLabel("当前值")
self.label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.label)
self.sb = QSpinBox()
# 设置当前值
self.sb.setValue(18)
# 设置最小值
self.sb.setMinimum(0)
# 设置最大值
self.sb.setMaximum(100)
layout.addWidget(self.sb)
self.sb.valueChanged.connect(self.valueChange)
self.setLayout(layout)
def valueChange(self):
self.label.setText("当前值:" + str(self.sb.value()))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QSpinBoxDemo()
main.show()
sys.exit(app.exec_())
运行结果: