【问题标题】:Qt set a custom widget inside a QTableViewQt 在 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 可以按表格顺序显示任何小部件。还不够吗?

标签: c++ qt view model


【解决方案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。

【讨论】:

  • 所以解决方案只是子类化视图而不是模型
  • 我认为子类化视图确实可以解决您的问题,但如果它对您的特定问题有效,您应该自己尝试。我不知道你为什么要对模型进行子类化来解决这个问题,因为你的问题是关于可视化的。
  • 我选择了对模型进行子类化并绘制静态“小部件”,但您的回答解决了最初的问题,所以我设置为接受。谢谢
  • 您也可以添加自己的答案并接受该答案,其他用户可能会对查看不同的可能性感兴趣。
猜你喜欢
  • 2018-01-11
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2021-02-27
  • 1970-01-01
  • 2022-07-02
相关资源
最近更新 更多