3

QWebViewを使用してコンテンツを表示していますが、カスタムCSSを使用して出力を整えたいと考えています。QWebSettings.setUserStyleSheetUrl()このメソッドを使用して、自分のCSSをビューにロードできることがわかりました。ファイルは私の.cssメインプログラムと同じディレクトリにあります。

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

ただし、を使用してコンテンツをページに追加すると、カスタムスタイルが読み込まれませんsetHtml()。CSSが標準のブラウザのHTMLに適切に適用されていることをテストしました。

私が間違っていることについて何か考えはありますか?

4

3 に答える 3

7

Qtでは、外部ファイルへのすべてのパスは、相対パスではなく、絶対パスである必要があります。

この問題を解決するために、次の変更を追加します。

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

そして、すべてが正しく機能しました。うまくいけば、これは将来誰かを助け、デバッグに数時間を節約するでしょう。

于 2010-02-21T06:34:57.023 に答える
1

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ファイルは私のメインプログラムと同じディレクトリにあります。

相対パスは、実行可能ファイルのディレクトリと同じである必要はない現在の作業ディレクトリを基準にして解釈されます。

于 2011-03-04T19:50:01.380 に答える
1

これに遭遇したので、ここにテストスニペットを投稿します。スニペットは、Pythonスクリプトと同じディレクトリに独自の.htmlファイルと.cssファイルを生成します。スクリプトはテストのために同じディレクトリから呼び出されました。

少なくともpython/PyQt4では、-確かに-で機能するのは絶対パスだけsetHtmlのようです。

テストコードは次のいずれかを実行できます。

compare_qtwebkit-test.py

このメソッドは、 +絶対パスが使用されている仕様でsetHtmlのみスタイル付きテキストを表示するようです。(編集:この投稿の提案は、「arora(QtWebKitの上に非常に単純なラッピング)を試してみてください。機能する場合はコードです。機能しない場合はWebサイトです。」動作を再確認するのに役立ちますc3file://

これは、スクリプトがテストされたセットアップです。

$ 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()
于 2012-11-03T19:08:56.390 に答える