# QComboBox是组合控件
# 最小化展示,下拉按钮可以展开,选取多个预置选项
#
#继承自QWidget
#
from PyQt5.Qt import *
##############################################限制多行文本框输入为10-90的数字
##############################################QComboBox 验证器 对象
#
# 现在需求:
# 限制组合框 条目文本的数值
# 必须
# 数字 数字范围为10-90
#
# 解决方法:
# 验证器
#############################QComboBox 验证器 对象
class MyValidator(QValidator):
def __init__(self,parent=None,*args,**kwargs):
super().__init__(parent,*args,**kwargs)
#按照顺序 可接受 中间状态,无效 三种状态
def validate(self, p_str, p_int):
try:
current_num = int(p_str)
if 10<=current_num<=90:
return (QValidator.Acceptable,p_str,p_int)
elif 0<=current_num<10:
return (QValidator.Intermediate,p_str,p_int)
else:
return (QValidator.Invalid,p_str,p_int)
except:
if len(p_str)==0:
return (QValidator.Intermediate,p_str,p_int)
return (QValidator.Invalid,p_str,p_int)
def fixup(self, p_str):
try:
current_num = int(p_str)
if 0<=current_num<10:
return '10'
else:
return '90'
except:
return '50'
#############################限制多行文本框输入为10-90的数字
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QComboBox')
self.resize(500,500)
self.iniUI()
def iniUI(self):
cb = QComboBox(self)#构造函数只需要传递一个父控件
self.cb = cb
cb.resize(self.width() * 8 / 12, self.height() / 6)
cb.move((self.width() - cb.width()) / 2, (self.height() - cb.height()) / 2)
btn = QPushButton(self)
self.btn = btn
self.btn_w = self.width() / 3
self.btn_h = self.height() * 3 / 32
self.btn.resize(self.btn_w, self.btn_h)
self.btn_x = (self.width() - self.btn_w) / 2
self.btn_y = self.height() * 7 / 8 + (self.height() / 8 - self.btn_h) / 2
self.btn.setText('测试按钮')
self.btn.setStyleSheet('font-size:30px')
self.btn.move(self.btn_x, self.btn_y)
self.btn.clicked.connect(self.btn_text)
label = QLabel(self)
self.label = label
label.setText('豫章故郡,洪都新府')
label.setAlignment(Qt.AlignCenter)
label.setStyleSheet('font-size:35px;background-color:cyan;')
label.resize(self.cb.width(), self.cb.height())
label.move((self.width() - label.width()) / 2, self.cb.y() - self.cb.height() * 2.5)
fcb = QFontComboBox(self)
fcb.resize(self.cb.width()*2/3, self.cb.height()*2/3)
fcb.move((self.width() - fcb.width()) / 2, self.cb.y() - fcb.height() * 2)
fcb.currentFontChanged.connect(lambda fonte: self.label.setFont(fonte))
def comboBoxAddInsertSetItem(self):
self.cb.addItem(QIcon('aaa.png'),'PHP')
self.cb.addItem(QIcon('bbb.png'),'Matlab')
self.cb.addItems(['Python','C','C++','Java'])
self.cb.insertItem(1,QIcon('ccc.png'),'Fortran')
self.cb.insertSeparator(3)#在第三个条目前面插入分割线
self.cb.setItemText(1,'Rust')#设置对应索引位置处的文本
self.cb.setItemIcon(1,QIcon('ddd.png'))#设置对应索引位置处的图标
self.cb.removeItem(6)#删除条目
print(self.cb.count())
################################################设置为当前条目
def comboBoxSetCurrent(self):
self.comboBoxAddInsertSetItem()
self.cb.setCurrentIndex(2)#选择第二个条目,设置索引为2的条目为当前条目
self.cb.setCurrentText('Python')#设置名称为Python的条目为当前条目
self.cb.setEditable(True)
self.cb.setEditText('Python最牛批')
##############################################更改下拉列表界面展开时的模型结构
# QAbstractItemModel
# print(QAbstractItemModel.__subclasses__())
def comboBoxModel(self):
model = QStandardItemModel()#创建标准条目模型
item1 = QStandardItem('Python')#创建条目对象
item2 = QStandardItem('Sci_compute')
item21= QStandardItem('Fortran')
item22= QStandardItem('Rust')
model.appendRow(item1)#创建子对象
model.appendRow(item2)
item2.appendRow(item21)#创建子子对象
item2.appendRow(item22)
self.cb.setModel(model)#把模型设置给控件
# 把带有模型结构的控件 给树视角类,创建了一个视角对象,并将此视角设置给控件
# QTreeView的父类是QAbstractItemView
self.cb.setView(QTreeView(self.cb))
############################################更改下拉列表界面展开时的模型结构
##############################################QComboBox常用数据的获取
def comboBoxGetData(self):
self.comboBoxAddInsertSetItem()
print( self.cb.count(),'下拉列表条目总数')
print(self.cb.itemText(0))#PHP
print(self.cb.itemIcon(0))
self.cb.setCurrentText('C++')
print(self.cb.currentText())#C++
#############################QComboBox常用数据的获取
##############################################QComboBox最大条目个数,最多展示条目数量 限制
def comboBoxMax(self):
self.comboBoxAddInsertSetItem()
self.cb.setMaxCount(20) #设置最多可容纳的条目个数
self.cb.setMaxVisibleItems(18)#设置最多可展示的条目个数
#############################QComboBox最大条目个数,最多展示条目数量 限制
##############################################QComboBox常规操作
def comboBoxNormal(self):
self.comboBoxAddInsertSetItem()
self.cb.setEditable(True)#设置为可编辑
self.cb.setDuplicatesEnabled(True) #允许出现名称相同的条目
self.cb.setIconSize(QSize(60,60))
# self.cb.setSizeAdjustPolicy(QComboBox.AdjustToContents)
self.cb.setMinimumContentsLength(self.cb.width())#设置最小内容长度
self.cb.setSizeAdjustPolicy(QComboBox.AdjustToMinimumContentsLength)
# self.cb.clear() #清空所有的条目
# self.cb.clearEditText() #清空当前正编辑的条目文本
self.cb.showPopup() #使得组合框弹出下拉列表框
#############################QComboBox常规操作
##############################################QComboBox 完成器对象
def comboBoxCompleter(self):
self.cb.setEditable(True)
completer = QCompleter(['Python','PHP','VisualBasic','VFP','C++','C#'])
self.cb.setCompleter(completer)
#############################QComboBox 完成器对象
##############################################QComboBox 验证器 对象
#
# 现在需求:
# 限制组合框 条目文本的数值
# 必须
# 数字 数字范围为5-10
#
# 解决方法:
# 验证器
def comboBoxValidator(self):
self.cb.setEditable(True)
self.cb.setFocus()
validator = MyValidator()
self.cb.setValidator(validator)
#############################QComboBox 验证器 对象
##############################################QComboBox 信号相关
#
# activated(int_index)
# activated(str_text) 这两项必须是用户交互操作才能触发
# currentIndexChanged(int_index)
# currentIndexChanged(str_text)
# currentTextChanged(str_text)
#
def comboBoxSignal(self):
self.comboBoxAddInsertSetItem()
self.cb.activated.connect(lambda index:print('选中了第',index,'个条目,内容为:',self.cb.currentText()))
# self.cb.activated[str].connect(lambda text:print('选中的条目 文本为:',text))
# self.cb.currentIndexChanged.connect(lambda index:print('选中了第',index,'个条目,内容为:',self.cb.currentText()))
self.cb.currentIndexChanged[str].connect(lambda text:print('选中的条目 文本为:',text))
def btn_text(self):
# self.comboBoxAddInsertSetItem()
# self.comboBoxSetCurrent()
# self.comboBoxModel()
# self.comboBoxGetData()
# self.comboBoxMax()
# self.comboBoxNormal()
# self.comboBoxCompleter()
# self.comboBoxValidator()
self.comboBoxSignal()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
小白学习笔记,若感兴趣留个爪 ^. ^ hahah