是否可以限制 QListWidget 以便用户最多只能 select 3 个项目?
Is it possible to restrict QListWidget so users can only select 3 items max?
我知道您可以将 selection 模式更改为 select 列表中的多个项目。但是,更改为 multiselection 意味着用户可以根据需要选择 select 列表中的所有项目。我想知道是否可以允许用户 select 多个项目但设置最大项目数(即用户可以 select 20 项列表中的 1-3 项)。
我查看了文档和各种问题,但看不到任何可以执行此操作的方法。
import sys
from PyQt5.QtWidgets import QAbstractItemView, QApplication, QListWidget, QListWidgetItem, QVBoxLayout, QWidget
class Example(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(50,50,320,200)
layout = QVBoxLayout(self)
combo = QListWidget(self)
combo.setSelectionMode(QAbstractItemView.MultiSelection)
counter = 1
while (counter < 21):
combo.addItem(str(counter))
counter = counter + 1
layout.addWidget(combo)
self.setWindowTitle("QListWidget")
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
我的示例代码显示了一个包含 20 个项目的列表。它具有多select离子设置,因此用户可以select多个但没有电流限制。
好的,这里是文档的摘录:
https://doc.qt.io/qtforpython/PySide2/QtWidgets/QAbstractItemView.html
说明如下:
Note that the range is not updated until the widget is shown.
Several other functions are concerned with selection control; for
example setSelectionMode() , and setSelectionBehavior() . This class
provides a default selection model to work with ( selectionModel() ),
but this can be replaced by using setSelectionModel() with an instance
of QItemSelectionModel
所以是的,可以做到这一点(因为所有编码工作都是如此——一切皆有可能)并且上面说明了你只需要弄清楚你将如何实现它——可能会需要使用 Behavior 或制作您自己的模型
一种方法是继承 QListWidget
并覆盖 selectionCommand
,例如
from PyQt5.QtCore import QItemSelectionModel
class MyListWidget(QListWidget):
def __init__(self, parent=None, max_selected = 3):
super().__init__(parent)
self.max_selected = max_selected
def selectionCommand(self, index, event):
if len(self.selectedItems()) >= self.max_selected:
return QItemSelectionModel.Deselect
else:
return super().selectionCommand(index, event)
这可能适用于类似情况。
list
是在 example.ui
中定义的 QListWidget
。将 len(selected_items) > 3
中的 3
更改为您想要的任何值。
ui_filename = "example.ui"
baseUIClass, baseUIWidget = uic.loadUiType(ui_filename)
class Example(baseUIWidget, baseUIClass):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.setupUi(self)
self.list.itemSelectionChanged.connect(self.Enforce_Selection_Size)
def Enforce_Selection_Size(self):
selected_items = self.list.selectedItems()
if len(selected_items) > 3:
selected_items[3].setSelected(False)
我知道您可以将 selection 模式更改为 select 列表中的多个项目。但是,更改为 multiselection 意味着用户可以根据需要选择 select 列表中的所有项目。我想知道是否可以允许用户 select 多个项目但设置最大项目数(即用户可以 select 20 项列表中的 1-3 项)。
我查看了文档和各种问题,但看不到任何可以执行此操作的方法。
import sys
from PyQt5.QtWidgets import QAbstractItemView, QApplication, QListWidget, QListWidgetItem, QVBoxLayout, QWidget
class Example(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(50,50,320,200)
layout = QVBoxLayout(self)
combo = QListWidget(self)
combo.setSelectionMode(QAbstractItemView.MultiSelection)
counter = 1
while (counter < 21):
combo.addItem(str(counter))
counter = counter + 1
layout.addWidget(combo)
self.setWindowTitle("QListWidget")
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
我的示例代码显示了一个包含 20 个项目的列表。它具有多select离子设置,因此用户可以select多个但没有电流限制。
好的,这里是文档的摘录: https://doc.qt.io/qtforpython/PySide2/QtWidgets/QAbstractItemView.html
说明如下:
Note that the range is not updated until the widget is shown.
Several other functions are concerned with selection control; for example setSelectionMode() , and setSelectionBehavior() . This class provides a default selection model to work with ( selectionModel() ), but this can be replaced by using setSelectionModel() with an instance of QItemSelectionModel
所以是的,可以做到这一点(因为所有编码工作都是如此——一切皆有可能)并且上面说明了你只需要弄清楚你将如何实现它——可能会需要使用 Behavior 或制作您自己的模型
一种方法是继承 QListWidget
并覆盖 selectionCommand
,例如
from PyQt5.QtCore import QItemSelectionModel
class MyListWidget(QListWidget):
def __init__(self, parent=None, max_selected = 3):
super().__init__(parent)
self.max_selected = max_selected
def selectionCommand(self, index, event):
if len(self.selectedItems()) >= self.max_selected:
return QItemSelectionModel.Deselect
else:
return super().selectionCommand(index, event)
这可能适用于类似情况。
list
是在 example.ui
中定义的 QListWidget
。将 len(selected_items) > 3
中的 3
更改为您想要的任何值。
ui_filename = "example.ui"
baseUIClass, baseUIWidget = uic.loadUiType(ui_filename)
class Example(baseUIWidget, baseUIClass):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.setupUi(self)
self.list.itemSelectionChanged.connect(self.Enforce_Selection_Size)
def Enforce_Selection_Size(self):
selected_items = self.list.selectedItems()
if len(selected_items) > 3:
selected_items[3].setSelected(False)