|
7 | 7 | import pkg_resources |
8 | 8 | import numpy |
9 | 9 |
|
10 | | -from AnyQt import QtWidgets, QtCore, QtGui, QtWebKitWidgets |
| 10 | +from AnyQt import QtWidgets, QtCore, QtGui |
11 | 11 | from AnyQt.QtCore import Qt, Signal, Slot |
12 | 12 | from AnyQt.QtGui import QCursor |
13 | 13 | from AnyQt.QtWidgets import ( |
14 | 14 | QApplication, QStyle, QSizePolicy, QWidget, QLabel, QGroupBox, QSlider, |
15 | 15 | QComboBox, QLineEdit, QVBoxLayout, QHBoxLayout, |
16 | 16 | QTableWidget, QTableWidgetItem, QItemDelegate, QStyledItemDelegate |
17 | 17 | ) |
| 18 | +try: |
| 19 | + from AnyQt.QtWebKitWidgets import QWebView |
| 20 | + HAVE_WEBKIT = True |
| 21 | +except ImportError: |
| 22 | + HAVE_WEBKIT = False |
18 | 23 |
|
19 | 24 | import Orange.data |
20 | 25 | from Orange.widgets.utils import getdeepattr |
@@ -217,54 +222,62 @@ def deselectRowsWhere(self, col, value, n_hits=-1, |
217 | 222 | return self.selectRowsWhere(col, value, n_hits, flags, False) |
218 | 223 |
|
219 | 224 |
|
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): |
223 | 227 | """ |
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). |
236 | 234 | """ |
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) |
254 | 267 |
|
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) |
259 | 272 |
|
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) |
262 | 275 |
|
263 | | - def sizeHint(self): |
264 | | - return QtCore.QSize(600, 500) |
| 276 | + def sizeHint(self): |
| 277 | + return QtCore.QSize(600, 500) |
265 | 278 |
|
266 | | - def evalJS(self, javascript): |
267 | | - self.page().mainFrame().evaluateJavaScript(javascript) |
| 279 | + def evalJS(self, javascript): |
| 280 | + self.page().mainFrame().evaluateJavaScript(javascript) |
268 | 281 |
|
269 | 282 |
|
270 | 283 | class ControlledAttributesDict(dict): |
|
0 commit comments