How to set QWebView content from QHelpEngineCore to enable CSS links?



  • As the title suggests I am setting the content of a QWebView from QHelpEngineCore content. Problem is in order to load the data into QWebView I have to get the data content from QHelpEngine::fileData which is the html and does not give QWebView a valid URL to base further loads from.

    Question is, how to either get URL's from QHelpEngineCore that QWebView can use -or- how to set all the data to QWebView so that it will display properly (including CSS files included in a <link/>, or maybe a third option??

    Thanks for the help.



  • Let me ask this another way. Is there any way to intercept url's QWebView or QWebPage is trying to load and set the content the link would have loaded manually?



  • Another way that would work if I could figure out how to do it is for me to manually add the css file to a page; while not ideal this would be acceptable. .. anyone? :)

    Thanks.



  • Hi,

    how do you set the html content for the QWebView? If your using QWebView::setHtml(QString html, QUrl url), you just have to provide the URL you used for QHelpEngineCore::fileData(QUrl url).
    Or if the css file is not at the same location as the html file just extract the file location as specified in the html and use this location. To get the location of the css as specified in the html you could do this:

    @
    QStringList cssFiles;
    QWebElementCollection styleSheetLink = m_MyHtmlView()->page()->mainFrame()->findAllElements("link[rel=stylesheet]");
    for(int i = 0; i < styleSheetLink.count(); ++i)
    {
    cssFiles << styleSheetLink.at(i).attribute("href");
    }@



  • I tried that, unfortunately QWebView does not (as far as I can tell) recognize qthelp:// url schemes.



  • Sry I'm not familiar with the mechanics or use of the HelpEngine. How exactly do the returned Url's look like? In QHelpEngineCore's documentation it says:
    QUrl QHelpEngineCore findFile( const QUrl &url) const
    Returns an invalid URL if the file url cannot be found. If the file exists, either the same url is returned or a different url if the file is located in a different namespace which is merged via a common virtual folder.

    don't know if that might be of any help.



  • I can load url's no problem. The problem is the urls within the page itself, QWebView does not recognize QtHelp url's and there appears to be no way to intercept the urls and load the data yourself to pass on to the web view as you can with QTextBrowser.



  • If you could read the content of the css files you could then create a new file at any location insert the css content and set your own Url for the WebView. Bit of an overkill but I can't think of anything else. Sorry.



  • Unfortunately that is what I ended up doing, while it is working ok for now since I am only looking for a single css file; this approach will limit me when it comes to inserting other things, such as Images. :(



  • How does QHelpEngineCore store the file connected to a Url internally? Are the files stored in a Resource file, or are they actually stored at a specific location like maybe "..\QHelpEngineCoreInstallationDir\files\someFile.css" so you could map the QUrl provided by QHelpEngineCore to a representation you can use for your WebView.



  • They are stored in a sqlite database.



  • Can i bring this topic back to life?

    I thought that with this code it would work:
    @QByteArray helpData = m_helpEngine->fileData(url);
    QByteArray styles = m_helpEngine->fileData(QUrl("qthelp://com.mynamespace/doc/styles/style.css"));
    if(!helpData.isEmpty())
    {
    ui->webView->setStyleSheet(styles);
    ui->webView->setHtml(helpData);
    }@

    Even when using css inline in the HTML-file isn't working.
    You would think the code above should give me a decent webpage with css.

    But no, even my second option isn't showing me anything.



  • the "setHtml(..)":https://qt-project.org/doc/qt-4.8/qwebview.html#setHtml function needs the Html as QString and to be able to load all the resources linked in the Html (e.g. the style sheet) you must provide the BaseUrl. If your Html has no stylesheet resource defined (<link rel="stylesheet" type="text/css" href="myStyleSheet.css">) you may need to add that to make it work.
    Also the "setStyleSheet(..)":https://qt-project.org/doc/qt-4.8/qwidget.html#styleSheet-prop function is inherited from QWidget and is used to set the style for the widget (your WebView) and not the Html content of the WebView.

    Its just a shot in the dark and I haven't tried it myself, but maybe this will work:
    @
    QString myHtmlContent = QString( m_helpEngine->fileData(url) );
    QUrl myBaseUrl = QUrl("qthelp://com.mynamespace/doc/styles")
    if(!myHtmlContent.isEmpty())
    {
    ui->webView->setHtml(myHtmlContent, myBaseUrl);
    }
    @



  • It is showing me more (e.g. an icon where the image has to be) still no styles though.

    This is what is in my head-tag in the html-file:
    <link href="../style/styles.css" rel="stylesheet" type="text/css">

    my map-structure like this:
    doc

    • images
    • style
      styles.css
    • ...

    so the baseUrl should be right with:
    @QUrl("qthelp://com.mynamespace/doc");@

    But doing nothing, are there maybe things QWebview can't display? Cause I even got problems loading a simple online webpage :s



  • If you have problems displaying images, this might result from missing plugins. You need to have the following structure in the directory your running your code from: plugins\imageformats\qjpeg4.dll ... and all the other plugins you need for the different image datatypes. You can find the plugins folder in your Qt folder.

    I really don't know if the combination of qtHelp Urls and Html can work. Maybe you can try to find out more by using the "WebInspector":http://qt-project.org/doc/qt-4.8/qwebinspector.html for your WebPage.



  • I don't think I'm understanding you well.

    I know where to find the plugins (and they are there), but do I need to put the dlls in my debug/release map or in my main projects folder? e.g. myapplication\debug\plugins\imageformats... or myapplication\plugins\imageformats...

    It's a pitty you can't debug assistant, cause that is almost what i need. What it displays.
    But it doens't seem to work in my QWebview.



  • The idea with the plugins was just a guess. I think enabling the "QWebInspector":http://qt-project.org/doc/qt-4.8/qwebinspector.html is the first thing you should try.



  • And how can I use that? I never worked with QWebview (apart from this subject), let alone that I worked with QWebInspector.

    I've tried to put create a QWebPage like:
    @QWebPage *page = ui->webView->page();@
    and a QWebinspector like so:
    @QWebInspector *inspector = new QWebInspector;@

    when i try to set my page, nothing happens, my QWebPage is empty...



  • I haven't used the WebInspector myself but the documentation of it is pretty much selfexplanatory. After you have set the Html content for your WebView, you just need to get the WebPage pointer from the WebView, create the WebInspector and set the page for the WebInspector.
    @
    ui->yourWebView->setHtml(yourContent, yourBaseUrl);
    QWebInspector *inspector = new QWebInspector(ui->yourWebView);
    inspector->setPage(ui->yourWebView->page());
    inspector->setVisible();
    @
    If this is not working, maybe you also need to set some settings to make it work (QWebSettings::DeveloperExtrasEnabled). Have a look at "QWebSettings":https://qt-project.org/doc/qt-4.8/qwebsettings.html this class also has a function called setUserStyleSheetUrl(..).



  • Sorry if I have to bother you again:s
    But nothing is happening. Even not showing the inspector anymore.

    And this is what i'm trying to do:

    @QString myHtmlContent = QString(m_helpEngine->fileData(url));
    QUrl myBaseUrl = QUrl("qthelp://com.mynamespace/doc");
    if(!myHtmlContent.isEmpty())
    {
    // ui->webView->setContent(helpData, QString(), myBaseUrl);
    ui->webView->setHtml(myHtmlContent, myBaseUrl);
    }

    //QWebPage *page = ;
    ui->webView->page()->settings()->DeveloperExtrasEnabled;
    QWebInspector *inspector = new QWebInspector(ui->webView);
    inspector->setPage(ui->webView->page());
    inspector->setVisible(true);@

    [EDIT] It works: @ui->webView->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);@



  • Do the style sheets and images also work now ?



  • Ok now that I got that, nothing seems to be loaded. No images, no stylesheets...



  • !http://wouterverbruggen.be/img/outcome.jpg(outcome)!

    As you can see, no content is loaded (i think)



  • Maybe you can first test with a local Html file ,Css file and image and get that working and then proceed with the qHelp Urls. Just to pinpoint the error source.

    Edit: Have you checked the QString holding the Html content?



  • That indeed could be a good idea, i'll keep you posted



  • With local files it works fine, it shows my pictures and the css i made.

    I have checked the QString, it's filled with the code I programmed and stored in the QHelpEngine.
    Could there be something wrong with my qch, qhc, qhcp or qhp files?

    I took as example the code from "Using Qt Assistant as a Custom Help Viewer":http://doc.qt.nokia.com/4.7-snapshot/assistant-custom-help-viewer.html
    But I don't know if that was the best idea



  • I'm really sorry but I have no experience in using the QHelpEngine and thus am unable to help you with anything related to this component. I fear the problem is that the qHelp Urls can not be used with Html, but this is just a guess. Is there maybe another way to display the help files other then using QWebkit?



  • No problem, maybe I better open a new topic to bring this thing up:) But thanks for the help! You did a great job helping me understand some handy tools ;)

    There is a way, using Assistant, but the problem is that user can browse there (even when you turn this function off). We don't want them to browse, but to only view the pages that are related to the topic.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.