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

问题描述:

我想调整QTextEdit中的上下文菜单。我成功地访问并显示了默认菜单,其代码如下:在QTextEdit中自定义位置敏感的上下文菜单

class LinkTextBrowser(QTextBrowser): 
    def contextMenuEvent(self, event): 
     menu = self.createStandardContextMenu(event.pos()) 
     # do stuff to menu here 
     menu.popup(event.globalPos()) 

但是,这对位置敏感的点击无效。有问题的情况是QTextBrowser的右键菜单中的“复制链接位置”项,该菜单仅在右键单击链接时才启用,原因很明显。我无法将它启用。我怀疑我通过错误的位置来创建标准上下文菜单,但我无法弄清楚它的正确位置。

我已经尝试event.globalPos()和event.pos(),都没有工作。我也看了QTextEdit的源代码,但没有得到任何地方。它期望什么位置?

编辑:更新:看来问题是在TextBrowser中滚动;如果我滚动到窗口的顶部并使用event.pos()它的行为。我还没有工作代码,但纠正滚动是解决方案。 (具体来说,我想断开复制链接位置操作发出的信号并将其连接到我自己的函数,这样我就可以在将URL复制到剪贴板之前调整它的URL,从而使我可以在创建链接之前绝对地等等复制,并且我没有特别的愿望来重新编写工作位)。

这里的工作变换坐标:

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()),它应该考虑滚动位置。

+0

它需要在QTextEdit的内容上的位置,不幸的是,不是一个全球性的位置。 – Sam 2011-12-30 13:51:16

也许你可以尝试这样的:

QMenu *menu = new QMenu(); 
menu->addAction(...); 
menu->exec(textEdit->mapToGlobal(pos)); 

这是C++,但我敢肯定,你可以很容易将其转换为蟒蛇。