Customising location-sensitive context menu in QTextEdit
我正在调整qtextedit中的上下文菜单。我已成功访问并显示默认菜单,代码如下:
1 2 3 4 5 | class LinkTextBrowser(QTextBrowser): def contextMenuEvent(self, event): menu = self.createStandardContextMenu(event.pos()) # do stuff to menu here menu.popup(event.globalPos()) |
但是,这对位置敏感的单击不起作用。有问题的情况是qtextbrowser右键单击菜单中的"复制链接位置"项,仅当出于明显原因右键单击链接时才启用该项。我不能让它永远启用。我怀疑我将错误的位置传递给了CreateStandardContextMenu,但我无法找到正确的位置来提供它。
我尝试过event.globalpos()和event.pos(),但都不起作用。我还查看了qtextedit的源代码,但没有找到任何地方。它期望什么职位?
编辑:更新:问题似乎在于文本浏览器中的滚动;如果我滚动到窗口的顶部并使用event.pos(),它就会起作用。我还没有有效的代码,但是纠正滚动是解决方案。
(具体来说,我想断开复制链接位置操作发出的信号,并将其连接到我自己的函数,这样我可以在将URL复制到剪贴板之前对其进行调整,允许我在复制之前将链接设为绝对链接等等,并且我不特别想重新写入工作位。)
也许你可以尝试一下:
1 2 3 | QMenu *menu = new QMenu(); menu->addAction(...); menu->exec(textEdit->mapToGlobal(pos)); |
号
它是C++,但我确信你可以很容易地把它转换成Python。
以下是坐标的工作转换:
1 2 3 4 5 6 7 8 9 10 11 | class LinkTextBrowser(QTextBrowser): def contextMenuEvent(self, event): self.link_pos = event.pos() # correct for scrolling self.link_pos.setX(self.link_pos.x() + self.horizontalScrollBar().value()) self.link_pos.setY(self.link_pos.y() + self.verticalScrollBar().value()) menu = self.createStandardContextMenu(self.link_pos) # do stuff to menu menu.popup(event.globalPos()) |
试试