我有一个短名单(不超过十个左右的项目),我希望用户与另一个列表匹配。订单可以是随机的,并且可以根据需要重新分配任何值。我想指出已经分配的值,但不一定要阻止它们的重新分配。如何在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,使用活动选择来修改不同组合框中数据的外观?