1、QComboBox综合案例:给定城市数据、实现两级联动效果:创建两个控件,有个展示所有的省,另外一个根据省展示它对应的城市;用户选择城市之后开发人员拿到的是对应的编号。
首先创建两个控件,第一个控件设置所有的省,监听第一个控件的值发生改变,把它作为key拿到对应的展示字典,在把字典展示在第二个控件中。
清空导致当前索引发生改变,也会调用添加条目,所以打印一个空的换行。
绑定额外数据。想办法将编码数据绑定在条目中,然后拿到条目数据。第一次信号不会被触发,手动调用信号。
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QComboBox的学习")
self.resize(500, 500)
self.city_dic = {
"北京":{
"东城":"001",
"西城": "002",
"朝阳": "003",
"丰台": "004"
},
"上海": {
"黄埔": "005",
"徐汇": "006",
"长宁": "007",
"静安": "008",
"松江": "009"
},
"广东": {
"广州": "010",
"深圳": "011",
"湛江": "012",
"佛山": "013"
},
}
self.setup_ui()
def setup_ui(self):
# 创建两个下拉列表控件
pro = QComboBox(self)
city = QComboBox(self)
self.pro = pro
self.city = city
pro.move(100, 100)
city.move(200, 100)
# 展示数据到第一个下拉选择控件当中
pro.addItems(self.city_dic.keys())
# 监听省下拉列表中当前值改变发生信号,需要接受省会的名字
pro.currentIndexChanged[str].connect(self.pro_changed)
self.pro_changed(pro.currentText())
# 监听城市下拉列表里面的当前值发生改变的信号
city.currentIndexChanged[int].connect(self.city_changed)
self.city_changed(city.currentIndex())
def pro_changed(self, pro_name):
print(pro_name)
# 根据省的名称到字典里获得对应城市的字典
citys = self.city_dic[pro_name]
self.city.clear()
#self.city.addItems(citys.keys())
for key, val in citys.items():
self.city.addItem(key, val)
def city_changed(self, city_idx):
print(city_idx)
print(self.city.itemData(city_idx))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.resize(500, 500)
window.show()
sys.exit(app.exec_())
?2、细节完善:①需要手动执行槽函数;②打印出None值,尝试切换省,会清空,城市的数据从有到无会触发信号。
①顺序:先添加的信号,在连接的信号;已经从无到有,但并未添加信号,故应先连接信号,在添加数据。注释掉手动调用的方法。
②先连接信号,在操作数据。
③None:item_idx为-1时过滤掉数据;方法二:清空不像外界发射信号,临时阻断信号。
?
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QComboBox的学习")
self.resize(500, 500)
self.city_dic = {
"北京":{
"东城":"001",
"西城": "002",
"朝阳": "003",
"丰台": "004"
},
"上海": {
"黄埔": "005",
"徐汇": "006",
"长宁": "007",
"静安": "008",
"松江": "009"
},
"广东": {
"广州": "010",
"深圳": "011",
"湛江": "012",
"佛山": "013"
},
}
self.setup_ui()
def setup_ui(self):
# 创建两个下拉列表控件
pro = QComboBox(self)
city = QComboBox(self)
self.pro = pro
self.city = city
pro.move(100, 100)
city.move(200, 100)
# 展示数据到第一个下拉选择控件当中
#pro.addItems(self.city_dic.keys())
# 监听省下拉列表中当前值改变发生信号,需要接受省会的名字
pro.currentIndexChanged[str].connect(self.pro_changed)
#self.pro_changed(pro.currentText())
# 监听城市下拉列表里面的当前值发生改变的信号
city.currentIndexChanged[int].connect(self.city_changed)
#self.city_changed(city.currentIndex())
pro.addItems(self.city_dic.keys())
def pro_changed(self, pro_name):
#print(pro_name)
# 根据省的名称到字典里获得对应城市的字典
citys = self.city_dic[pro_name]
self.city.blockSignals(True)
self.city.clear()
self.city.blockSignals(False)
#self.city.addItems(citys.keys())
for key, val in citys.items():
self.city.addItem(key, val)
def city_changed(self, city_idx):
#print(city_idx)
print(self.city.itemData(city_idx))
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.resize(500, 500)
window.show()
sys.exit(app.exec_())
|