我有一个短名单(不超过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,使用活动选择修改不同组合框中数据的外观?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐