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

时间:2011-12-30 05:51:53

标签: python qt pyqt pyside

我正在尝试调整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,允许我在复制前进行绝对链接等等,我没有特别希望重写工作位。)

3 个答案:

答案 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。