树视图列中的 QPushButtons

QPushButtons in a column of a treeview

我已经有一个树模型视图,其中包含带有标签、文本编辑和复选按钮的列。我要添加的是一个按钮。 这是我卡住的地方:

  1. 在 "flags" 函数中,我将使用哪个命名空间?
  2. 在 "data" 函数中,按钮的作用是什么? (例如,在检查按钮的情况下,我使用了 Qt::CheckStateRole
  3. 在"data"函数中(其中return是QVariant)我应该return做什么?创建的按钮?

我查看了有关此主题的其他答案,最流行的答案建议使用 setIndexWidget,但我不确定如何使用。最后请注意,我试图以编程方式执行此操作,而不是使用 UI 设计器。

谢谢!

首先,您似乎对 Qt 的 model/view 框架的工作方式有点困惑。我建议你去查看 Qt 文档:http://doc.qt.io/qt-5/model-view-programming.html

您的 3 个问题的答案:

  1. 您不需要在 Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const 中使用任何命名空间。只是 return 适合您索引的特定 Qt::ItemFlags(即 Qt::ItemFlag 的组合)。这与您想要 QPushButton 在您的视图中的事实无关。我认为您对 Qt::ItemIsUserCheckable 标志感到困惑,它使视图显示一个复选框。然而,这并不是这个标志的真正作用,实际上它只是告诉视图为用户提供一种方法来更改索引的 Qt::CheckStateRole。视图的默认行为是通过显示 QCheckBox.

  2. 没有与按钮关联的角色。您可以使用Qt::CheckStateRoleQt::EditRole,这取决于您选择显示QPushButton的方法。

  3. QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const中,当roleQt::CheckStateRoleQt::EditRole时,你可以return一个控制状态的布尔值的 QPushButton。但是,您永远不应该 return QWidget(或派生),模型处理数据,而不是它们的显示方式。

解决方法: 重新实现 QAbstractItemDelegate(或 QStyledItemDelegate)。重写:

  • createEditor(): 创建一个QPushButton.
  • setEditorData():使用索引和您在QAstractItemModel::data()中使用的角色设置QPushButton状态。
  • setModelData():根据QPushButton状态更新模型。

在您的视图上设置代理 (QTreeView::setItemDelegateForColumn())。此时,只有在版本中,您才会得到一个按钮。然后您可以调用 QAbstractItemView::openPersistentEditor() 使其始终可见。