使用 mousePressEvent() 和 mouseReleaseEvent() 在 QTextBrowser 中选择文本

Posted

技术标签:

【中文标题】使用 mousePressEvent() 和 mouseReleaseEvent() 在 QTextBrowser 中选择文本【英文标题】:Selection of text in QTextBrowser using mousePressEvent() and mouseReleaseEvent() 【发布时间】:2018-04-11 07:01:44 【问题描述】:

我有一个QTextBrowser,我想选择里面的一部分文本,我需要选择开始和结束的位置。我想用mousePressEventmouseReleaseEvent 做到这一点。这是我的代码,

class MainWindow(QMainWindow, TeamInsight.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
    def set_text(self):
        self.textBrowser.setText('test strings are here')

textBrowser 在 MainWindow 中。如何为 textBrowser 中的文本实现 mousePressEventmouseReleaseEvent

【问题讨论】:

QTextBrowser 已经实现了鼠标文本选择。为什么又要实现呢? 我想在选定的字符串位置等于特定值时触发另一种方法。 好的,我明白了,当你说我需要选择的开始和结束的位置时,你的意思是什么类型的单位,以像素为单位?跨度> 我的意思是选择的起始字符和结束字符的位置。例如:假设字符串是 'test' 。字母“e”的位置是 1。“s”的位置是 2。 self.browserInput.selectionChanged.connect(self.position) def position(self): start = self.browserInput.textCursor().selectionStart() end = self.browserInput.textCursor().selectionEnd() 这段代码给了我一个部分解决方案。但是当我进行选择时它会给出多个值。 【参考方案1】:

如果你想跟踪事件并且你不能覆盖类,解决方案是安装一个事件过滤器,在你的情况下,只是MouseButtonRelease事件,我们必须过滤QTextBrowserviewport()

import sys

from PyQt5.QtCore import QEvent
from PyQt5.QtWidgets import QMainWindow, QApplication

import TeamInsight


class MainWindow(QMainWindow, TeamInsight.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.browserInput.viewport().installEventFilter(self)
        self.browserInput.setText("some text")

    def eventFilter(self, obj, event):
        if obj is self.browserInput.viewport():
            if event.type() == QEvent.MouseButtonRelease:
                if self.browserInput.textCursor().hasSelection():
                    start = self.browserInput.textCursor().selectionStart()
                    end = self.browserInput.textCursor().selectionEnd()
                    print(start, end)
            elif event.type() == QEvent.MouseButtonPress:
                print("event mousePressEvent")
        return QMainWindow.eventFilter(self, obj, event)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

【讨论】:

非常感谢@eyllanesc。这给了我解决方案。

以上是关于使用 mousePressEvent() 和 mouseReleaseEvent() 在 QTextBrowser 中选择文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QPushButtons 上使用 mousePressEvent

QWidget::mousePressEvent() 同时在两个小部件上

mousePressEvent 没有正确绑定?

使用 PyQT,如何为带有自定义列表的 QComboBox 过滤 mousePressEvent

事件(QEvent*)与 mousePressEvent(QMouseEvent *)冲突?

如何使用 mousepressEvent 打开一个新的小部件