Показать локальный HTML-файл с помощью QDesktopService - PullRequest
0 голосов
/ 14 октября 2018

Я хотел бы показать локальный HTML-файл, когда пользователь нажимает на значок справки.Показанный ниже метод связан с сигналом triggered от значка.В моем методе, показанном ниже, html-файл не открывается в браузере по умолчанию, а часть скрипта except не активируется.У меня есть два вопроса:

  1. Каков наилучший подход к отображению локального HTML-файла с PyQt5?

  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')
    

1 Ответ

0 голосов
/ 14 октября 2018

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

[...]

...