Skip to content

Commit 8b0955f

Browse files
committed
widgets/gui: Handle missing QtWebKitWidgets
1 parent f5d3e9b commit 8b0955f

File tree

1 file changed

+56
-43
lines changed

1 file changed

+56
-43
lines changed

Orange/widgets/gui.py

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@
77
import pkg_resources
88
import numpy
99

10-
from AnyQt import QtWidgets, QtCore, QtGui, QtWebKitWidgets
10+
from AnyQt import QtWidgets, QtCore, QtGui
1111
from AnyQt.QtCore import Qt, Signal, Slot
1212
from AnyQt.QtGui import QCursor
1313
from AnyQt.QtWidgets import (
1414
QApplication, QStyle, QSizePolicy, QWidget, QLabel, QGroupBox, QSlider,
1515
QComboBox, QLineEdit, QVBoxLayout, QHBoxLayout,
1616
QTableWidget, QTableWidgetItem, QItemDelegate, QStyledItemDelegate
1717
)
18+
try:
19+
from AnyQt.QtWebKitWidgets import QWebView
20+
HAVE_WEBKIT = True
21+
except ImportError:
22+
HAVE_WEBKIT = False
1823

1924
import Orange.data
2025
from Orange.widgets.utils import getdeepattr
@@ -217,54 +222,62 @@ def deselectRowsWhere(self, col, value, n_hits=-1,
217222
return self.selectRowsWhere(col, value, n_hits, flags, False)
218223

219224

220-
class WebviewWidget(QtWebKitWidgets.QWebView):
221-
"""WebKit window in a window"""
222-
def __init__(self, parent=None, bridge=None, html=None, debug=None):
225+
if HAVE_WEBKIT:
226+
class WebviewWidget(QWebView):
223227
"""
224-
Parameters
225-
----------
226-
parent: QObject
227-
Parent QObject. If parent has layout(), this widget is added to it.
228-
bridge: QObject
229-
The "bridge" object exposed as ``window.pybridge`` in JavaScript.
230-
Any bridge methods desired to be accessible from JS need to be
231-
decorated ``@QtCore.pyqtSlot(<*args>, result=<type>)``.
232-
html: str
233-
HTML content to set in the webview.
234-
debug: bool
235-
If True, enable context menu and webkit inspector.
228+
WebKit view widget.
229+
230+
.. warning:
231+
QtWebKit was removed from Qt v5.6.0, therefore this class will not
232+
be available when using Qt >= 5.6. Port your code to support
233+
QtWebEngine (or both).
236234
"""
237-
super().__init__(parent)
238-
self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,
239-
QSizePolicy.Expanding))
240-
self._bridge = bridge
241-
try: parent.layout().addWidget(self)
242-
except (AttributeError, TypeError): pass
243-
settings = self.settings()
244-
settings.setAttribute(settings.LocalContentCanAccessFileUrls, True)
245-
if debug is None:
246-
import logging
247-
debug = logging.getLogger().level <= logging.DEBUG
248-
if debug:
249-
settings.setAttribute(settings.DeveloperExtrasEnabled, True)
250-
else:
251-
self.setContextMenuPolicy(Qt.NoContextMenu)
252-
if html:
253-
self.setHtml(html)
235+
def __init__(self, parent=None, bridge=None, html=None, debug=None):
236+
"""
237+
Parameters
238+
----------
239+
parent: QWidget
240+
Parent QWidget. If parent has layout(), this widget is added to it.
241+
bridge: QObject
242+
The "bridge" object exposed as ``window.pybridge`` in JavaScript.
243+
Any bridge methods desired to be accessible from JS need to be
244+
decorated with` @QtCore.pyqtSlot(<*args>, result=<type>)``.
245+
html: str
246+
HTML content to set in the webview.
247+
debug: bool
248+
If True, enable context menu and webkit inspector.
249+
"""
250+
super().__init__(parent)
251+
self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding,
252+
QSizePolicy.Expanding))
253+
self._bridge = bridge
254+
try: parent.layout().addWidget(self)
255+
except (AttributeError, TypeError): pass
256+
settings = self.settings()
257+
settings.setAttribute(settings.LocalContentCanAccessFileUrls, True)
258+
if debug is None:
259+
import logging
260+
debug = logging.getLogger().level <= logging.DEBUG
261+
if debug:
262+
settings.setAttribute(settings.DeveloperExtrasEnabled, True)
263+
else:
264+
self.setContextMenuPolicy(Qt.NoContextMenu)
265+
if html:
266+
self.setHtml(html)
254267

255-
def setContent(self, data, mimetype, url=''):
256-
super().setContent(data, mimetype, QtCore.QUrl(url))
257-
if self._bridge:
258-
self.page().mainFrame().addToJavaScriptWindowObject('pybridge', self._bridge)
268+
def setContent(self, data, mimetype, url=''):
269+
super().setContent(data, mimetype, QtCore.QUrl(url))
270+
if self._bridge:
271+
self.page().mainFrame().addToJavaScriptWindowObject('pybridge', self._bridge)
259272

260-
def setHtml(self, html, url=''):
261-
self.setContent(html.encode('utf-8'), 'text/html', url)
273+
def setHtml(self, html, url=''):
274+
self.setContent(html.encode('utf-8'), 'text/html', url)
262275

263-
def sizeHint(self):
264-
return QtCore.QSize(600, 500)
276+
def sizeHint(self):
277+
return QtCore.QSize(600, 500)
265278

266-
def evalJS(self, javascript):
267-
self.page().mainFrame().evaluateJavaScript(javascript)
279+
def evalJS(self, javascript):
280+
self.page().mainFrame().evaluateJavaScript(javascript)
268281

269282

270283
class ControlledAttributesDict(dict):

0 commit comments

Comments
 (0)