使用 QDesktopService 显示本地 html 文件



我想在用户单击帮助图标时显示本地html文件。 下面显示的方法连接到图标中的triggered信号。 在下面显示的方法中,html文件未在我的默认浏览器中打开,并且脚本的except部分未被激活。 我有两个问题:

  1. 使用 PyQt5 显示本地 html 文件的最佳方法是什么?

  2. 如何使脚本在找不到 html 文件时引发异常?

    def helpScreen(self):
    try:
    urlLink = QUrl.fromLocalFile(':/plugins/geomAttribute/help/index_en.html')
    QDesktopServices.openUrl(urlLink)
    except:
    QMessageBox.warning(None, 'Warning', 'Unable to locate help file')
    

为什么不显示 HTML?

路径以:开头,表示您正在使用 qresource,您必须做的第一件事是使用以下命令将 .rc 转换为 .py:

pyrcc your_resource.qrc -o your_resource_rc.py

就我而言,我的 qresource 是 resource.qrc 生成resource_rc.py文件,因此您必须将其导入.py。

q资源路径是虚拟的,它们不存在于硬盘中,因此当想要使用该文件时,浏览器将找不到它,因此解决方案是将其转换为本地文件,我们可以将其与QFile保存,但此文件必须是临时的,因此最好将其与QTemporaryFile一起保存。

在您的情况下,代码应如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets

class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
lay = QtWidgets.QVBoxLayout(self)
button = QtWidgets.QPushButton("Help")
button.clicked.connect(self.helpScreen)
lay.addWidget(button)
def helpScreen(self):
resource_path = ":/plugins/geomAttribute/help/index_en.html"
resource_file = QtCore.QFile(resource_path)
if resource_file.open(QtCore.QIODevice.ReadOnly):
tmp_file = QtCore.QTemporaryFile(self)
tmp_file.setFileTemplate("XXXXXX.html")
if tmp_file.open():
tmp_file.write(resource_file.readAll())
resource_file.close()
tmp_file.flush()
url = QtCore.QUrl.fromLocalFile(tmp_file.fileName())
if QtGui.QDesktopServices.openUrl(url):
return
QtWidgets.QMessageBox.warning(None, 'Warning', 'Unable to locate help file')

import resource_rc

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
<小时 />

1。使用 PyQt5 显示本地 html 文件的最佳方法是什么?

有几种方法可以显示 HTML,最佳选择取决于您,例如有以下方法:

  • QDesktopServices::openUrl()
  • QLabel
  • QTextEditQPlainTextEdit
  • QWebEngineViewQWebView

阿拉伯数字。如何使脚本在找不到 html 文件时引发异常?

Qt 出于效率原因不会抛出异常,所以你不要使用 try——除了在代码中直接依赖 Qt 的部分,Qt 有 2 种主要机制来通知你它是错误的,如果任务是同步的,函数将返回一个布尔值,指示任务是否正确完成, 如果错误是异步给出的,则会发出一个信号来指示它,在QDesktopServices::openUrl()是一个同步任务的情况下,它将返回一个布尔值,指示任务是否成功执行:

bool QDesktopServices::openUrl(const QUrl &url(

在相应的 Web 浏览器中为用户的 桌面环境,如果成功则返回 true;否则返回 假。

[...]

最新更新