QWebView не загружает внешний CSS
Вопрос
Я использую QwebView для отображения некоторого контента, и я хочу использовать пользовательские CSS для усиления вывода. Я обнаружил, что могу использовать QWebSettings.setUserStyleSheetUrl()
Метод для загрузки моего собственного CSS в вид. А .css
Файл находится в том же каталоге, что и моя основная программа.
self.webview = QWebView(MainWindow)
self.webview.settings().setUserStyleSheetUrl(QUrl.fromLocalFile("myCustom.css"))
Тем не менее, пользовательские стили не загружаются, когда я добавляю контент на страницу, используя setHtml()
. Анкет Я проверил, что CSS правильно применяется к HTML в стандартном браузере.
Есть идеи, что я делаю не так?
Решение
В QT все пути к внешним файлам должны быть Абсолютный пути, а не относительные.
Чтобы решить проблему, я добавляю, чтобы внести следующее изменение:
path = os.getcwd()
self.webview.settings().setUserStyleSheetUrl(QUrl.fromLocalFile(path + "/myCustom.css"))
И все сработало правильно. Надеемся, что это поможет кому -то в будущем и сэкономит им несколько часов отладки.
Другие советы
В QT все пути к внешним файлам должны быть абсолютными путями, а не относительными.
Это не правда. Код ниже работает для меня.
#include <QtCore>
#include <QtGui>
#include <QtWebKit>
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
QMainWindow mainWindow;
QWebView* webView = new QWebView(&mainWindow);
webView->settings()->setUserStyleSheetUrl(QUrl::fromLocalFile("google.css"));
QFile source("google.html");
source.open(QIODevice::ReadOnly);
webView->page()->mainFrame()->setHtml(QString::fromUtf8(source.readAll().constData()));
mainWindow.setCentralWidget(webView);
mainWindow.show();
return app.exec();
}
Файл .css находится в том же каталоге, что и моя основная программа.
Относительные пути интерпретируются относительно текущего рабочего каталога, который не должен быть таким же, как каталог исполняемого файла.
Я только что столкнулся с этим, поэтому я опубликую здесь свой тестовый фрагмент здесь; Фрагмент генерирует свой собственный файл .html и .css в том же каталоге, что и сценарий Python; и сценарий был вызван из того же каталога для тестирования.
По крайней мере в python
/PyQt4
, кажется, - действительно - это Только абсолютные пути, которые работают с setHtml
.
Тестовый код может либо:
- Ползуйтесь полностью (совершенно пустым [В этом случае я бы действительно пожелал
QWebView
выплюнуть некоторые сообщения об ошибках; найденный Как получить подробное сообщение об ошибке, когда Qtwebkit не загружает страницу?, но не могу заставить его работать]); - показать контент без стиля CSS;
- или покажите стиль контента:
А setHtml
Метод, кажется, показывает стиль текста только со спецификацией c3
, куда file://
+ Абсолютный путь используется. (Изменить: просто хотел отметить, что предложение в эта почта, пытаться арора (очень простая упаковка на вершине qtwebkit); Если он работает, это ваш код. Если это не так, это веб-сайт. ")
Это настройка. Сценарий был протестирован на:
$ lsb_release --description --codename
Description: Ubuntu 11.04
Codename: natty
$ apt-show-versions -r python-qt4
python-qt4/natty uptodate 4.8.3-2
python-qt4-dbus/natty uptodate 4.8.3-2
$ apt-show-versions -r libqtwebkit4
libqtwebkit4/natty uptodate 2.1~really2.0.2-0ubuntu1
$ python --version
Python 2.7.1+
Сценарий:
qtwebkit-test.py
#!/usr/bin/env python
# portions from:
# http://pysnippet.blogspot.com/2010/01/more-fun-with-qwebkit.html
import sys
import os
from PyQt4 import QtCore
from PyQt4 import QtGui
from PyQt4 import QtWebKit
global htmltext
def GenerateFiles():
global htmltext
print "GenerateFiles running"
csstext = """
body {
background-color: #058;
margin: 0px;
color: red;
}
"""
css_file = open("test.css", "w")
css_file.write(csstext)
css_file.close()
htmltextTop = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
"""
htmltextBottom = """
<title>qtwebkit-test</title>
</head>
<body>
<h1>HEADING</h1>
<p>Just to test ....</p>
<p>.... and test some more</p>
</body>
</html>
"""
cssopen = '<link rel="stylesheet" type="text/css" href="'
cssclose = '">'
# c1
cssfile = "test.css"
# c2
#~ cssfile = os.path.abspath(os.path.dirname(__file__)) + "/" + "test.css"
# c3
#~ cssfile = "file://" + os.path.abspath(os.path.dirname(__file__)) + "/" + "test.css"
# c4
#~ cssfile = "qrc://" + os.path.abspath(os.path.dirname(__file__)) + "/" + "test.css"
# c5 (empty)
#~ cssfile = ""
cssline = cssopen + cssfile + cssclose
#~ htmltext = htmltextTop + htmltextBottom # without css
htmltext = htmltextTop + cssline + htmltextBottom
html_file = open("test.html", "w")
html_file.write(htmltext)
html_file.close()
def main():
global htmltext
GenerateFiles()
qApp = QtGui.QApplication(sys.argv)
webView = QtWebKit.QWebView()
# l1
#~ webView.load(QtCore.QUrl.fromLocalFile("test.html")) # fails
# l2
#~ webView.load(QtCore.QUrl.fromLocalFile("./test.html")) # fails
# l3
#~ webView.load(QtCore.QUrl.fromLocalFile(os.path.abspath(os.path.dirname(__file__)) + "/" + "test.html")) # this works with #c1-#c3
# setHtml
#print htmltext
webView.setHtml(htmltext) # works with #c3 (rest are unstyled)
webView.show()
webView.resize(500, 400)
webView.setWindowTitle(__file__)
sys.exit(qApp.exec_())
if __name__ == "__main__":
main()