我需要获取在表格小部件或表格视图单元(或列表小部件(视图))中单击的单词。
表格(列表)视图或小部件不可编辑。
可能吗?如果是这样,我该怎么做?
谢谢。
这是一项非常复杂的任务。
首先,将事件过滤器附加到视图viewport()
并监视鼠标事件。QMouseEvent
对象将包含视口坐标。用于QAbstractItemView::indexAt
找出单击了哪个模型索引。用于QAbstractItemView::visualRect
获取索引的矩形。event->pos() - visual_rect.topLeft()
将为您提供相对于视图项的鼠标坐标。
这是最复杂的部分。没有办法确定单词的位置。默认的 Qt 委托没有任何 API。并且文档没有关于文本是如何绘制的任何信息。项目外观可以因为样式表、模型数据甚至操作系统而改变。
所以我们需要创建自己的 gelegate 来完全控制绘图。创建一个子类QStyledItemDelegate
并重新实现sizeHint
和paint
。在sizeHint
确定文本的总大小时使用QFontMetrics::boundingRect
. paint
随心所欲地画。
现在我们确切地知道文本是如何绘制的。我们知道字体、初始位置等。最后一步是确定每个单词的边界矩形。让我们的示例文本为"word1 word2 word3"
. 用于QFontMetrics::boundingRect
确定文本"word1"
、"word1 word2"
、 . 的边界矩形"word1 word2 word3"
。从第二个矩形中减去第一个矩形以获得 的边界矩形"word2"
。从第三个矩形中减去第二个矩形以获得 的边界矩形"word3"
。如果在绘制文本时使用了填充,则对这些矩形应用填充。
现在您知道了项目坐标中的点击位置和单词的边界矩形。这就是你所需要的。