0

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

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

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

谢谢。

4

1 回答 1

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"。如果在绘制文本时使用了填充,则对这些矩形应用填充。

现在您知道了项目坐标中的点击位置和单词的边界矩形。这就是你所需要的。

于 2013-10-12T11:13:13.550 回答