在 QListView 中设置 SingleSelection
Set SingleSelection in QListView
我正在 PySide2 中编写一个应用程序,并且我开发了一个 class 继承自 Qdialog 以显示带有复选框的列表:
class代码:
class ListDialog(QDialog):
def __init__(self, items, all_checked = False, parent=None):
super(ListDialog, self).__init__(parent=parent)
self.setWindowTitle(title)
form = QFormLayout(self)
self.listView = QListView(self)
self.listView.setSelectionMode(QTableView.NoSelection)
form.addRow(self.listView)
self.model = QStandardItemModel(self.listView)
for item in items:
# create an item with a caption
standardItem = QStandardItem(item)
standardItem.setCheckable(True)
standardItem.setEditable(False)
if all_checked:
standardItem.setCheckState(Qt.Checked)
self.model.appendRow(standardItem)
self.listView.setModel(self.model)
结果(加上一些额外的代码):
事实上,您可以选中多个复选框,但我需要将其设为单个select离子。
注意这一行:
self.listView.setSelectionMode(QTableView.NoSelection)
起初,我认为 setSelectionMode
是造成这种行为的原因,但它只控制列表项目的突出显示,而不是其复选框。因此我将它设置为 NoSelection
不突出显示文本部分,复选框起作用了!
有没有简单的方法可以将select离子模式设置为单离子?或者我应该重载控制框检查的信号以取消select所有框然后select我点击的那个?
一种简单的方法是使用代理模型来处理单一选择和信号 QStandardItemModel::itemChanged
以了解用户何时单击某个项目。
例如:
class SingleCheckProxyModel(QIdentityProxyModel):
def __init__(self, model, parent=None):
super().__init__(parent)
model.itemChanged.connect(self.checkSingleCheck)
self.setSourceModel(model)
self.currentItemChecked = None
def checkSingleCheck(self, item):
if self.currentItemChecked:
self.currentItemChecked.setCheckState(Qt.Unchecked)
if item.checkState(): # Allows the user to uncheck then check the same item
self.currentItemChecked = item
else:
self.currentItemChecked = None
class ListDialog(QDialog):
def __init__(self, items, all_checked = False, parent=None):
super(ListDialog, self).__init__(parent=parent)
self.setWindowTitle("kjnve")
form = QFormLayout(self)
self.listView = QListView(self)
self.listView.setSelectionMode(QTableView.NoSelection)
form.addRow(self.listView)
self.model = QStandardItemModel(self.listView)
for item in items:
# create an item with a caption
standardItem = QStandardItem(item)
standardItem.setCheckable(True)
standardItem.setEditable(False)
if all_checked:
standardItem.setCheckState(Qt.Checked)
self.model.appendRow(standardItem)
self.listView.setModel(SingleCheckProxyModel(self.model)) # Use proxy
当用户点击一个项目时,checkSingleCheck
方法将被调用。但是,如果你想能够编辑项目,你必须适应这个功能。
我正在 PySide2 中编写一个应用程序,并且我开发了一个 class 继承自 Qdialog 以显示带有复选框的列表:
class代码:
class ListDialog(QDialog):
def __init__(self, items, all_checked = False, parent=None):
super(ListDialog, self).__init__(parent=parent)
self.setWindowTitle(title)
form = QFormLayout(self)
self.listView = QListView(self)
self.listView.setSelectionMode(QTableView.NoSelection)
form.addRow(self.listView)
self.model = QStandardItemModel(self.listView)
for item in items:
# create an item with a caption
standardItem = QStandardItem(item)
standardItem.setCheckable(True)
standardItem.setEditable(False)
if all_checked:
standardItem.setCheckState(Qt.Checked)
self.model.appendRow(standardItem)
self.listView.setModel(self.model)
结果(加上一些额外的代码):
事实上,您可以选中多个复选框,但我需要将其设为单个select离子。
注意这一行:
self.listView.setSelectionMode(QTableView.NoSelection)
起初,我认为 setSelectionMode
是造成这种行为的原因,但它只控制列表项目的突出显示,而不是其复选框。因此我将它设置为 NoSelection
不突出显示文本部分,复选框起作用了!
有没有简单的方法可以将select离子模式设置为单离子?或者我应该重载控制框检查的信号以取消select所有框然后select我点击的那个?
一种简单的方法是使用代理模型来处理单一选择和信号 QStandardItemModel::itemChanged
以了解用户何时单击某个项目。
例如:
class SingleCheckProxyModel(QIdentityProxyModel):
def __init__(self, model, parent=None):
super().__init__(parent)
model.itemChanged.connect(self.checkSingleCheck)
self.setSourceModel(model)
self.currentItemChecked = None
def checkSingleCheck(self, item):
if self.currentItemChecked:
self.currentItemChecked.setCheckState(Qt.Unchecked)
if item.checkState(): # Allows the user to uncheck then check the same item
self.currentItemChecked = item
else:
self.currentItemChecked = None
class ListDialog(QDialog):
def __init__(self, items, all_checked = False, parent=None):
super(ListDialog, self).__init__(parent=parent)
self.setWindowTitle("kjnve")
form = QFormLayout(self)
self.listView = QListView(self)
self.listView.setSelectionMode(QTableView.NoSelection)
form.addRow(self.listView)
self.model = QStandardItemModel(self.listView)
for item in items:
# create an item with a caption
standardItem = QStandardItem(item)
standardItem.setCheckable(True)
standardItem.setEditable(False)
if all_checked:
standardItem.setCheckState(Qt.Checked)
self.model.appendRow(standardItem)
self.listView.setModel(SingleCheckProxyModel(self.model)) # Use proxy
当用户点击一个项目时,checkSingleCheck
方法将被调用。但是,如果你想能够编辑项目,你必须适应这个功能。