【发布时间】:2018-03-23 05:09:56
【问题描述】:
我创建了 QTableWidget 并在前两列中插入了组合框。第一列包含唯一记录(列表列表中的第一个元素)。我的目标是使这些组合框完全动态化,即如果用户在第一个组合框中选择“蝴蝶”,第二个组合框将提供“PP”和“BR”供选择。
即使从另一边也可以优化搜索,即如果用户在第二个组合框中选择“KL”,那么第一个组合框将自动填写“Toy”。
我尝试(使用 pandas 数据框)成功地根据用户选择过滤掉结果。但是,因此我想将这些结果放入适当的组合框中(没有成功)。
然后我尝试采用此线程上发布的解决方案:How can I change the contents of one QComboBox depending on another QComboBox in PyQt5? 并将其合并到我的代码中,但没有成功。
下面是注释部分不起作用的代码:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from pandas import DataFrame
class Window(QMainWindow):
def __init__(self, parent = None):
super(Window,self).__init__(parent)
self.Table_of_widgets()
def Table_of_widgets(self):
rowCount = 20
columnCount = 9
self.table = QTableWidget()
self.table.setColumnCount(columnCount)
self.table.setRowCount(rowCount)
self.table.setHorizontalHeaderLabels(['Section', 'Label', 'Product description', 'Picture', 'Product ID', "Amount", "Unit price", "Store", "Total price"])
self.table.verticalHeader().hide()
self.table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(3, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(4, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(5, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(6, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(7, QHeaderView.Stretch)
self.table.horizontalHeader().setSectionResizeMode(8, QHeaderView.Stretch)
self.table.showMaximized()
list1 = [
['Butterfly','16/1/001','PP','Pepito Butterfly','350'],
['Butterfly','16/1/002','PP','Brown Butterfly','350'],
['Butterfly','16/1/003','PP','Blue Butterfly','350'],
['Butterfly','bra01','BR','White Butterfly','500'],
['Backpack','bra02','BR','Backpack-blue','1500'],
['Backpack','bra03','BR','Backpack-black','1250'],
['Toy','klv01','KL','Bear','200'],
['Toy','klv02','KL','Fish','500'],
['Toy','klv03','KL','Rabbit','400'],
['Toy','klv04','KL','Owl','450'],
]
dataset = DataFrame(list1)
fin = list(dataset[0].drop_duplicates())
fin.insert(0,'')
fin2 = list(dataset[2].drop_duplicates())
fin2.insert(0,'')
for i in range(rowCount):
comboA = QComboBox()
comboA.addItems(fin)
## comboA.currentTextChanged.connect(self.onCurrentTextChanged)
self.table.setCellWidget(i,0,comboA)
for i in range(rowCount):
comboB = QComboBox()
comboB.addItems(fin2)
self.table.setCellWidget(i,1,comboB)
## def onCurrentTextChanged(self, text):
## self.comboB.clear()
## elements = fin1
## if isinstance(elements, list):
## self.comboB.addItems(elements)
## else:
## self.comboB.addItem(elements)
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setApplicationName('MyWindow')
main = Window()
sys.exit(app.exec_())
我认为我未能以正确的方式连接信号。感谢您的任何建议!
编辑:
我试图尽可能精确,但也许仍有不确定性的空间。
这是我所追求的更多信息:
默认情况下,所有组合框都应设置为空白值。如果用户在combo2空白值中选择,combo1没有任何变化,如果用户在combo2中选择PP,combo1中只会出现Butterfly(和空白),如果用户在combo2中选择BR,combo1中只会出现Butterfly和Backpack(和空白) .同样适用于combo1:如果用户在combo1中选择Butterfly,则combo 2中只会出现BR和PP(和空白),如果他在combo1中选择Backpack,则只会出现BR(和空白)
进一步编辑:
达到了之前声明的目标(感谢@eyllanesc)。现在我计划从 list1(qtablewidget 中的产品描述列)添加第三列组合框,提供第 4 个元素(即 list1[3])。为此,必须更改字典。在阅读了一些帖子(Access an arbitrary element in a dictionary in Python;Dictionaries are ordered in Python 3.6+)后,我仍然无法形成所需的结构(可能在 for 循环中添加条目之前 createData 为空):
d = {" ": [[" "], [" "]]}
d_inverse = {" ": [[" "], [" "]]}
def createData(key1, key2, key3, data):
if key2 not in data[[" "], [" "]][0]:
data[[" "], [" "]][0].append(key2)
if key3 not in data[[" "], [" "]][1]:
data[[" "], [" "]][1].append(key3)
if key1 in data.keys():
if key2 not in data[key1]:
data[key1].append(key2)
if key3 not in data[key1]:
data[key1].append(key3)
else:
data[key1] = [" ", key2, key3]
return data
for item in template:
item1 = item[0]
item2 = item[3]
item3 = item[2]
d = createData(item1, item2, item3, d)
d_inverse = createData(item3, item2, item1, d_inverse)
【问题讨论】:
-
如果用户在第一个组合框中选择“蝴蝶”,第二个组合框将提供“PP”和“BR”供选择。标准是什么?为什么不只是PP?或者为什么不是所有项目?
-
有一个名为 list1 的列表,可以从中获取组合框。如果在第一个组合框中选择“蝴蝶”,它会自动排除给定列表中第一个元素没有“蝴蝶”的列表
-
但是根据您显示的 list1,BR 没有作为来源的蝴蝶。它是 list1 中的错误吗?
-
我编辑了它,错误地没有发布我的代码的最后一个版本。感谢您指出这一点。
-
如果不满足第一个条件,你所说的精炼部分是不可能的,我用下面的例子来解释:假设我们在第一个QComboBox蝴蝶中选择,那么只有PP和BR所以我们可以永远不要去吉隆坡。
标签: python python-3.x pyqt pyqt5 qcombobox