问:如何获取在表或列表视图(小部件)中单击的单词?

时间:2013-10-12 05:23:43

标签: qt

我需要获取在表格小部件或表格视图单元格(或列表小部件(视图))中单击的单词。

表(列表)视图或窗口小部件不可编辑。

有可能吗?如果是这样,我该怎么做?

感谢。

1 个答案:

答案 0 :(得分:0)

这是一项非常复杂的任务。

首先,将事件过滤器附加到视图的viewport()并监视鼠标事件。 QMouseEvent对象将包含视口坐标。使用QAbstractItemView::indexAt查找单击的模型索引。使用QAbstractItemView::visualRect获取索引的矩形。 event->pos() - visual_rect.topLeft()将为您提供相对于视图项的鼠标坐标。

这是最复杂的部分。没有办法确定单词的位置。默认的Qt委托没有任何API。并且文档没有关于如何绘制文本的任何信息。由于样式表,模型数据甚至操作系统,可以更改项目外观。

所以我们需要创建自己的gelegate来完全控制绘图。创建QStyledItemDelegate的子类并重新实现sizeHintpaint。在sizeHint中使用QFontMetrics::boundingRect确定文字的总大小。在paint中根据需要进行绘画。

现在我们确切地知道如何绘制文本。我们知道字体,初始位置等。最后一步是确定每个单词的边界矩形。让我们的示例文本为"word1 word2 word3"。使用QFontMetrics::boundingRect确定文本"word1""word1 word2""word1 word2 word3"的范围。从第二个矩形中减去第一个矩形以获得"word2"的边界矩形。从第三个矩形中减去第二个矩形以获得"word3"的边界矩形。如果在绘制文本时使用填充,请对这些矩形应用填充。

现在您知道项目坐标中的点击位置和“边界值”。这就是你所需要的一切。