我们在前面分别介绍了两种输入控件:纯键盘文本输入和步长调节器,下面我们来学习下组合框(下拉选择输入)。
一.简介
1.下拉框是一个组合控件(包含一个文本显示控件和一个按钮)。它默认显示最小的控件给用户来操作,并且可以用下拉选择的界面提供给用户更多的预置选项。
2.它是直接继承自QWidget。
二.功能作用
1.构造函数。
可以直接实例化,不用传递参数。
2.数据操作
数据的操作主要分对数据项的增删改和一些其他的操作
a.增加项目
下拉框的内容有两种增加方式:追加和指定位置添加。
QComboBox.addItem(self, text: str, userData: typing.Any = ...) #追加内容 QComboBox.addItem(self, icon: QtGui.QIcon, text: str, userData: typing.Any = ...) #追加内容(带图标) QComboBox.insertItem(self, index: int, text: str, userData: typing.Any = ...) #指定位置添加内容 QComboBox.insertItem(self, indx: int, icon: QtGui.QIcon, text: str, userData: typing.Any = ...) #指定位置添加内容(带图标)
可以看到有个参数是userdata,其实就是可以附带的内容,在面板上不显示,但是可以包含的内容。比方我们选择区号,面板上只显示地名,选择好后后台接收的内容是地名对应的数字。
还有一种增加的方法:批量增加。用一个可迭代的数据就可以
QComboBox.addItems(self, texts: typing.Iterable[str])
QComboBox.insertItems(self, index: int, texts: typing.Iterable[str])
这里的可迭代对象可以是元组、列表,但内容必须是字符串类型的。但要注意的是虽然字符串也属于可迭代对象,但这里是不能用的。
b.删除项目
删除项目很简单,只要指定需要删除的项目的所索引值就可以了
QComboBox.removeItem(self, index: int) #删除项目
c.改指定项目
QComboBox.setItemIcon(self, index: int, icon: QtGui.QIcon) #改指定的项目图标 QComboBox.(self, index: int, text: str) #改指定项目的显示文本 QComboBox.setItemData(self, index: int, value: typing.Any, role: int = ...) #改指定项目的userdata
D.编辑当前显示文本
如果没有指定的索引值或文本内容,则显示状态不变。
QComboBox.setCurrentIndex(self, index: int) #按指定索引值显示 QComboBox.setCurrentText(self, text: str) #按指定文本显示
E.插入分割线
QComboBox.insertSeparator(self, index: int) #在指定索引位置插入分割线
F.被编辑状态
如果控件设置了可被编辑,就可以用键盘输入新的内容。在有新的文本被输入,控件失去焦点后,所输入的文本会自动添加在最后面,就像qq登陆时的记住账号一样,只要输入一遍就有这个选项了。
QComboBox.setEditable(self, editable: bool) #设置可被编辑
这个编辑状态还可以结合当前文本的显示
QComboBox.setEditText(self, text: str) #设置当前显示的文本
这里有个现象,就是如果在调用上面这条指令前文本框里显示的有图标,在用这条这里后图标时不会变化的,只是后面的文本改了。敲一下回车就好了。
G.插入模型(树形表)
这个用法以后再详细讲,现在就说一下是怎么用的
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): cb = QComboBox(self) model = QStandardItemModel() #创建标准树形视图模型 item1 = QStandardItem('item1') item2 = QStandardItem('item2') item2_1 = QStandardItem('item2_1') item2.appendRow(item2_1) #把item2_1列为item2的子列表 model.appendRow(item1) model.appendRow(item2) cb.setModel(model) cb.setView(QTreeView(cb)) #试图设置 pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())