QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
qgshtmlwidgetwrapper.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgshtmlwidgetwrapper.h
3 
4  ---------------------
5  begin : 23.03.2019
6  copyright : (C) 2019 by Alessandro Pasotti
7  email : elpaso at itopen dot it
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include "qgshtmlwidgetwrapper.h"
18 #include "qgsmessagelog.h"
20 #include "qgsapplication.h"
21 #include "qgswebframe.h"
22 #include <QScreen>
23 
24 QgsHtmlWidgetWrapper::QgsHtmlWidgetWrapper( QgsVectorLayer *layer, QWidget *editor, QWidget *parent )
25  : QgsWidgetWrapper( layer, editor, parent )
26 {
27  connect( this, &QgsWidgetWrapper::contextChanged, this, &QgsHtmlWidgetWrapper::setHtmlContext );
28 }
29 
31 {
32  return true;
33 }
34 
35 QWidget *QgsHtmlWidgetWrapper::createWidget( QWidget *parent )
36 {
37  return new QgsWebView( parent );
38 }
39 
40 void QgsHtmlWidgetWrapper::initWidget( QWidget *editor )
41 {
42  mWidget = qobject_cast<QgsWebView *>( editor );
43 
44  if ( !mWidget )
45  return;
46 
47  mWidget->setHtml( mHtmlCode );
48 #ifdef WITH_QTWEBKIT
49 
50 #if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
51  const int horizontalDpi = qApp->desktop()->screen()->logicalDpiX();
52 #else
53  const int horizontalDpi = mWidget->logicalDpiX();
54 #endif
55 
56  mWidget->setZoomFactor( horizontalDpi / 96.0 );
57 
58  QWebPage *page = mWidget->page();
59  connect( page, &QWebPage::contentsChanged, this, &QgsHtmlWidgetWrapper::fixHeight, Qt::ConnectionType::UniqueConnection );
60 #endif
61 
62 }
63 
64 
66 {
67  if ( !mWidget )
68  return;
69 
70  initWidget( mWidget );
71 }
72 
73 void QgsHtmlWidgetWrapper::setHtmlCode( const QString &htmlCode )
74 {
75  mHtmlCode = htmlCode;
76 }
77 
78 void QgsHtmlWidgetWrapper::setHtmlContext( )
79 {
80  if ( !mWidget )
81  return;
82 
83  QgsAttributeEditorContext attributecontext = context();
84  QgsExpressionContext expressionContext = layer()->createExpressionContext();
85  expressionContext << QgsExpressionContextUtils::formScope( mFeature, attributecontext.attributeFormModeString() );
86  expressionContext.setFeature( mFeature );
87 
88  HtmlExpression *htmlExpression = new HtmlExpression();
89  htmlExpression->setExpressionContext( expressionContext );
90  mWidget->page()->settings()->setAttribute( QWebSettings::DeveloperExtrasEnabled, true );
91  auto frame = mWidget->page()->mainFrame();
92  connect( frame, &QWebFrame::javaScriptWindowObjectCleared, frame, [ = ]
93  {
94  frame->addToJavaScriptWindowObject( QStringLiteral( "expression" ), htmlExpression );
95  } );
96 
97  mWidget->setHtml( mHtmlCode );
98 }
99 
100 #ifdef WITH_QTWEBKIT
101 void QgsHtmlWidgetWrapper::fixHeight()
102 {
103  QWebPage *page = mWidget->page();
104  int docHeight { page->mainFrame()->contentsSize().height() };
105  mWidget->setFixedHeight( docHeight );
106 }
107 #endif
108 
110 {
111  if ( !mWidget )
112  return;
113 
114  mFeature = feature;
115  setHtmlContext();
116 }
117 
119 void HtmlExpression::setExpressionContext( const QgsExpressionContext &context )
120 {
121  mExpressionContext = context;
122 }
123 
124 QString HtmlExpression::evaluate( const QString &expression ) const
125 {
126  QgsExpression exp = QgsExpression( expression );
127  exp.prepare( &mExpressionContext );
128  return exp.evaluate( &mExpressionContext ).toString();
129 }
Class for parsing and evaluation of expressions (formerly called "search strings").
void contextChanged()
Signal when QgsAttributeEditorContext mContext changed.
void setHtmlCode(const QString &htmlCode)
Sets the HTML code to htmlCode.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
This class contains context information for attribute editor widgets.
QVariant evaluate()
Evaluate the feature and return the result.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
static QgsExpressionContextScope * formScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current attribute form/table feat...
bool valid() const override
Returns true if the widget has been properly initialized.
void setFeature(const QgsFeature &feature) override
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
The QgsWebView class is a collection of stubs to mimic the API of QWebView on systems where the real ...
Definition: qgswebview.h:65
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsHtmlWidgetWrapper(QgsVectorLayer *layer, QWidget *editor, QWidget *parent)
Create a html widget wrapper.
const QgsAttributeEditorContext & context() const
Returns information about the context in which this widget is shown.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QString attributeFormModeString() const
Returns given attributeFormMode as string.
void reinitWidget()
Clears the content and makes new initialization.
QgsVectorLayer * layer() const
Returns the vector layer associated with the widget.
The QWebPage class is a collection of stubs to mimic the API of a QWebPage on systems where QtWebkit ...
Definition: qgswebpage.h:103
Represents a vector layer which manages a vector based data sets.
Manages an editor widget Widget and wrapper share the same parent.