def getPlugins(): """Returns a map with all custom widget plugins.""" widgets = {} plugins = {} qarbon_dir = moduleDirectory(qarbon) base_widget_dir = os.path.join(qarbon_dir, "qt", "gui") base_package = "qarbon.qt.gui." for filename in os.listdir(base_widget_dir): if filename.startswith(".") or filename.startswith("_") or \ not filename.endswith(".py"): continue fullpath = os.path.join(base_widget_dir, filename) if not os.path.isfile(fullpath): continue modulename = base_package + os.path.splitext(filename)[0] try: widgets.update(getWidgetClasses(modulename)) except ImportError: log.warning("Error importing %s", modulename) for _, widget_info in widgets.items(): widget_klass = widget_info["klass"] widget_name = widget_info['name'] info_func = getattr(widget_klass, "getQtDesignerPluginInfo", None) if info_func is None: continue info = info_func() if isinstance(info, collections.Mapping): plugin_klass = __build_qtdesigner_widget_plugin(widget_klass) plugin_klass_name = plugin_klass.__name__ #globals()[plugin_klass_name] = plugin_klass plugins[plugin_klass_name] = plugin_klass return plugins
def __onPropertyTreeChanged(self, item, column): if column != 2: return qobject = self.qobject if qobject is None: log.warning("qobject disappeared while trying to set a property " \ "on it") return prop_name = item.data(column, QtCore.Qt.UserRole) prop_value = item.data(column, QtCore.Qt.DisplayRole) qobject.setProperty(prop_name, prop_value)
def grabWidget(widget, fileName, period=None): """Grabs the given widget into the given image filename. If period is None (default) it grabs immediately once and returns. If period is given and >0 means grab the image every period (in seconds). .. warning:: this method **MUST** be called from the same thread which created the widget :param widget: the Qt widget to be grabbed :type widget: QtWidget :param fileName: the name of the image file :type fileName: str :param period: period (seconds) :type period: float """ if period is None: widgetName = widget.objectName() widgetTitle = widget.windowTitle() log.debug("Grabbing widget '%s' to '%s':", widgetName, fileName) try: pixmap = QtGui.QPixmap.grabWidget(widget) if fileName.endswith(".svg"): import qarbon.external.qt.QtSvg generator = qarbon.external.qt.QtSvg.QSvgGenerator() generator.setFileName(fileName) generator.setSize(pixmap.size()) if hasattr(generator, "setViewBox"): viewBox = QtCore.QRect(QtCore.QPoint(0, 0), pixmap.size()) generator.setViewBox(viewBox) title = "Qarbon widget" if widgetTitle: title += " - " + widgetTitle elif widgetName: title += " - " + widgetName desc = "An SVG created by the qarbon widget grabber" generator.setTitle(title) generator.setDescription(desc) painter = QtGui.QPainter() painter.begin(generator) try: painter.drawPixmap(0, 0, -1, -1, pixmap) finally: painter.end() else: pixmap.save(fileName, quality=100) except Exception: log.warning("Could not save file into '%s':", fileName) log.debug("Details:", exc_info=1) ret = __GrabberThread(widget, fileName, period) ret.start() return ret
def grabWidget(widget, fileName, period=None): """Grabs the given widget into the given image filename. If period is None (default) it grabs immediately once and returns. If period is given and >0 means grab the image every period (in seconds). .. warning:: this method **MUST** be called from the same thread which created the widget :param widget: the Qt widget to be grabbed :type widget: QtWidget :param fileName: the name of the image file :type fileName: str :param period: period (seconds) :type period: float """ if period is None: widgetName = widget.objectName() widgetTitle = widget.windowTitle() log.debug("Grabbing widget '%s' to '%s':", widgetName, fileName) try: pixmap = QtGui.QPixmap.grabWidget(widget) if fileName.endswith('.svg'): import qarbon.external.qt.QtSvg generator = qarbon.external.qt.QtSvg.QSvgGenerator() generator.setFileName(fileName) generator.setSize(pixmap.size()) if hasattr(generator, 'setViewBox'): viewBox = QtCore.QRect(QtCore.QPoint(0, 0), pixmap.size()) generator.setViewBox(viewBox) title = "Qarbon widget" if widgetTitle: title += " - " + widgetTitle elif widgetName: title += " - " + widgetName desc = "An SVG created by the qarbon widget grabber" generator.setTitle(title) generator.setDescription(desc) painter = QtGui.QPainter() painter.begin(generator) try: painter.drawPixmap(0, 0, -1, -1, pixmap) finally: painter.end() else: pixmap.save(fileName, quality=100) except Exception: log.warning("Could not save file into '%s':", fileName) log.debug("Details:", exc_info=1) ret = __GrabberThread(widget, fileName, period) ret.start() return ret
def __setPyQt4API(element, api_version=2): try: ver = sip.getapi(element) except ValueError: ver = -1 if ver < 0: try: sip.setapi(element, api_version) log.debug("%s API set to version %d", element, sip.getapi("QString")) except ValueError: log.warning("Error setting %s API to version %s", element, api_version, exc_info=1) return False elif ver < api_version: log.info("%s API set to version %s (advised: version >= %s)", element, ver, api_version) return True
def __preparePyQt4(): # In python 3 both QString and QVariant API are set to level 2 so # nothing to do if sys.version_info[0] > 2: return __import("PyQt4") # For PySide compatibility, use the new-style string API that # automatically converts QStrings to Unicode Python strings. Also, # automatically unpack QVariants to their underlying objects. if sip is None: log.warning("Could not find sip") elif sip.SIP_VERSION < 0x040900: sip_ver = sip.SIP_VERSION_STR log.warning("Using old sip %s (advised >= 4.9)", sip_ver) else: __setPyQt4API("QString", 2) __setPyQt4API("QVariant", 2) return __import("PyQt4")
def __onFocus(self): qwidget = self.qobject if qwidget is None: log.warning("widget disappeared while trying to set a property " \ "on it") return