0

我知道关于多选的话题至少出现过一次,但老实说既找不到它,也不记得它有和体面的解决方案。

我建议讨论两个问题:

1) 创建类似于 MS Excel 单元格选择的行为。因此,用户单击 QTableView 中的一个单元格并突出显示单击的单元格,并且在另外几个“依赖”单元格中更改外观(被选中或以任何方式突出显示)。在 Excel 中,它被广泛用于显示单元格公式依赖性。

我知道有几种方法可以解决它。最简单的一个是在任何适当的信号处理程序(例如 QAbastractModelView clicked())中使用依赖单元格修改视图选择。这种方式可以完成工作,但有丑陋的副作用,因为在重绘选定单元格后传递的信号发生,因此在第一个单元格产生闪烁之后绘制相关选择。

第二种方法是委托方式。这也有一些问题,因为您只为选定的单元格获取paintEvent,因此您对“依赖”单元格无能为力。实际上我能够通过这种方式解决它,通过点击点击,修改选择并使用完全自定义的委托,一旦形成完整的选择就会绘制所有内容,所以实际上它跳过了第一次重绘,但我还是不完全满意结果虽然在视觉上看起来完全正确..主要是因为整体 TableView 响应时间减少了很多。原因是 Qt 在收到鼠标点击后立即绘制原生选择,然后再向用户类发送任何信号,并且在这种方法的情况下,委托中的paintEvent 在几个主循环之后到达。所以在使用 ' 的情况下会有明显的延迟

我已经开始认为最好的选择可以完全覆盖大部分 QTableView 以添加对此类选择模式的支持,但可能有更直接的方法吗?

2)第二个问题(我把它们放在一起是因为有一些共同的问题)。假设您有一个按月表示财务信息的网格,并且在一个月内有几列信息,因此 N 列的块重复 M 次。使此类网格更具可读性的明显方法是对每个月的第一个数据列的网格中的垂直线使用不同的样式。假设让它们宽 1-2 个像素。

由于您无法指定每个单元格的网格样式,我所做的是 setGrid(false) 然后将我自己的网格线绘制为委托中的单元格内容。

但是后来我从第 1 点开始遇到了一个问题。然后你指示 Qt 在某个单元格上使用委托,然后委托将获得一个paintEvent Qt 清除单元格的背景。在隐藏网格的情况下,Qt 清除的背景矩形比所需的大一个像素。可能它可以被认为是一个 Qt 错误,因为它们不尊重网格可见性,但这会导致删除相邻单元格中的网格线,因此您不仅必须在委托中绘制单元格自己的网格,还要重新计算正确的单元格矩形,检查是否Qt 犯了一个错误(通过分析 QPainter rect),确定从相邻单元格中删除的内容是否需要恢复并重新绘制。这导致了非常复杂的委托逻辑,我不能认为它是一个不错的解决方案。

所以问题 2 可以改写为我们知道在 QTableView 中为每个单元格设置网格的一种体面的方式吗?

4

2 回答 2

1

OMG,这么多字,你能挑出最重要的信息吗?

于 2013-04-19T06:59:44.063 回答
1

我会做这样的事情:

创建一个委托。子类QAbstractTableModel和重新实现data方法。您的实现应该返回单元格文本,但如果是用户定义的角色之一(如字体或颜色或任何单元格文本。您可以使用上面的任何角色编号)Qt::DisplayRole,也可以返回您想要的任何内容。您的模型应该发出信号以通知内容已更改并应重绘。roleQt::UserRoledataChangedQTableView

然后在委托中,您只需使用重载请求此数据QAbstractTableModel::data并按照您想要的方式绘制它。

于 2013-04-19T07:07:42.563 回答