【问题标题】:A ListView of checkboxes in PyQtPyQt 中复选框的 ListView
【发布时间】:2023-04-01 10:03:02
【问题描述】:

我想显示一个 QListView,其中每个项目都是带有一些标签的复选框。复选框应始终可见。我能想到的一种方法是使用自定义委托和 QAbstractListModel。有没有更简单的方法?你能提供一个最简单的sn-p吗?

提前致谢

【问题讨论】:

    标签: python qt pyqt qitemdelegate qlistview


    【解决方案1】:

    我最终使用了 PyQt 邮件列表中David Boddie 提供的方法。这是一个基于他的代码的工作 sn-p:

    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import sys
    from random import randint
    
    
    app = QApplication(sys.argv)
    
    model = QStandardItemModel()
    
    for n in range(10):                   
        item = QStandardItem('Item %s' % randint(1, 100))
        check = Qt.Checked if randint(0, 1) == 1 else Qt.Unchecked
        item.setCheckState(check)
        item.setCheckable(True)
        model.appendRow(item)
    
    
    view = QListView()
    view.setModel(model)
    
    view.show()
    app.exec_()
    

    注意:将带有检查角色的setData的调用更改为setCheckState,并使用setCheckable而不是标志。

    【讨论】:

    • 切换此类项目/复选框时会发出哪些信号(如果有)?
    • 回答自己,model.itemChanged可以用,如下图:pythoncentral.io/…
    • 当此类项目/复选框突出显示但未切换时会发出什么信号(如果有)?
    【解决方案2】:

    如果您正在编写自己的模型,只需包含 Qt.ItemIsUserCheckableflags() 方法的返回值中标记,并确保您返回 来自data() 方法的Qt.CheckStateRole 的有效值。

    如果您使用 QStandardItemModel 类,请包含 Qt.ItemIsUserCheckable 在您传递给每个项目的 setFlags() 方法的那些中标记,并设置检查 Qt.CheckStateRole 及其 setData() 方法的状态。

    在交互式 Python 会话中,键入以下内容:

    from PyQt4.QtGui import *
    
    model = QStandardItemModel()
    item = QStandardItem("Item")
    item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
    item.setData(QVariant(Qt.Checked), Qt.CheckStateRole)
    model.appendRow(item)
    
    view = QListView()
    view.setModel(model)
    view.show()
    

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2011-09-10
      • 2011-07-10
      相关资源
      最近更新 更多