使用 QDesktopService 显示本地 html 文件
Show a local html file using QDesktopService
我想在用户单击帮助图标时显示本地 html 文件。下面显示的方法连接到来自图标的 triggered
信号。在我下面显示的方法中,html 文件没有在我的默认浏览器中打开,脚本的 except
部分没有被激活。我有两个问题:
使用 PyQt5 显示本地 html 文件的最佳方法是什么?
当找不到 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。
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个主要的机制来通知你错误,如果任务是同步的函数将 return 一个布尔值,指示任务是否正确完成,如果异步给出错误将发出一个信号指示它,在 QDesktopServices::openUrl()
的情况下是一个同步任务所以它将 return 一个布尔值,指示任务是否成功执行:
bool QDesktopServices::openUrl(const QUrl &url)
Opens the given url in the appropriate Web browser for the user's
desktop environment, and returns true if successful; otherwise returns
false.
[...]
我想在用户单击帮助图标时显示本地 html 文件。下面显示的方法连接到来自图标的 triggered
信号。在我下面显示的方法中,html 文件没有在我的默认浏览器中打开,脚本的 except
部分没有被激活。我有两个问题:
使用 PyQt5 显示本地 html 文件的最佳方法是什么?
当找不到 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。
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个主要的机制来通知你错误,如果任务是同步的函数将 return 一个布尔值,指示任务是否正确完成,如果异步给出错误将发出一个信号指示它,在 QDesktopServices::openUrl()
的情况下是一个同步任务所以它将 return 一个布尔值,指示任务是否成功执行:
bool QDesktopServices::openUrl(const QUrl &url)
Opens the given url in the appropriate Web browser for the user's desktop environment, and returns true if successful; otherwise returns false.
[...]