Настройка контекстно-зависимого контекстного меню в QTextEdit - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь настроить контекстное меню в 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 голосов
/ 30 декабря 2011

Вот рабочее преобразование координат:

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())
0 голосов
/ 13 февраля 2015

Может быть, вы можете попробовать что-то вроде:

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

Это C ++, но я уверен, что вы можете легко конвертировать его в python.

0 голосов
/ 30 декабря 2011

Попробуйте self.mapToGlobal(event.pos()), должно учитываться положение прокрутки.

...