You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 TextEdit:为选中文本添加超链接并重置光标格式

解决PyQt5 TextEdit添加超链接后后续输入继承格式的问题

问题根源在于:给选中文本设置超链接格式后,光标会继承当前位置的超链接格式,导致后续输入的文本自动变成超链接样式。要实现类似Word、Google Docs的行为,需要在设置完选中文本的格式后,重置光标为默认字符格式。

以下是修改后的完整代码:

from PyQt5 import QtCore, QtGui, QtWidgets, Qt

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(320, 240)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.SetHyperLink)
        self.verticalLayout.addWidget(self.pushButton)
        self.textEdit = QtWidgets.QTextEdit(Form)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout.addWidget(self.textEdit)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "添加超链接"))
        
    def SetHyperLink(self):
        cursor = self.textEdit.textCursor()
        # 没有选中内容时直接返回
        if not cursor.hasSelection():
            return
        
        # 为选中文本设置超链接格式
        fmt = cursor.charFormat()
        fmt.setForeground(Qt.QColor("blue"))
        address = 'http://example.com'
        fmt.setAnchor(True)
        fmt.setAnchorHref(address)
        fmt.setToolTip(address)
        cursor.setCharFormat(fmt)
        
        # 创建默认字符格式,匹配TextEdit的默认样式
        default_fmt = QtGui.QTextCharFormat()
        default_fmt.setFont(self.textEdit.document().defaultFont())
        default_fmt.setForeground(self.textEdit.textColor())
        
        # 重置光标格式为默认,避免后续输入继承超链接样式
        cursor.setCharFormat(default_fmt)
        # 更新TextEdit的光标状态
        self.textEdit.setTextCursor(cursor)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

关键修改说明:

  1. 增加选中判断:没有选中内容时直接返回,避免无效操作。
  2. 重置光标格式:创建默认的QTextCharFormat,匹配TextEdit的默认字体、颜色等样式,然后将光标格式设置为该默认格式,确保后续输入使用正常样式。
  3. 更新光标状态:调用setTextCursor将修改后的光标同步到TextEdit中,确保格式重置生效。

这样修改后,即使光标位于超链接文本末尾,后续输入的内容也会恢复为默认格式,和Word等办公软件的行为一致。

内容的提问来源于stack exchange,提问作者Aem Aem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:50:25