Шрифты Google (ttf) игнорируются в QtWebEngine при использовании @font face

#python #css #pyqt #pyqt5 #qtwebengine

#python #css #pyqt #pyqt5 #qtwebengine

Вопрос:

Я пытаюсь загрузить шрифт Google в мое приложение pyqt5 QtWebEngine.

Приложение загружает локальный HTML-файл с настройкой css. Я использовал font face для загрузки файла ttf, как показано ниже:

 @font-face {
	font-family: "Work Sans";
	src: url("C:UsersGodwinTIATfontsWorkSans-Regular.ttf") format('truetype');
}

body {
	font-family: "Work Sans";
	background-color: #eef0f2;
}  

шрифт, похоже, игнорируется при загрузке html-файла.

Может кто-нибудь, пожалуйста, помочь.

Редактироватьстрогий текст

Вот мой полный html

 @font-face {
    font-family: Work Sans;
    src: url("Work_Sans/WorkSans-Regular.ttf")
}

div {
    font-family: Work Sans;
  }  
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" type="text/css" href="style.css"/>
    <title>Document</title>
</head>
<style>
</style>
<body>
    <div>
        Hello World
    </div>
</body>
</html>  

Это работает в Chrome, firefox и chrome, но если я использую qtwebengine следующим образом

 from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

if __name__ == "__main__":

    import sys
    sys.argv.append("--disable-web-security")
    app = QtWidgets.QApplication(sys.argv)
    wnd = QtWidgets.QWidget()
    genVLayout = QtWidgets.QVBoxLayout(wnd)
    verticalLayout_7 = QtWidgets.QVBoxLayout()
    webEngineViewGen = QtWebEngineWidgets.QWebEngineView(wnd)
    webEngineViewGen.setUrl(QtCore.QUrl("about:blank"))
    fh = open('main.html','r')
    html = fh.read()
    webEngineViewGen.setHtml(html)

    verticalLayout_7.addWidget(webEngineViewGen)
    genVLayout.addLayout(verticalLayout_7)
    wnd.show()
    sys.exit(app.exec_())
  

этот шрифт не работает

Комментарии:

1. работает ли это также с qtwebengine, я вижу, что это работает в других браузерах, но почему-то не работает с QtWebEngine

2. позвольте мне проверить остальную часть моего кода

3. я отредактировал свой пост, html работает с браузерами, но не в pyqt

4. смотрите мое решение

Ответ №1:

Если вы используете setHtml() , то, как указано в документах, внешние ресурсы будут относиться к URL, который вы передаете в качестве вторых параметров:

аннулирует QWebEngineView::setHtml(const QString amp; html, const QUrl amp; baseUrl = QUrl())

[…]

Внешние объекты, такие как таблицы стилей или изображения, на которые ссылаются в документе HTML, расположены относительно baseUrl.

[…]

Итак, в вашем случае решение таково:

 import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

if __name__ == "__main__":
    import sys
    sys.argv.append("--disable-web-security")
    app = QtWidgets.QApplication(sys.argv)
    wnd = QtWidgets.QWidget()
    genVLayout = QtWidgets.QVBoxLayout(wnd)
    verticalLayout_7 = QtWidgets.QVBoxLayout()
    webEngineViewGen = QtWebEngineWidgets.QWebEngineView(wnd)
    webEngineViewGen.setUrl(QtCore.QUrl("about:blank"))
    with open('main.html','r') as fh:
        html = fh.read()
        current_dir = os.path.dirname(os.path.abspath(__file__))
        url = QtCore.QUrl.fromLocalFile(os.path.join(current_dir, "main.html"))
        webEngineViewGen.setHtml(html, url)
    verticalLayout_7.addWidget(webEngineViewGen)
    genVLayout.addLayout(verticalLayout_7)
    wnd.show()
    sys.exit(app.exec_())
  

Или просто используйте load() метод:

 import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets

if __name__ == "__main__":
    import sys
    sys.argv.append("--disable-web-security")
    app = QtWidgets.QApplication(sys.argv)
    wnd = QtWidgets.QWidget()
    genVLayout = QtWidgets.QVBoxLayout(wnd)
    verticalLayout_7 = QtWidgets.QVBoxLayout()
    webEngineViewGen = QtWebEngineWidgets.QWebEngineView(wnd)
    webEngineViewGen.setUrl(QtCore.QUrl("about:blank"))
    current_dir = os.path.dirname(os.path.abspath(__file__))
    url = QtCore.QUrl.fromLocalFile(os.path.join(current_dir, "main.html"))
    webEngineViewGen.load(url)
    verticalLayout_7.addWidget(webEngineViewGen)
    genVLayout.addLayout(verticalLayout_7)
    wnd.show()
    sys.exit(app.exec_())
  

Комментарии:

1. Спасибо eyllanesc. Позвольте мне попробовать это

2. Работает отлично. Спасибо!