Domanda

Sto usando un QWebView per visualizzare alcuni contenuti e voglio usare CSS personalizzato per agghindare l'uscita. Ho scoperto che posso utilizzare il metodo QWebSettings.setUserStyleSheetUrl() per caricare il mio CSS nella vista. Il file .css si trova nella stessa directory come il mio programma principale.

self.webview = QWebView(MainWindow)
self.webview.settings().setUserStyleSheetUrl(QUrl.fromLocalFile("myCustom.css"))

Tuttavia, allo stile personalizzati non vengono caricati quando aggiungo il contenuto della pagina utilizzando setHtml(). Ho testato che il CSS sia correttamente applicando al HTML in un browser standard.

Qualche idea di cosa sto facendo male?

È stato utile?

Soluzione

In Qt, tutti i percorsi a file esterni devono essere ASSOLUTA i percorsi, non quelli relativi.

Per risolvere il problema, aggiungo per apportare la seguente modifica:

path = os.getcwd()
self.webview.settings().setUserStyleSheetUrl(QUrl.fromLocalFile(path + "/myCustom.css"))

E tutto ha funzionato correttamente. Speriamo che questo aiuterà qualcuno in futuro e salvare loro un paio d'ore di debug.

Altri suggerimenti

  

In Qt, tutti i percorsi a file esterni   devono essere percorsi assoluti, non   quelli relativi.

Non è vero. Il seguente codice funziona per me.

#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();
}
  

Il file css si trova nella stessa directory   come il mio programma principale.

I percorsi relativi vengono interpretati relativo alla directory di lavoro corrente, che non deve necessariamente essere la stessa directory del file eseguibile.

Ho appena incontrato questo, quindi vi posto il mio test frammento qui; frammento genera il proprio html e file css nella stessa directory dello script python; e lo script è stato chiamato dalla stessa directory per il test.

Almeno in python / PyQt4, sembra che - anzi - è solo percorsi assoluti che lavorano con setHtml.

Il codice di test possibile:

compare_qtwebkit-test.py

Il metodo setHtml sembra mostrare il testo in stile solo con la specifica c3, dove viene utilizzato file:// + percorso assoluto. ( EDIT: voleva solo notare che il suggerimento in questo post , a "provare Arora (un semplice involucro in cima QtWebKit), se funziona, il suo codice, se non è così. , il suo sito internet." è stato molto utile per il comportamento di duplice controllo )

Questa è la configurazione dello script è stato testato su:

$ 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+

Lo script è:

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top