首页 > 解决方案 > 使用 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')
    

标签: pythonpyqtpyqt5qresourceqdesktopservices

解决方案


为什么不显示 HTML?

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

pyrcc your_resource.qrc -o your_resource_rc.py

在我的例子中,我的 qresource 是生成 resource_rc.py 文件的 resource.qrc,因此您必须将其导入到 .py 中。

qresource 路径是虚拟的,它们不存在于硬盘中,所以当要使用该文件时,浏览器将找不到它,因此解决方案是将其转换为本地文件,我们可以将其保存为 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
  • QTextEdit,QPlainTextEdit等。
  • QWebEngineView,QWebView等。

2. 找不到html文件时,如何让脚本抛出异常?

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

bool QDesktopServices::openUrl(const QUrl &url)

在适合用户桌面环境的 Web 浏览器中打开给定的 url,如果成功则返回 true;否则返回假。

[...]


推荐阅读