使用QComboBox

时间:2015-06-16 09:17:59

标签: python pyqt qcombobox

我有一个短名单(不超过十个左右的项目),我希望用户与另一个列表匹配。订单可以是随机的,并且可以根据需要重新分配任何值。我想指出已经分配的值,但不一定要阻止它们的重新分配。如何在Qt中实现这一目标? (最好是PyQt,但cpp也不错。)

这些要求表明应该使用代理QListItemModel(QAbstractItemListModel)和可能QSelectionModel的QSortFilterProxyModel。

作为一个例子,让我们争辩说我们有第一,第二和第三语言类别。我们有英语,南非荷兰语,德语,荷兰语和俄语。我们希望用户将南非荷兰语分配给第一,英语到第二,德语到第三语言框。后来他们可能会决定他们说俄语然后说南非荷兰语,并希望再次改变第一个街区。或者,他们可能想要交换德语和英语。

我的第一个打击如下:

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'])

这使用不同组合之间的单个列表。右边的列表是在我做出选择时可视化什么是灌封。我觉得缺少的是Comboboxes中所选选项的突出显示。

我正在考虑以下方法:

允许每个组合框拥有自己的选择模型,并将selectionChanged信号提供给一个单独的选择模型(在这种情况下是列表中的一个),它将保留/管理整个选择。当一个组合框选择另一个组合框选项时,如何更新选择存在问题。我也看不出选择如何反馈给模型,理想情况下,一旦选择它就会禁用一个选项,或者至少表明它已在其他地方被选中。是否可以将活动选择提供给QSortFilterProxy,使用活动选择来修改不同组合框中数据的外观?

0 个答案:

没有答案