【问题标题】:QListWidget and Multiple SelectionQListWidget 和多选
【发布时间】:2011-04-29 20:21:58
【问题描述】:

我有一个常规的QListWidget,其中连接了几个信号和插槽。一切都按我的预期工作。我可以更新、检索、清除等。

但 UI 不支持多选。

如何“启用”QListWidget 的多项选择?我对 PyQt 的有限经验告诉我,我需要通过子类化来创建自定义 QListWidget .. 但是接下来呢?

Google 给了我 C++ 的答案,但我正在寻找 Python

http://www.qtforum.org/article/26320/qlistwidget-multiple-selection.html

http://www.qtcentre.org/threads/11721-QListWidget-multi-selection

【问题讨论】:

    标签: python user-interface pyqt qlistwidget


    【解决方案1】:

    不幸的是,我无法提供 Python 特定的语法,但您不需要创建任何子类。

    创建QListWidget 后,调用setSelectionMode() 并传入多个选择类型之一,QAbstractItemView::ExtendedSelection 可能是您想要的。您可能想查看此模式的一些变体。

    在您的itemSelectionChanged() 信号槽中,调用selectedItems() 以获取QListQListWidgetItem 指针。

    【讨论】:

    • extendedSelection。这就是我一直在寻找的。非常感谢。
    【解决方案2】:

    对于 PyQT4 是

    QListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
    

    【讨论】:

    • PySide 完全一样。
    • 这应该是选定的答案,因为 OP 指定“Google 给了我 C++ 答案,但我正在寻找 Python”。对于 Qt5,QAbstractItemView 是从 QtWidgets 导入的。
    【解决方案3】:

    在 listWidget 中通过多项选择获取多个选定值的示例。

    from PyQt5 import QtWidgets, QtCore
    class Test(QtWidgets.QDialog):
        def __init__(self, parent=None):
            super(Test, self).__init__(parent)
            self.layout = QtWidgets.QVBoxLayout()
            self.listWidget = QtWidgets.QListWidget()
            self.listWidget.setSelectionMode(
                QtWidgets.QAbstractItemView.ExtendedSelection
            )
            self.listWidget.setGeometry(QtCore.QRect(10, 10, 211, 291))
            for i in range(10):
                item = QtWidgets.QListWidgetItem("Item %i" % i)
                self.listWidget.addItem(item)
            self.listWidget.itemClicked.connect(self.printItemText)
            self.layout.addWidget(self.listWidget)
            self.setLayout(self.layout)
    
        def printItemText(self):
            items = self.listWidget.selectedItems()
            x = []
            for i in range(len(items)):
                x.append(str(self.listWidget.selectedItems()[i].text()))
    
            print (x)
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        form = Test()
        form.show()
        app.exec_()
    

    输出:-

    【讨论】:

    • 我检查了很多解决方案,但没有奏效。但这在 [Py]QT 5.11.3 上运行良好
    • 感谢您提供示例代码!
    【解决方案4】:

    使用 PyQt5,您可以设置 QListWidget 的 SelectionMode 以允许多个选择:

    from PyQt5 import QtWidgets    
    
    
    QtWidgets.QListWidget.setSelectionMode(2)
    

    在哪里

    • SelectionMode = 0 => 无选择
    • SelectionMode = 1 => SingleSelection
    • SelectionMode = 2 => 多选
    • SelectionMode = 3 => 扩展选择
    • SelectionMode = 4 => ContiguousSelection

    Reference

    在 Qt Creator 中,您可以在此处找到此选项:

    【讨论】:

      【解决方案5】:

      另外,你可以使用列表推导来获取选中的项目,例如

      num_ITEMS=[item.text() for item in self.listWidget.selectedItems()]
      

      【讨论】:

        猜你喜欢
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 2021-05-03
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多