Qt 在 QTableView 中设置自定义小部件

Posted

技术标签:

【中文标题】Qt 在 QTableView 中设置自定义小部件【英文标题】:Qt set a custom widget inside a QTableView 【发布时间】:2017-04-07 11:58:52 【问题描述】:

我需要将自定义小部件放入来自子类QAbstractTableModelQTableView 单元格中。

我搜索了已经给出的解决方案,但没有人满足我的需求。 自定义小部件必须一直保留在这里,而不仅仅是像QItemDelegate::createEditor 这样的编辑模式。 自定义小部件可能就是一切,我正在为所有小部件寻找通用解决方案,而不仅仅是 QPushButtonsQCheckBox

对不起我的英语。

【问题讨论】:

可以实现自定义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 中设置自定义小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyqt4 中设置 QTableView 标头名称

使用Maven和Spring Boot的Vaadin自定义组件/小部件

在 Argument 中设置自定义数据类型

无法在 MapView,Swift 3 中设置自定义图钉图像

Qt/QTableView/SQLite如何连接?

使用属性窗口在 QT 网格布局中设置小部件的行和列