使用qcombobox从列表中选择和筛选唯一条目

2024-09-30 12:35:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个短名单(不超过10个左右的项目),我想让用户匹配另一个名单。顺序可能是随机的,他们可以重新分配任何他们认为合适的值。我想指出已经分配的值,但不一定阻止它们的重新分配。如何在Qt中实现这一点?(最好是PyQt,但cpp也很好。)

这些要求表明应该使用qsortfilterproxy模型,它代理QListItemModel(qabstracttemlistmodel)和QSelectionModel。你知道吗

作为一个例子,让我们争论一下,我们有第一,第二和第三语言的类别。我们有英语、南非荷兰语、德语、荷兰语和俄语。我们希望用户将say Afrikaans分配给第一语言框,英语分配给第二语言框,德语分配给第三语言框。后来他们可能会决定说俄语比说南非荷兰语好,并想再次改变第一个街区。或者他们可能想交换德语和英语。你知道吗

我对此的第一次抨击如下:

from PyQt5 import QtGui, QtWidgets, QtCore

class QListModel(QtCore.QAbstractListModel) :

 def __init__(self, *args, data = [], **kvps):
  super().__init__(*args, **kvps) 
  self.update(data)

 def rowCount(self, index):
  return len(self._data_)

 def update(self, data = []):
  self._data_ = data

 def data(self, index, role = QtCore.Qt.DisplayRole) :
  if not index.isValid() : 
   print('inValid')
  object = self._data_[index.row()]
  roles = { 0:str(object),    # object.text(row,col)
   }
  if role in roles.keys() :
   return roles[role]
  else :
   return None   

def main(data) :
 app   = QtWidgets.QApplication(sys.argv)
 main  = QtWidgets.QMainWindow()
 cntr  = QtWidgets.QWidget(main)
 hbox  = QtWidgets.QHBoxLayout(cntr)
 vbox  = QtWidgets.QVBoxLayout(cntr)
 model = QListModel(data = data) 
 proxy = QtCore.QSortFilterProxyModel()
 proxy.setSourceModel(model)
 enum  = QtWidgets.QListView(main)
 enum.setModel(proxy)
 select = enum.selectionModel()
 combos = [QtWidgets.QComboBox(main) for i in range(3)]
 [item.setModel(proxy) for item in combos]
 [item.view().setSelectionModel(select) for item in combos]
 [vbox.addWidget(item) for item in combos]
 hbox.addLayout(vbox)
 hbox.addWidget(enum)
 main.setCentralWidget(cntr)
 main.show()
 app.exec_()

if __name__ == "__main__" :
 import sys # Move
 main(['','English','Afrikaans','Russian','German','Dutch'])

这在不同的组合之间使用一个列表。右边的列表是在我做出选择时可视化封装的内容。我觉得缺少的是组合框中所选选项的突出显示。你知道吗

我正在考虑以下方法:

允许每个组合框拥有自己的选择模型,并将selectionChanged信号馈送到单独的选择模型(在本例中是列表的选择模型)中,该模型将保留/管理整个选择。当一个组合框选择了另一个组合框的选项时,如何更新选择是一个问题。我也看不到选择将如何反馈到模型,理想情况下,一个将禁用一个选项一旦被选中,或至少表明它已被选中其他地方。是否可以将活动选择输入QSortFilterProxy,使用活动选择修改不同组合框中数据的外观?你知道吗


Tags: in模型selffordataindexmaindef

热门问题