Показать локальный HTML-файл с помощью QDesktopService
Я хотел бы показать локальный HTML-файл, когда пользователь нажимает на значок справки. Показанный ниже метод связан с triggered
сигнал от значка. В моем методе, показанном ниже, HTML-файл не открывается в браузере по умолчанию и except
часть скрипта не активируется. У меня есть два вопроса:
Каков наилучший подход к отображению локального файла HTML с PyQt5?
Как заставить скрипт выдавать исключение, когда 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')
1 ответ
Почему HTML не отображается?
Путь начинается с :
который указывает, что вы используете qresource, первое, что вы должны сделать, это преобразовать.rc в.py с помощью команды:
pyrcc your_resource.qrc -o your_resource_rc.py
В моем случае мой qresource - это resource.qrc, генерирующий файл resource_rc.py, поэтому вы должны импортировать его в.py.
Пути qresource являются виртуальными, их нет на жестком диске, поэтому при желании использовать этот файл браузер не найдет его, поэтому решение состоит в том, чтобы преобразовать его в локальный файл, мы можем сохранить его с помощью QFile, но этот файл должен быть временным, так что лучше сохранить его с помощью QTeoraryFile.
В вашем случае код должен быть следующим:
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. Как лучше всего показать локальный HTML-файл с помощью PyQt5?
Существует несколько способов отображения HTML, и выбор наилучшего зависит от вас, например, существуют следующие методы:
QDesktopServices::openUrl()
QLabel
QTextEdit
,QPlainTextEdit
, так далее.QWebEngineView
,QWebView
, так далее.
2. Как заставить скрипт генерировать исключение, когда html-файл не находится?
Qt по соображениям эффективности не будет генерировать исключения, поэтому вы не используете try-исключение, за исключением той части кода, которая напрямую зависит от Qt, Qt имеет 2 основных механизма, чтобы уведомить вас о том, что это неправильно, если задача является синхронной, функция будет возвращает логическое значение, указывающее, что задача выполнена правильно или нет, и если ошибка передается асинхронно, будет выдан сигнал, указывающий ее, в случае QDesktopServices::openUrl()
является синхронной задачей, поэтому она возвращает логическое значение, указывающее, была ли задача выполнена успешно:
bool QDesktopServices:: openUrl (const QUrl & url)
Открывает указанный URL в соответствующем веб-браузере для среды рабочего стола пользователя ивозвращает true в случае успеха;в противном случае возвращает false.
[...]