Source code for PyMca5.PyMcaGui.PyMcaQt

#/*##########################################################################
# Copyright (C) 2004-2015 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "MIT"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
import sys
"""
This module simplifies writing code that has to deal with with PySide and PyQt4.

"""
# force cx_freeze to consider sip among the modules to add
# to the binary packages
if ('PySide' in sys.modules) or ('PySide' in sys.argv):
    from PySide.QtCore import *
    from PySide.QtGui import *
    try:
        from PySide.QtSvg import *
    except:
        pass
    try:
        from PySide.QtOpenGL import *
    except:
        pass
    pyqtSignal = Signal

    #matplotlib has difficulties to identify PySide
    try:
        import matplotlib
        matplotlib.rcParams['backend.qt4']='PySide'
    except:
        pass
elif "PyQt5" in sys.modules:
    print("WARNING: PyQt5 is for testing purposes")
    import sip
    try:
        sip.setapi("QString", 2)
        sip.setapi("QVariant", 2)
    except:
        print("API 1 -> Console widget not available")
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtPrintSupport import *
    try:
        from PyQt5.QtOpenGL import *
    except:
        pass
    try:
        from PyQt5.QtSvg import *
    except:
        pass
else:
    if sys.version < "3.0.0":
        import sip
        try:
            sip.setapi("QString", 2)
            sip.setapi("QVariant", 2)
        except:
            print("API 1 -> Console widget not available")
    try:
        from PyQt4.QtCore import *
        from PyQt4.QtGui import *
        try:
            from PyQt4.QtOpenGL import *
        except:
            pass
        try:
            from PyQt4.QtSvg import *
        except:
            pass
    except ImportError:
        try:
            # try PySide
            from PySide.QtCore import *
            from PySide.QtGui import *
            try:
                from PySide.QtSvg import *
            except:
                pass
            try:
                from PySide.QtOpenGL import *
            except:
                pass
            pyqtSignal = Signal

            #matplotlib has difficulties to identify PySide
            try:
                import matplotlib
                matplotlib.rcParams['backend.qt4']='PySide'
            except:
                pass
        except ImportError:
            from PyQt5.QtCore import *
            from PyQt5.QtGui import *
            from PyQt5.QtWidgets import *
            from PyQt5.QtPrintSupport import *
            try:
                from PyQt5.QtOpenGL import *
            except:
                pass
            try:
                from PyQt5.QtSvg import *
            except:
                pass


# Overwrite the QFileDialog to make sure that by default it 
# returns non-native dialogs as it was the traditional behavior of Qt
_QFileDialog = QFileDialog
[docs]class QFileDialog(_QFileDialog): def __init__(self, *args, **kwargs): try: _QFileDialog.__init__(self, *args, **kwargs) except: # not all versions support kwargs _QFileDialog.__init__(self, *args) try: self.setOptions(_QFileDialog.DontUseNativeDialog) except: print("WARNING: Cannot force default QFileDialog behavior")
[docs]class HorizontalSpacer(QWidget): def __init__(self, *args): QWidget.__init__(self, *args) self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed))
[docs]class VerticalSpacer(QWidget): def __init__(self, *args): QWidget.__init__(self, *args) self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding))
if sys.version < '3.0': import types # perhaps a better name would be safe unicode? # should this method be a more generic tool to # be found outside PyMcaQt?
[docs] def safe_str(potentialQString): if type(potentialQString) == types.StringType or\ type(potentialQString) == types.UnicodeType: return potentialQString try: # default, just str x = str(potentialQString) except UnicodeEncodeError: # try user OS file system encoding # expected to be 'mbcs' under windows # and 'utf-8' under MacOS X try: x = unicode(potentialQString, sys.getfilesystemencoding()) return x except: # on any error just keep going pass # reasonable tries are 'utf-8' and 'latin-1' # should I really go beyond those? # In fact, 'utf-8' is the default file encoding for python 3 encodingOptions = ['utf-8', 'latin-1', 'utf-16', 'utf-32'] for encodingOption in encodingOptions: try: x = unicode(potentialQString, encodingOption) break except UnicodeDecodeError: if encodingOption == encodingOptions[-1]: raise return x
else: safe_str = str