Почему 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.
[...]