使用QDesktopService显示本地html文件

时间:2018-10-14 00:01:26

标签: python pyqt pyqt5 qresource qdesktopservices

当用户单击帮助图标时,我想显示一个本地html文件。如下所示的方法已连接到来自图标的$(function() { var adim; $('#points').on('input', function() { var element = $('#points'), deger = element.val() // Set rules here if (deger < 20) { adim = 1; } else if (deger == 20) { adim = adim === 2 ? 1 : 2; } else if (deger == 50) { adim = adim == 5 ? 2 : 5; } else if (deger == 100) { adim = adim == 10 ? 5 : 10; } else if (deger == 200) { adim = adim == 50 ? 10 : 50; } element.attr('step', adim); element.attr('min', adim); $('#deger').text(deger); $('#adim').text(adim); }); }); 信号。在下面显示的方法中,未在默认浏览器中打开html文件,并且未激活脚本的triggered部分。我有两个问题:

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

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

    except

1 个答案:

答案 0 :(得分:0)

为什么不显示HTML?

路径以:开头,表示您正在使用qresource,首先要做的是使用以下命令将.rc转换为.py:

pyrcc your_resource.qrc -o your_resource_rc.py

在我的情况下,我的qresource是resource.qrc生成的resource_rc.py文件,因此必须将其导入.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
  • QTextEditQPlainTextEdit
  • QWebEngineViewQWebView

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

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

  

布尔QDesktopServices :: openUrl(const QUrl&url)

     

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

     

[...]