关于python:在QTextEdit中自定义位置敏感的上下文菜单

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())


试试self.mapToGlobal(event.pos()),应该考虑滚动位置。