Qt 在 QTableView 单元格内设置自定义小部件

4
我想把一个自定义的小部件放入 QTableView 的单元格中。这个小部件可以是 QPushButton,也可以是复选框或其他东西。我尝试了以下方法,但都不满足我的要求:
  1. 使用委托。这种策略可以绘制小部件,但不能是自定义小部件,并且不能交互。
  2. 使用 QTableView::setIndexWidget()。使用此策略,自定义小部件完全覆盖单元格,绑定到 QTableView 的委托无法工作,这意味着双击单元格不会进行编辑操作。

请注意,该函数是独立的,就像插件一样。因此,我不能做以下事情。

  1. QTableView 继承。我只能得到一个与 QTableView 绑定的指针变量——只有 QTableView 对象。
  2. 从任何模型继承。该模型由其他用户控制,编写模型的程序员不应该也不能使用我的自定义模型。

问题非常复杂,太多限制限制了设计。


我认为你需要走委托的方式。你可以使用自定义控件并与它们进行交互。请参见:https://dev59.com/muo6XIcBkEYKwwoYNBhR - Taron
QItemDelegate::createEditor() 只有在单元格被点击时才会绘制。需要的是小部件可以预先显示,如果我点击单元格,另一个委托也可以工作。但是 QItemDelegate::paint() 只能绘制,不能提供一个真正可交互的小部件。 - Nick.Rhan
tableView->openPersistentEditor( index )。这样它就一直可见! - Taron
仍然无法工作 - Nick.Rhan
2个回答

2
如果你想使用模型/视图来包含小部件的数据,那么在没有委托的情况下,你无法完成这个任务。更糟糕的是,如果你尝试这样做,当元素数量非常高时,你的程序将显著减速,因为每个小部件都将参与事件循环。这不是你想要的。你只想涉及用户可见的小部件。
请考虑阅读此处以获取更多解释。

1
感谢所有为这个问题做出贡献的人,我已经找到了解决这个问题的方法。它是通过“原始思路”解决的,即在tableView上绘制一个QToolButton,使用QModelIndex。通过QModelIndex,我可以获得可以绘制任何QWidget的geomertry位置。然而,这种方法真的很复杂,因为我必须维护QModelIndex的更改,比如removeColumns和insertColumns。
另一个问题是我必须区分隐藏和删除列或行。我认为我应该发布另一个新问题来寻求帮助。再次感谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接