سؤال

أنا أستخدم 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 في نفس الدليل مثل برنامجي الرئيسي.

يتم تفسير المسارات النسبية بالنسبة إلى دليل العمل الحالي الذي لا يلزم أن يكون هو نفسه دليل Exectable.

لقد واجهت هذا ، لذلك سأقوم بنشر مقتطف الاختبار الخاص بي هنا ؛ يولد المقتطف ملف .html و .css في نفس الدليل مثل البرنامج النصي Python ؛ وتم استدعاء البرنامج النصي من نفس الدليل للاختبار.

على الأقل في python/PyQt4, ، يبدو أنه - في الواقع - هو كذلك فقط المسارات المطلقة التي تعمل مع setHtml.

يمكن أن يكون رمز الاختبار إما:

compare_qtwebkit-test.py

ال 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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top