【问题标题】:Is it possible to restrict QListWidget so users can only select 3 items max?是否可以限制 QListWidget 使用户最多只能选择 3 个项目?
【发布时间】:2019-12-01 19:31:09
【问题描述】:

我知道您可以更改选择模式以从列表中选择多个项目。但是,更改为多选意味着用户可以根据需要选择选择列表中的所有项目。我想知道是否可以允许用户选择多个项目但设置最大项目数(即用户可以从 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 个项目的列表。它具有多选集,因此用户可以选择多个但没有当前限制。

【问题讨论】:

    标签: python pyqt pyqt5 qlistwidget


    【解决方案1】:

    一种方法是继承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)
    

    【讨论】:

    • 哦,有道理!你知道是否也可以在预先存在的列表上覆盖 selectionCommand 吗?
    【解决方案2】:

    好的,摘自此处的文档: https://doc.qt.io/qtforpython/PySide2/QtWidgets/QAbstractItemView.html

    声明如下:

    请注意,在显示小部件之前,范围不会更新。

    其他几个功能与选择控制有关;为了 例如 setSelectionMode() 和 setSelectionBehavior() 。这节课 提供一个默认的选择模型( selectionModel() ), 但这可以通过使用带有实例的 setSelectionModel() 来替换 QItemSelectionModel的

    所以是的,有可能做到这一点(就像所有编码工作一样——一切皆有可能),上面说明了你只需要弄清楚你将如何实现它——可能需要使用 Behavior 或制作自己的模型

    【讨论】:

      【解决方案3】:

      这可能适用于类似情况。

      list 是在example.ui 中定义的QListWidget。将len(selected_items) &gt; 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)
      

      【讨论】:

        猜你喜欢
        • 2018-08-14
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        相关资源
        最近更新 更多