如何解决在 QTextBrowser
我正在使用 Python 应用程序。在程序的某些部分,我通知用户创建了不同的文件。我在 QTextbrowser
小部件中显示此信息。我希望此文本是超链接的,因此如果用户单击超链接,该文件将在外部应用程序中打开。如果文件路径没有空格,则链接有效 - 但如果路径有空格,则链接无效。
我阅读了很多关于此的问题,但我没有找到解决方案。
我写了这两个测试。
代码 1 - 我使用 QLabel
并且链接工作正常,但在 QTextbrowser
中它在浏览器中打开。
选项 1 有效,但其余选项无效,因为路径有空格。
选项 7 和 10,在浏览器中打开文件。
代码 1:
import sys
from PyQt5.QtWidgets import QApplication,QTextbrowser,QTextEdit,QLabel
from PyQt5.QtCore import QUrl
app = QApplication(sys.argv)
label=QLabel()
file_2='c:/temp/test 2/test.docx'
urlLink="<a href='file:///%s'>'Option_12'</a>"%(file_2)
label.setText(urlLink)
label.setopenExternalLinks(True)
label.show()
sys.exit(app.exec_())
代码 2:
import sys
from PyQt5.QtWidgets import QApplication,QTextEdit
from PyQt5.QtCore import QUrl
if __name__ == '__main__':
app = QApplication(sys.argv)
text_area = QTextbrowser()
file='c:/temp/test.docx'
link='<a href='"'{}'"'>Option_1</a>'.format(file)
text_area.insertHtml(link)
file_2='c:/temp/test 2/test.docx'
link='<br><a href='"'{}'"'>Option_2</a></br>'.format(file_2)
text_area.insertHtml(link)
file_2_reformated=file_2.replace(" ","\\ ")
link='<br><a href='"'{}'"'>Option_3</a></br>'.format(file_2_reformated)
text_area.insertHtml(link)
file_2_reformated=file_2.replace(" ","%20")
link='<br><a href='"'{}'"'>Option_4</a></br>'.format(file_2_reformated)
text_area.insertHtml(link)
file_2_reformated=chr(34)+file_2+chr(34)
link='<br><a href='"'{}'"'>Option_5</a></br>'.format(file_2_reformated)
text_area.insertHtml(link)
file_2_reformated = " \"" + file_2 + " \""
link='<br><a href='"'{}'"'>Option_6</a></br>'.format(file_2_reformated)
text_area.insertHtml(link)
link='<br><a href='"'file:///{}'"'>Option_7</a></br>'.format(file_2)
text_area.insertHtml(link)
link='<br><a href='"'https://{}'"'>Option_8</a></br>'.format(file_2)
text_area.insertHtml(link)
file_3="file:///c:/temp/test 2/test.docx"
link='<br><a href='"'https://{}'"'>Option_9</a></br>'.format(file_3)
text_area.insertHtml(link)
file_2='c:/temp/test 2/test.docx'
link = '<br><a href="{}">Option_10</a></br>'.format(QUrl.fromLocalFile(file_2).toString())
text_area.insertHtml(link)
file_2='c:/temp/test 2/test.docx'
link = '<br><a href="\'{}\'">Option_11</a></br>'.format(QUrl.fromLocalFile(file_2).toString())
text_area.insertHtml(link)
from pathlib import PureWindowsPath
file_3 = PureWindowsPath("c:/temp/test 2/test.docx")
link = '<br><a href="{}">Option_13</a></br>'.format(file_3.as_uri())
text_area.insertHtml(link)
text_area.setopenExternalLinks(True)
text_area.show()
sys.exit(app.exec_())
@ekhumoro 的解决方案
import sys
from PyQt5.QtWidgets import QApplication,QTextbrowser
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QUrl
if __name__ == '__main__':
app = QApplication(sys.argv)
text_area = QTextbrowser()
text_area.setopenLinks(False)
def handle_links(url):
if not url.scheme():
url = QUrl.fromLocalFile(url.toString())
QDesktopServices.openUrl(url)
text_area.anchorClicked.connect(handle_links)
file='c:/temp/test.docx'
link='<a href='"'{}'"'>Option_1</a>'.format(file)
text_area.insertHtml(link)
file_2='c:/temp/test 2/test.docx'
link='<br><a href='"'file:///{}'"'>Option_7</a></br>'.format(file_2)
text_area.insertHtml(link)
link = '<br><a href="{}">Option_10</a></br>'.format(QUrl.fromLocalFile(file_2).toString())
text_area.insertHtml(link)
from pathlib import PureWindowsPath
file_3 = PureWindowsPath("c:/temp/test 2/test.docx")
link = '<br><a href="{}">Option_13</a></br>'.format(file_3.as_uri())
text_area.insertHtml(link)
text_area.show()
sys.exit(app.exec_())
解决方法
问题是 setOpenExternalLinks(True) 将不打开带有 file:scheme 的 url - 但您必须使用 file:scheme 打开文件路径包含空格。要解决此问题,您可以使用自定义链接处理程序。以下脚本显示了如何执行此操作:
import sys
from PyQt5.QtWidgets import QApplication,QTextBrowser
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QUrl
if __name__ == '__main__':
app = QApplication(sys.argv)
text_area = QTextBrowser()
text_area.setOpenLinks(False)
def handle_links(url):
if not url.scheme():
url = QUrl.fromLocalFile(url.toString())
QDesktopServices.openUrl(url)
text_area.anchorClicked.connect(handle_links)
file = 'c:/temp/test.docx'
link = '<a href="{}">Option_1</a>'.format(file)
text_area.insertHtml(link)
file_2 = 'c:/temp/test 2/test.docx'
link = '<br><a href="{}">Option_2</a></br>'.format(file_2)
text_area.insertHtml(link)
text_area.show()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。