我正在尝试调整QTextEdit中的上下文菜单。我已成功访问,然后使用以下代码显示默认菜单:
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的源代码,但没有得到任何结果。它的期望是什么?
编辑:更新:问题是TextBrowser中的滚动问题;如果我滚动到窗口的顶部并使用event.pos()它的行为。我还没有工作代码,但纠正滚动是解决方案。
(具体来说,我想断开复制链接位置操作发出的信号并将其连接到我自己的功能,这样我就可以在将其复制到剪贴板之前调整URL,允许我在复制前进行绝对链接等等,我没有特别希望重写工作位。)
答案 0 :(得分:0)
试试self.mapToGlobal(event.pos())
,它应该考虑滚动位置。
答案 1 :(得分:0)
以下是坐标的工作变换:
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())
答案 2 :(得分:0)
也许你可以尝试类似的东西:
QMenu *menu = new QMenu();
menu->addAction(...);
menu->exec(textEdit->mapToGlobal(pos));
它是C ++,但我确信您可以轻松将其转换为python。