在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())
,它应该考虑滚动位置。
答
也许你可以尝试这样的:
QMenu *menu = new QMenu();
menu->addAction(...);
menu->exec(textEdit->mapToGlobal(pos));
这是C++,但我敢肯定,你可以很容易将其转换为蟒蛇。
它需要在QTextEdit的内容上的位置,不幸的是,不是一个全球性的位置。 – Sam 2011-12-30 13:51:16