Qt 在 QTableView 中设置自定义小部件
Posted
技术标签:
【中文标题】Qt 在 QTableView 中设置自定义小部件【英文标题】:Qt set a custom widget inside a QTableView 【发布时间】:2017-04-07 11:58:52 【问题描述】:我需要将自定义小部件放入来自子类QAbstractTableModel
的QTableView
单元格中。
我搜索了已经给出的解决方案,但没有人满足我的需求。
自定义小部件必须一直保留在这里,而不仅仅是像QItemDelegate::createEditor
这样的编辑模式。
自定义小部件可能就是一切,我正在为所有小部件寻找通用解决方案,而不仅仅是 QPushButtons
或 QCheckBox
。
对不起我的英语。
【问题讨论】:
可以实现自定义QStyledItemDelegate的方法:paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
是的,但是这样我可以画一个静态小部件,我想要一个交互式的
听起来很奇怪。这样做的目的是什么?
我有一些交互式小部件,我想在表格内显示它们,因为它们在表格外进行交互
@lo-re QTableWidget
(不是QTableView
)提供了这样的功能,但违反了 MVC 原则(如果在这种情况下需要它们)。 QGridLayout
可以按表格顺序显示任何小部件。还不够吗?
【参考方案1】:
您可以使用QAbstractItemView::setIndexWidget
并覆盖QAbstractItemView::dataChanged
来实现您想要的效果,如下所示:
class MyTableView : public QTableView
protected:
void dataChanged(const QModelIndex &topLeft, const QModelIndex & bottomRight, const QVector<int> & roles)
QPushButton *pPushButton = qobject_cast<QPushButton*>(indexWidget(topLeft));
if (pPushButton)
pPushButton->setText(model()->data(topLeft, Qt::DisplayRole).toString());
else
QTableView::dataChanged(topLeft, bottomRight, roles);
;
void main ()
MyTableView table;
table.setIndexWidget(table.model()->index(0, 0, QModelIndex()),new QPushButton());
请注意,这是一个不完整的实现,但它应该向您展示如何解决您的问题。真正的实现应该更新 topLeft 和 bottomRight 之间的所有 QPushButton。
【讨论】:
所以解决方案只是子类化视图而不是模型 我认为子类化视图确实可以解决您的问题,但如果它对您的特定问题有效,您应该自己尝试。我不知道你为什么要对模型进行子类化来解决这个问题,因为你的问题是关于可视化的。 我选择了对模型进行子类化并绘制静态“小部件”,但您的回答解决了最初的问题,所以我设置为接受。谢谢 您也可以添加自己的答案并接受该答案,其他用户可能会对查看不同的可能性感兴趣。以上是关于Qt 在 QTableView 中设置自定义小部件的主要内容,如果未能解决你的问题,请参考以下文章
使用Maven和Spring Boot的Vaadin自定义组件/小部件