在QTableView中嵌入控件?

Pau*_*cks 2 python qt pyqt4 tableview

我正在使用一个小型的qt应用程序(使用PyQt4),我想出了一个想法,但我不确定如何实现它.我有一个代表一些数据的QTableView,我想在QTableView中添加另一个列,其中包含一个可以连接到某个模型的复选框控件.例如,像这样:

替代文字

请注意,删除列每行都有一个复选框小部件(虽然这是一个Web应用程序,而不是桌面Qt应用程序,但主体是相同的).奖励点如果我可以选择多行,右键单击,然后选择"选中/取消选中所选项".

如果其中任何一项不清楚,请在此处发表评论,我会澄清.

qua*_*ark 6

实现自己的表模型比使用更多的工作QStandardItemModel(如@Andy推荐的那样),但它确实可以让你对你想做的事情有一个很好的控制,所以我会试着给你一个做什么的总结.我假设您了解Qt的文档PyQt的类文档,并且可以查找您需要的任何类.(我想,如果你已经拥有了一个QTableView但是比留下更好的东西,我可能会过度解释.)

要获得可检查的状态:

  • 创建一个子类QTableModel.
    • 选择一些数据结构来存储行的内容.这可能非常简单(一个大的内部列表),或者像SQL数据库一样复杂(在这种情况下请参见QSqlTableModel).
    • 覆盖rowCount,columnCount,data,和setData.
      • rowCount并且columnCount直接对应于您用于数据模型的内容.如果您基本上使用2D数组(或列表列表),它们可以像单行一样短.
      • data事情变得有趣.项目模型存储了几个不同的字段(Qt调用角色),data返回的内容取决于要求的角色.请注意,我讨论了返回内容的数据类型,但总是需要将其包含在内QVariant.
        • Qt.DisplayRole是表格单元格中显示的任何文本.这是您的实际数据,是目前常见的情况(因此这是默认角色).
        • Qt.CheckStateRole是一个布尔值.返回Qt.Checked将显示一个选中的复选框,Qt.Unchecked并将返回未选中的复选框.如果您想要包含的列是复选框,则只处理此角色.
        • 其他角色对于图标,背景颜色以及许多其他功能非常有用.
        • 任何未处理的角色都应该返回一个QVariant.
      • setData是对称的data.您应该处理您处理的角色data:Qt.DisplayRole实际数据和Qt.CheckStateRole复选框.

允许多个行和列以及单元格的选择.为此,您需要了解选择模型.简短版本是:

  • 在表视图上设置选择模式 :) view.setSelectionMode( QAbstractItemView.ContiguousSelection.这将让您突出显示连续的单元格.您也可以突出显示任意单元格:请参阅QAbstractView.SelectionMode.
  • 要确定哪些细胞实际上被选择以下的动作获得它的表视图选择模型(注意"L"): view.selectionModel().selectedIndexes().您可以通过循环遍历这些for.

要允许右键单击:

  • 覆盖您的视图contextMenuEvent.
  • 创建一个QMenu并将其连接到您需要的任何插槽.

如需更深入的了解,请阅读模型/视图Qt指南(如果您还没有).绝对看看Qt项目视图示例.许多描述的都是在PyQt中以更少的代码(包括两个@Jesse提及)实现的,并且树模型示例延续到表但工作量少得多(如上所述,您需要实现的更少).