是否可以限制 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)