树视图列中的 QPushButtons
QPushButtons in a column of a treeview
我已经有一个树模型视图,其中包含带有标签、文本编辑和复选按钮的列。我要添加的是一个按钮。
这是我卡住的地方:
- 在 "flags" 函数中,我将使用哪个命名空间?
- 在 "data" 函数中,按钮的作用是什么? (例如,在检查按钮的情况下,我使用了
Qt::CheckStateRole
)
- 在"data"函数中(其中return是
QVariant
)我应该return做什么?创建的按钮?
我查看了有关此主题的其他答案,最流行的答案建议使用 setIndexWidget
,但我不确定如何使用。最后请注意,我试图以编程方式执行此操作,而不是使用 UI 设计器。
谢谢!
首先,您似乎对 Qt 的 model/view 框架的工作方式有点困惑。我建议你去查看 Qt 文档:http://doc.qt.io/qt-5/model-view-programming.html
您的 3 个问题的答案:
您不需要在 Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
中使用任何命名空间。只是 return 适合您索引的特定 Qt::ItemFlags
(即 Qt::ItemFlag
的组合)。这与您想要 QPushButton
在您的视图中的事实无关。我认为您对 Qt::ItemIsUserCheckable
标志感到困惑,它使视图显示一个复选框。然而,这并不是这个标志的真正作用,实际上它只是告诉视图为用户提供一种方法来更改索引的 Qt::CheckStateRole
。视图的默认行为是通过显示 QCheckBox
.
没有与按钮关联的角色。您可以使用Qt::CheckStateRole
或Qt::EditRole
,这取决于您选择显示QPushButton
的方法。
在QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
中,当role
是Qt::CheckStateRole
或Qt::EditRole
时,你可以return一个控制状态的布尔值的 QPushButton
。但是,您永远不应该 return QWidget
(或派生),模型处理数据,而不是它们的显示方式。
解决方法:
重新实现 QAbstractItemDelegate
(或 QStyledItemDelegate
)。重写:
createEditor()
: 创建一个QPushButton
.
setEditorData()
:使用索引和您在QAstractItemModel::data()
中使用的角色设置QPushButton
状态。
setModelData()
:根据QPushButton
状态更新模型。
在您的视图上设置代理 (QTreeView::setItemDelegateForColumn()
)。此时,只有在版本中,您才会得到一个按钮。然后您可以调用 QAbstractItemView::openPersistentEditor()
使其始终可见。
我已经有一个树模型视图,其中包含带有标签、文本编辑和复选按钮的列。我要添加的是一个按钮。 这是我卡住的地方:
- 在 "flags" 函数中,我将使用哪个命名空间?
- 在 "data" 函数中,按钮的作用是什么? (例如,在检查按钮的情况下,我使用了
Qt::CheckStateRole
) - 在"data"函数中(其中return是
QVariant
)我应该return做什么?创建的按钮?
我查看了有关此主题的其他答案,最流行的答案建议使用 setIndexWidget
,但我不确定如何使用。最后请注意,我试图以编程方式执行此操作,而不是使用 UI 设计器。
谢谢!
首先,您似乎对 Qt 的 model/view 框架的工作方式有点困惑。我建议你去查看 Qt 文档:http://doc.qt.io/qt-5/model-view-programming.html
您的 3 个问题的答案:
您不需要在
Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
中使用任何命名空间。只是 return 适合您索引的特定Qt::ItemFlags
(即Qt::ItemFlag
的组合)。这与您想要QPushButton
在您的视图中的事实无关。我认为您对Qt::ItemIsUserCheckable
标志感到困惑,它使视图显示一个复选框。然而,这并不是这个标志的真正作用,实际上它只是告诉视图为用户提供一种方法来更改索引的Qt::CheckStateRole
。视图的默认行为是通过显示QCheckBox
.没有与按钮关联的角色。您可以使用
Qt::CheckStateRole
或Qt::EditRole
,这取决于您选择显示QPushButton
的方法。在
QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
中,当role
是Qt::CheckStateRole
或Qt::EditRole
时,你可以return一个控制状态的布尔值的QPushButton
。但是,您永远不应该 returnQWidget
(或派生),模型处理数据,而不是它们的显示方式。
解决方法:
重新实现 QAbstractItemDelegate
(或 QStyledItemDelegate
)。重写:
createEditor()
: 创建一个QPushButton
.setEditorData()
:使用索引和您在QAstractItemModel::data()
中使用的角色设置QPushButton
状态。setModelData()
:根据QPushButton
状态更新模型。
在您的视图上设置代理 (QTreeView::setItemDelegateForColumn()
)。此时,只有在版本中,您才会得到一个按钮。然后您可以调用 QAbstractItemView::openPersistentEditor()
使其始终可见。