diff --git a/examples/FillBetweenItem.py b/examples/FillBetweenItem.py
index 74dd89bc..fc91ee32 100644
--- a/examples/FillBetweenItem.py
+++ b/examples/FillBetweenItem.py
@@ -8,6 +8,8 @@ import pyqtgraph as pg
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
+#FIXME: When running on Qt5, not as perfect as on Qt4
+
win = pg.plot()
win.setWindowTitle('pyqtgraph example: FillBetweenItem')
win.setXRange(-10, 10)
diff --git a/examples/FlowchartCustomNode.py b/examples/FlowchartCustomNode.py
index 1cf1ba10..fcc0a767 100644
--- a/examples/FlowchartCustomNode.py
+++ b/examples/FlowchartCustomNode.py
@@ -89,7 +89,7 @@ class ImageViewNode(Node):
## CtrlNode is just a convenience class that automatically creates its
## control widget based on a simple data structure.
class UnsharpMaskNode(CtrlNode):
- """Return the input data passed through pg.gaussianFilter."""
+ """Return the input data passed through an unsharp mask."""
nodeName = "UnsharpMask"
uiTemplate = [
('sigma', 'spin', {'value': 1.0, 'step': 1.0, 'range': [0.0, None]}),
diff --git a/examples/GradientWidget.py b/examples/GradientWidget.py
index ef7d0fa6..fa5253ba 100644
--- a/examples/GradientWidget.py
+++ b/examples/GradientWidget.py
@@ -16,7 +16,7 @@ app = QtGui.QApplication([])
w = QtGui.QMainWindow()
w.show()
w.setWindowTitle('pyqtgraph example: GradientWidget')
-w.resize(400,400)
+w.setGeometry(10, 50, 400, 400)
cw = QtGui.QWidget()
w.setCentralWidget(cw)
diff --git a/examples/PlotWidget.py b/examples/PlotWidget.py
index 88236ba0..e52a893d 100644
--- a/examples/PlotWidget.py
+++ b/examples/PlotWidget.py
@@ -37,7 +37,7 @@ p1.setPen((200,200,100))
## Add in some extra graphics
rect = QtGui.QGraphicsRectItem(QtCore.QRectF(0, 0, 1, 5e-11))
-rect.setPen(QtGui.QPen(QtGui.QColor(100, 200, 100)))
+rect.setPen(pg.mkPen(100, 200, 100))
pw.addItem(rect)
pw.setLabel('left', 'Value', units='V')
diff --git a/examples/ScatterPlotSpeedTest.py b/examples/ScatterPlotSpeedTest.py
index 4dbe57db..9cbf0c63 100644
--- a/examples/ScatterPlotSpeedTest.py
+++ b/examples/ScatterPlotSpeedTest.py
@@ -12,7 +12,7 @@ For testing rapid updates of ScatterPlotItem under various conditions.
import initExample
-from pyqtgraph.Qt import QtGui, QtCore, USE_PYSIDE
+from pyqtgraph.Qt import QtGui, QtCore, USE_PYSIDE, USE_PYQT5
import numpy as np
import pyqtgraph as pg
from pyqtgraph.ptime import time
@@ -22,6 +22,8 @@ app = QtGui.QApplication([])
#mw.resize(800,800)
if USE_PYSIDE:
from ScatterPlotSpeedTestTemplate_pyside import Ui_Form
+elif USE_PYQT5:
+ from ScatterPlotSpeedTestTemplate_pyqt5 import Ui_Form
else:
from ScatterPlotSpeedTestTemplate_pyqt import Ui_Form
diff --git a/examples/VideoSpeedTest.py b/examples/VideoSpeedTest.py
index 6fce8a86..d26f507e 100644
--- a/examples/VideoSpeedTest.py
+++ b/examples/VideoSpeedTest.py
@@ -10,13 +10,15 @@ is used by the view widget
import initExample ## Add path to library (just for examples; you do not need this)
-from pyqtgraph.Qt import QtGui, QtCore, USE_PYSIDE
+from pyqtgraph.Qt import QtGui, QtCore, USE_PYSIDE, USE_PYQT5
import numpy as np
import pyqtgraph as pg
import pyqtgraph.ptime as ptime
if USE_PYSIDE:
import VideoTemplate_pyside as VideoTemplate
+elif USE_PYQT5:
+ import VideoTemplate_pyqt5 as VideoTemplate
else:
import VideoTemplate_pyqt as VideoTemplate
diff --git a/examples/ViewBox.py b/examples/ViewBox.py
index 3a66afe3..2ba2094c 100644
--- a/examples/ViewBox.py
+++ b/examples/ViewBox.py
@@ -42,7 +42,7 @@ class movableRect(QtGui.QGraphicsRectItem):
self.setAcceptHoverEvents(True)
def hoverEnterEvent(self, ev):
self.savedPen = self.pen()
- self.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255)))
+ self.setPen(pg.mkPen(255, 255, 255))
ev.ignore()
def hoverLeaveEvent(self, ev):
self.setPen(self.savedPen)
@@ -57,7 +57,7 @@ class movableRect(QtGui.QGraphicsRectItem):
self.setPos(self.mapToParent(ev.pos()) - self.pressDelta)
rect = movableRect(QtCore.QRectF(0, 0, 1, 1))
-rect.setPen(QtGui.QPen(QtGui.QColor(100, 200, 100)))
+rect.setPen(pg.mkPen(100, 200, 100))
vb.addItem(rect)
l.addItem(vb, 0, 1)
diff --git a/examples/__main__.py b/examples/__main__.py
index cb1b87a1..9ef2df28 100644
--- a/examples/__main__.py
+++ b/examples/__main__.py
@@ -7,11 +7,13 @@ if __name__ == "__main__" and (__package__ is None or __package__==''):
__package__ = "examples"
from . import initExample
-from pyqtgraph.Qt import QtCore, QtGui, USE_PYSIDE
+from pyqtgraph.Qt import QtCore, QtGui, USE_PYSIDE, USE_PYQT5
import pyqtgraph as pg
if USE_PYSIDE:
from .exampleLoaderTemplate_pyside import Ui_Form
+elif USE_PYQT5:
+ from .exampleLoaderTemplate_pyqt5 import Ui_Form
else:
from .exampleLoaderTemplate_pyqt import Ui_Form
@@ -123,20 +125,9 @@ class ExampleLoader(QtGui.QMainWindow):
self.ui.loadBtn.clicked.connect(self.loadFile)
self.ui.exampleTree.currentItemChanged.connect(self.showFile)
self.ui.exampleTree.itemDoubleClicked.connect(self.loadFile)
- self.ui.pyqtCheck.toggled.connect(self.pyqtToggled)
- self.ui.pysideCheck.toggled.connect(self.pysideToggled)
self.ui.codeView.textChanged.connect(self.codeEdited)
self.codeBtn.clicked.connect(self.runEditedCode)
- def pyqtToggled(self, b):
- if b:
- self.ui.pysideCheck.setChecked(False)
-
- def pysideToggled(self, b):
- if b:
- self.ui.pyqtCheck.setChecked(False)
-
-
def populateTree(self, root, examples):
for key, val in examples.items():
item = QtGui.QTreeWidgetItem([key])
@@ -148,7 +139,6 @@ class ExampleLoader(QtGui.QMainWindow):
else:
self.populateTree(item, val)
root.addChild(item)
-
def currentFile(self):
item = self.ui.exampleTree.currentItem()
@@ -160,19 +150,13 @@ class ExampleLoader(QtGui.QMainWindow):
def loadFile(self, edited=False):
extra = []
- if self.ui.pyqtCheck.isChecked():
- extra.append('pyqt')
- elif self.ui.pysideCheck.isChecked():
- extra.append('pyside')
+ qtLib = str(self.ui.qtLibCombo.currentText())
+ gfxSys = str(self.ui.graphicsSystemCombo.currentText())
- if self.ui.forceGraphicsCheck.isChecked():
- extra.append(str(self.ui.forceGraphicsCombo.currentText()))
-
-
- #if sys.platform.startswith('win'):
- #os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
- #else:
- #os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
+ if qtLib != 'default':
+ extra.append(qtLib.lower())
+ elif gfxSys != 'default':
+ extra.append(gfxSys)
if edited:
path = os.path.abspath(os.path.dirname(__file__))
@@ -291,15 +275,19 @@ except:
if __name__ == '__main__':
- if '--test' in sys.argv[1:]:
+ args = sys.argv[1:]
+
+ if '--test' in args:
# get rid of orphaned cache files first
pg.renamePyc(path)
-
+
files = buildFileList(examples)
- if '--pyside' in sys.argv[1:]:
+ if '--pyside' in args:
lib = 'PySide'
- elif '--pyqt' in sys.argv[1:]:
+ elif '--pyqt' in args or '--pyqt4' in args:
lib = 'PyQt4'
+ elif '--pyqt5' in args:
+ lib = 'PyQt5'
else:
lib = ''
diff --git a/examples/exampleLoaderTemplate.ui b/examples/exampleLoaderTemplate.ui
index 2da57800..a1d6bc19 100644
--- a/examples/exampleLoaderTemplate.ui
+++ b/examples/exampleLoaderTemplate.ui
@@ -6,28 +6,22 @@
0
0
- 623
- 380
+ 846
+ 552
Form
-
-
- 0
-
-
- 0
-
+
-
Qt::Horizontal
-
-
-
+
+
-
false
@@ -39,55 +33,69 @@
- -
-
+
-
+
-
-
-
- Force PyQt
-
-
+
+ default
+
-
-
-
- Force PySide
-
-
+
+ native
+
-
+ -
+
+ raster
+
+
+ -
+
+ opengl
+
+
+
- -
-
+
-
+
-
-
-
- Force Graphics System:
-
-
+
+ default
+
-
-
-
-
-
- native
-
-
- -
-
- raster
-
-
- -
-
- opengl
-
-
-
+
+ PyQt4
+
-
+ -
+
+ PySide
+
+
+ -
+
+ PyQt5
+
+
+
- -
+
-
+
+
+ Graphics System:
+
+
+
+ -
+
+
+ Qt Library:
+
+
+
+ -
Run Example
@@ -97,7 +105,7 @@
-
+
-
diff --git a/examples/exampleLoaderTemplate_pyqt.py b/examples/exampleLoaderTemplate_pyqt.py
index 836640c6..708839f5 100644
--- a/examples/exampleLoaderTemplate_pyqt.py
+++ b/examples/exampleLoaderTemplate_pyqt.py
@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file './exampleLoaderTemplate.ui'
+# Form implementation generated from reading ui file 'exampleLoaderTemplate.ui'
#
-# Created: Mon Feb 25 09:02:09 2013
-# by: PyQt4 UI code generator 4.9.3
+# Created: Sat Feb 28 10:30:29 2015
+# by: PyQt4 UI code generator 4.10.4
#
# WARNING! All changes made in this file will be lost!
@@ -12,58 +12,64 @@ from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
- _fromUtf8 = lambda s: s
+ def _fromUtf8(s):
+ return s
+
+try:
+ _encoding = QtGui.QApplication.UnicodeUTF8
+ def _translate(context, text, disambig):
+ return QtGui.QApplication.translate(context, text, disambig, _encoding)
+except AttributeError:
+ def _translate(context, text, disambig):
+ return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
- Form.resize(623, 380)
- self.gridLayout = QtGui.QGridLayout(Form)
- self.gridLayout.setMargin(0)
- self.gridLayout.setSpacing(0)
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
+ Form.resize(846, 552)
+ self.gridLayout_2 = QtGui.QGridLayout(Form)
+ self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
self.splitter = QtGui.QSplitter(Form)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName(_fromUtf8("splitter"))
self.widget = QtGui.QWidget(self.splitter)
self.widget.setObjectName(_fromUtf8("widget"))
- self.verticalLayout = QtGui.QVBoxLayout(self.widget)
- self.verticalLayout.setMargin(0)
- self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
+ self.gridLayout = QtGui.QGridLayout(self.widget)
+ self.gridLayout.setMargin(0)
+ self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.exampleTree = QtGui.QTreeWidget(self.widget)
self.exampleTree.setObjectName(_fromUtf8("exampleTree"))
self.exampleTree.headerItem().setText(0, _fromUtf8("1"))
self.exampleTree.header().setVisible(False)
- self.verticalLayout.addWidget(self.exampleTree)
- self.horizontalLayout = QtGui.QHBoxLayout()
- self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
- self.pyqtCheck = QtGui.QCheckBox(self.widget)
- self.pyqtCheck.setObjectName(_fromUtf8("pyqtCheck"))
- self.horizontalLayout.addWidget(self.pyqtCheck)
- self.pysideCheck = QtGui.QCheckBox(self.widget)
- self.pysideCheck.setObjectName(_fromUtf8("pysideCheck"))
- self.horizontalLayout.addWidget(self.pysideCheck)
- self.verticalLayout.addLayout(self.horizontalLayout)
- self.horizontalLayout_2 = QtGui.QHBoxLayout()
- self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
- self.forceGraphicsCheck = QtGui.QCheckBox(self.widget)
- self.forceGraphicsCheck.setObjectName(_fromUtf8("forceGraphicsCheck"))
- self.horizontalLayout_2.addWidget(self.forceGraphicsCheck)
- self.forceGraphicsCombo = QtGui.QComboBox(self.widget)
- self.forceGraphicsCombo.setObjectName(_fromUtf8("forceGraphicsCombo"))
- self.forceGraphicsCombo.addItem(_fromUtf8(""))
- self.forceGraphicsCombo.addItem(_fromUtf8(""))
- self.forceGraphicsCombo.addItem(_fromUtf8(""))
- self.horizontalLayout_2.addWidget(self.forceGraphicsCombo)
- self.verticalLayout.addLayout(self.horizontalLayout_2)
+ self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
+ self.graphicsSystemCombo = QtGui.QComboBox(self.widget)
+ self.graphicsSystemCombo.setObjectName(_fromUtf8("graphicsSystemCombo"))
+ self.graphicsSystemCombo.addItem(_fromUtf8(""))
+ self.graphicsSystemCombo.addItem(_fromUtf8(""))
+ self.graphicsSystemCombo.addItem(_fromUtf8(""))
+ self.graphicsSystemCombo.addItem(_fromUtf8(""))
+ self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
+ self.qtLibCombo = QtGui.QComboBox(self.widget)
+ self.qtLibCombo.setObjectName(_fromUtf8("qtLibCombo"))
+ self.qtLibCombo.addItem(_fromUtf8(""))
+ self.qtLibCombo.addItem(_fromUtf8(""))
+ self.qtLibCombo.addItem(_fromUtf8(""))
+ self.qtLibCombo.addItem(_fromUtf8(""))
+ self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
+ self.label_2 = QtGui.QLabel(self.widget)
+ self.label_2.setObjectName(_fromUtf8("label_2"))
+ self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
+ self.label = QtGui.QLabel(self.widget)
+ self.label.setObjectName(_fromUtf8("label"))
+ self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.loadBtn = QtGui.QPushButton(self.widget)
self.loadBtn.setObjectName(_fromUtf8("loadBtn"))
- self.verticalLayout.addWidget(self.loadBtn)
+ self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
self.widget1 = QtGui.QWidget(self.splitter)
self.widget1.setObjectName(_fromUtf8("widget1"))
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.widget1)
- self.verticalLayout_2.setMargin(0)
- self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
+ self.verticalLayout = QtGui.QVBoxLayout(self.widget1)
+ self.verticalLayout.setMargin(0)
+ self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.loadedFileLabel = QtGui.QLabel(self.widget1)
font = QtGui.QFont()
font.setBold(True)
@@ -72,25 +78,29 @@ class Ui_Form(object):
self.loadedFileLabel.setText(_fromUtf8(""))
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
self.loadedFileLabel.setObjectName(_fromUtf8("loadedFileLabel"))
- self.verticalLayout_2.addWidget(self.loadedFileLabel)
+ self.verticalLayout.addWidget(self.loadedFileLabel)
self.codeView = QtGui.QPlainTextEdit(self.widget1)
font = QtGui.QFont()
font.setFamily(_fromUtf8("FreeMono"))
self.codeView.setFont(font)
self.codeView.setObjectName(_fromUtf8("codeView"))
- self.verticalLayout_2.addWidget(self.codeView)
- self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
+ self.verticalLayout.addWidget(self.codeView)
+ self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
- Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
- self.pyqtCheck.setText(QtGui.QApplication.translate("Form", "Force PyQt", None, QtGui.QApplication.UnicodeUTF8))
- self.pysideCheck.setText(QtGui.QApplication.translate("Form", "Force PySide", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCheck.setText(QtGui.QApplication.translate("Form", "Force Graphics System:", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCombo.setItemText(0, QtGui.QApplication.translate("Form", "native", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCombo.setItemText(1, QtGui.QApplication.translate("Form", "raster", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCombo.setItemText(2, QtGui.QApplication.translate("Form", "opengl", None, QtGui.QApplication.UnicodeUTF8))
- self.loadBtn.setText(QtGui.QApplication.translate("Form", "Run Example", None, QtGui.QApplication.UnicodeUTF8))
+ Form.setWindowTitle(_translate("Form", "Form", None))
+ self.graphicsSystemCombo.setItemText(0, _translate("Form", "default", None))
+ self.graphicsSystemCombo.setItemText(1, _translate("Form", "native", None))
+ self.graphicsSystemCombo.setItemText(2, _translate("Form", "raster", None))
+ self.graphicsSystemCombo.setItemText(3, _translate("Form", "opengl", None))
+ self.qtLibCombo.setItemText(0, _translate("Form", "default", None))
+ self.qtLibCombo.setItemText(1, _translate("Form", "PyQt4", None))
+ self.qtLibCombo.setItemText(2, _translate("Form", "PySide", None))
+ self.qtLibCombo.setItemText(3, _translate("Form", "PyQt5", None))
+ self.label_2.setText(_translate("Form", "Graphics System:", None))
+ self.label.setText(_translate("Form", "Qt Library:", None))
+ self.loadBtn.setText(_translate("Form", "Run Example", None))
diff --git a/examples/exampleLoaderTemplate_pyqt5.py b/examples/exampleLoaderTemplate_pyqt5.py
new file mode 100644
index 00000000..29c00325
--- /dev/null
+++ b/examples/exampleLoaderTemplate_pyqt5.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'exampleLoaderTemplate.ui'
+#
+# Created: Sat Feb 28 10:28:50 2015
+# by: PyQt5 UI code generator 5.2.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(846, 552)
+ self.gridLayout_2 = QtWidgets.QGridLayout(Form)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.splitter = QtWidgets.QSplitter(Form)
+ self.splitter.setOrientation(QtCore.Qt.Horizontal)
+ self.splitter.setObjectName("splitter")
+ self.widget = QtWidgets.QWidget(self.splitter)
+ self.widget.setObjectName("widget")
+ self.gridLayout = QtWidgets.QGridLayout(self.widget)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.exampleTree = QtWidgets.QTreeWidget(self.widget)
+ self.exampleTree.setObjectName("exampleTree")
+ self.exampleTree.headerItem().setText(0, "1")
+ self.exampleTree.header().setVisible(False)
+ self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
+ self.graphicsSystemCombo = QtWidgets.QComboBox(self.widget)
+ self.graphicsSystemCombo.setObjectName("graphicsSystemCombo")
+ self.graphicsSystemCombo.addItem("")
+ self.graphicsSystemCombo.addItem("")
+ self.graphicsSystemCombo.addItem("")
+ self.graphicsSystemCombo.addItem("")
+ self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
+ self.qtLibCombo = QtWidgets.QComboBox(self.widget)
+ self.qtLibCombo.setObjectName("qtLibCombo")
+ self.qtLibCombo.addItem("")
+ self.qtLibCombo.addItem("")
+ self.qtLibCombo.addItem("")
+ self.qtLibCombo.addItem("")
+ self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
+ self.label_2 = QtWidgets.QLabel(self.widget)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
+ self.label = QtWidgets.QLabel(self.widget)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
+ self.loadBtn = QtWidgets.QPushButton(self.widget)
+ self.loadBtn.setObjectName("loadBtn")
+ self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
+ self.widget1 = QtWidgets.QWidget(self.splitter)
+ self.widget1.setObjectName("widget1")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.widget1)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.loadedFileLabel = QtWidgets.QLabel(self.widget1)
+ font = QtGui.QFont()
+ font.setBold(True)
+ font.setWeight(75)
+ self.loadedFileLabel.setFont(font)
+ self.loadedFileLabel.setText("")
+ self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.loadedFileLabel.setObjectName("loadedFileLabel")
+ self.verticalLayout.addWidget(self.loadedFileLabel)
+ self.codeView = QtWidgets.QPlainTextEdit(self.widget1)
+ font = QtGui.QFont()
+ font.setFamily("FreeMono")
+ self.codeView.setFont(font)
+ self.codeView.setObjectName("codeView")
+ self.verticalLayout.addWidget(self.codeView)
+ self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.graphicsSystemCombo.setItemText(0, _translate("Form", "default"))
+ self.graphicsSystemCombo.setItemText(1, _translate("Form", "native"))
+ self.graphicsSystemCombo.setItemText(2, _translate("Form", "raster"))
+ self.graphicsSystemCombo.setItemText(3, _translate("Form", "opengl"))
+ self.qtLibCombo.setItemText(0, _translate("Form", "default"))
+ self.qtLibCombo.setItemText(1, _translate("Form", "PyQt4"))
+ self.qtLibCombo.setItemText(2, _translate("Form", "PySide"))
+ self.qtLibCombo.setItemText(3, _translate("Form", "PyQt5"))
+ self.label_2.setText(_translate("Form", "Graphics System:"))
+ self.label.setText(_translate("Form", "Qt Library:"))
+ self.loadBtn.setText(_translate("Form", "Run Example"))
+
diff --git a/examples/exampleLoaderTemplate_pyside.py b/examples/exampleLoaderTemplate_pyside.py
index f596e566..61f1d09f 100644
--- a/examples/exampleLoaderTemplate_pyside.py
+++ b/examples/exampleLoaderTemplate_pyside.py
@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
-# Form implementation generated from reading ui file './exampleLoaderTemplate.ui'
+# Form implementation generated from reading ui file 'exampleLoaderTemplate.ui'
#
-# Created: Mon Feb 25 09:02:09 2013
-# by: pyside-uic 0.2.13 running on PySide 1.1.1
+# Created: Sat Feb 28 10:31:57 2015
+# by: pyside-uic 0.2.15 running on PySide 1.2.1
#
# WARNING! All changes made in this file will be lost!
@@ -12,53 +12,50 @@ from PySide import QtCore, QtGui
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
- Form.resize(623, 380)
- self.gridLayout = QtGui.QGridLayout(Form)
- self.gridLayout.setContentsMargins(0, 0, 0, 0)
- self.gridLayout.setSpacing(0)
- self.gridLayout.setObjectName("gridLayout")
+ Form.resize(846, 552)
+ self.gridLayout_2 = QtGui.QGridLayout(Form)
+ self.gridLayout_2.setObjectName("gridLayout_2")
self.splitter = QtGui.QSplitter(Form)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.splitter.setObjectName("splitter")
self.widget = QtGui.QWidget(self.splitter)
self.widget.setObjectName("widget")
- self.verticalLayout = QtGui.QVBoxLayout(self.widget)
- self.verticalLayout.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout.setObjectName("verticalLayout")
+ self.gridLayout = QtGui.QGridLayout(self.widget)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setObjectName("gridLayout")
self.exampleTree = QtGui.QTreeWidget(self.widget)
self.exampleTree.setObjectName("exampleTree")
self.exampleTree.headerItem().setText(0, "1")
self.exampleTree.header().setVisible(False)
- self.verticalLayout.addWidget(self.exampleTree)
- self.horizontalLayout = QtGui.QHBoxLayout()
- self.horizontalLayout.setObjectName("horizontalLayout")
- self.pyqtCheck = QtGui.QCheckBox(self.widget)
- self.pyqtCheck.setObjectName("pyqtCheck")
- self.horizontalLayout.addWidget(self.pyqtCheck)
- self.pysideCheck = QtGui.QCheckBox(self.widget)
- self.pysideCheck.setObjectName("pysideCheck")
- self.horizontalLayout.addWidget(self.pysideCheck)
- self.verticalLayout.addLayout(self.horizontalLayout)
- self.horizontalLayout_2 = QtGui.QHBoxLayout()
- self.horizontalLayout_2.setObjectName("horizontalLayout_2")
- self.forceGraphicsCheck = QtGui.QCheckBox(self.widget)
- self.forceGraphicsCheck.setObjectName("forceGraphicsCheck")
- self.horizontalLayout_2.addWidget(self.forceGraphicsCheck)
- self.forceGraphicsCombo = QtGui.QComboBox(self.widget)
- self.forceGraphicsCombo.setObjectName("forceGraphicsCombo")
- self.forceGraphicsCombo.addItem("")
- self.forceGraphicsCombo.addItem("")
- self.forceGraphicsCombo.addItem("")
- self.horizontalLayout_2.addWidget(self.forceGraphicsCombo)
- self.verticalLayout.addLayout(self.horizontalLayout_2)
+ self.gridLayout.addWidget(self.exampleTree, 0, 0, 1, 2)
+ self.graphicsSystemCombo = QtGui.QComboBox(self.widget)
+ self.graphicsSystemCombo.setObjectName("graphicsSystemCombo")
+ self.graphicsSystemCombo.addItem("")
+ self.graphicsSystemCombo.addItem("")
+ self.graphicsSystemCombo.addItem("")
+ self.graphicsSystemCombo.addItem("")
+ self.gridLayout.addWidget(self.graphicsSystemCombo, 2, 1, 1, 1)
+ self.qtLibCombo = QtGui.QComboBox(self.widget)
+ self.qtLibCombo.setObjectName("qtLibCombo")
+ self.qtLibCombo.addItem("")
+ self.qtLibCombo.addItem("")
+ self.qtLibCombo.addItem("")
+ self.qtLibCombo.addItem("")
+ self.gridLayout.addWidget(self.qtLibCombo, 1, 1, 1, 1)
+ self.label_2 = QtGui.QLabel(self.widget)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1)
+ self.label = QtGui.QLabel(self.widget)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
self.loadBtn = QtGui.QPushButton(self.widget)
self.loadBtn.setObjectName("loadBtn")
- self.verticalLayout.addWidget(self.loadBtn)
+ self.gridLayout.addWidget(self.loadBtn, 3, 1, 1, 1)
self.widget1 = QtGui.QWidget(self.splitter)
self.widget1.setObjectName("widget1")
- self.verticalLayout_2 = QtGui.QVBoxLayout(self.widget1)
- self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
- self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.verticalLayout = QtGui.QVBoxLayout(self.widget1)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
self.loadedFileLabel = QtGui.QLabel(self.widget1)
font = QtGui.QFont()
font.setWeight(75)
@@ -67,25 +64,29 @@ class Ui_Form(object):
self.loadedFileLabel.setText("")
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
self.loadedFileLabel.setObjectName("loadedFileLabel")
- self.verticalLayout_2.addWidget(self.loadedFileLabel)
+ self.verticalLayout.addWidget(self.loadedFileLabel)
self.codeView = QtGui.QPlainTextEdit(self.widget1)
font = QtGui.QFont()
font.setFamily("FreeMono")
self.codeView.setFont(font)
self.codeView.setObjectName("codeView")
- self.verticalLayout_2.addWidget(self.codeView)
- self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
+ self.verticalLayout.addWidget(self.codeView)
+ self.gridLayout_2.addWidget(self.splitter, 0, 0, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
- self.pyqtCheck.setText(QtGui.QApplication.translate("Form", "Force PyQt", None, QtGui.QApplication.UnicodeUTF8))
- self.pysideCheck.setText(QtGui.QApplication.translate("Form", "Force PySide", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCheck.setText(QtGui.QApplication.translate("Form", "Force Graphics System:", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCombo.setItemText(0, QtGui.QApplication.translate("Form", "native", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCombo.setItemText(1, QtGui.QApplication.translate("Form", "raster", None, QtGui.QApplication.UnicodeUTF8))
- self.forceGraphicsCombo.setItemText(2, QtGui.QApplication.translate("Form", "opengl", None, QtGui.QApplication.UnicodeUTF8))
+ self.graphicsSystemCombo.setItemText(0, QtGui.QApplication.translate("Form", "default", None, QtGui.QApplication.UnicodeUTF8))
+ self.graphicsSystemCombo.setItemText(1, QtGui.QApplication.translate("Form", "native", None, QtGui.QApplication.UnicodeUTF8))
+ self.graphicsSystemCombo.setItemText(2, QtGui.QApplication.translate("Form", "raster", None, QtGui.QApplication.UnicodeUTF8))
+ self.graphicsSystemCombo.setItemText(3, QtGui.QApplication.translate("Form", "opengl", None, QtGui.QApplication.UnicodeUTF8))
+ self.qtLibCombo.setItemText(0, QtGui.QApplication.translate("Form", "default", None, QtGui.QApplication.UnicodeUTF8))
+ self.qtLibCombo.setItemText(1, QtGui.QApplication.translate("Form", "PyQt4", None, QtGui.QApplication.UnicodeUTF8))
+ self.qtLibCombo.setItemText(2, QtGui.QApplication.translate("Form", "PySide", None, QtGui.QApplication.UnicodeUTF8))
+ self.qtLibCombo.setItemText(3, QtGui.QApplication.translate("Form", "PyQt5", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setText(QtGui.QApplication.translate("Form", "Graphics System:", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setText(QtGui.QApplication.translate("Form", "Qt Library:", None, QtGui.QApplication.UnicodeUTF8))
self.loadBtn.setText(QtGui.QApplication.translate("Form", "Run Example", None, QtGui.QApplication.UnicodeUTF8))
diff --git a/examples/initExample.py b/examples/initExample.py
index b61b55cc..c10de84e 100644
--- a/examples/initExample.py
+++ b/examples/initExample.py
@@ -24,15 +24,23 @@ if 'pyside' in sys.argv:
from PySide import QtGui
elif 'pyqt' in sys.argv:
from PyQt4 import QtGui
+elif 'pyqt5' in sys.argv:
+ from PyQt5 import QtGui
else:
from pyqtgraph.Qt import QtGui
+
+import pyqtgraph as pg
## Force use of a specific graphics system
+use_gs = 'default'
for gs in ['raster', 'native', 'opengl']:
if gs in sys.argv:
+ use_gs = gs
QtGui.QApplication.setGraphicsSystem(gs)
break
+print("Using %s (%s graphics system)" % (pg.Qt.QT_LIB, use_gs))
+
## Enable fault handling to give more helpful error messages on crash.
## Only available in python 3.3+
try:
diff --git a/examples/optics/pyoptic.py b/examples/optics/pyoptic.py
index dc493568..275877eb 100644
--- a/examples/optics/pyoptic.py
+++ b/examples/optics/pyoptic.py
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
-from PyQt4 import QtGui, QtCore
import pyqtgraph as pg
-#from pyqtgraph.canvas import Canvas, CanvasItem
+from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import csv, gzip, os
from pyqtgraph import Point
diff --git a/examples/parametertree.py b/examples/parametertree.py
index 6e8e0dbd..8d8a7352 100644
--- a/examples/parametertree.py
+++ b/examples/parametertree.py
@@ -124,7 +124,7 @@ p.sigTreeStateChanged.connect(change)
def valueChanging(param, value):
- print("Value changing (not finalized):", param, value)
+ print("Value changing (not finalized): %s %s" % (param, value))
# Too lazy for recursion:
for child in p.children():
diff --git a/examples/relativity/__init__.py b/examples/relativity/__init__.py
index 093806ef..f1acf528 100644
--- a/examples/relativity/__init__.py
+++ b/examples/relativity/__init__.py
@@ -1 +1 @@
-from relativity import *
+from .relativity import *
diff --git a/examples/relativity/relativity.py b/examples/relativity/relativity.py
index 80a56d64..3037103e 100644
--- a/examples/relativity/relativity.py
+++ b/examples/relativity/relativity.py
@@ -4,7 +4,6 @@ from pyqtgraph.parametertree import Parameter, ParameterTree
from pyqtgraph.parametertree import types as pTypes
import pyqtgraph.configfile
import numpy as np
-import user
import collections
import sys, os
@@ -247,7 +246,7 @@ class GridParam(pTypes.GroupParameter):
template = self.param('ClockTemplate')
spacing = self['Spacing']
for i in range(self['Number of Clocks']):
- c = template.buildClocks().values()[0]
+ c = list(template.buildClocks().values())[0]
c.x0 += i * spacing
clocks[self.name() + '%02d' % i] = c
return clocks
@@ -502,7 +501,7 @@ class Simulation:
def run(self):
nPts = int(self.duration/self.dt)+1
- for cl in self.clocks.itervalues():
+ for cl in self.clocks.values():
cl.init(nPts)
if self.ref is None:
@@ -514,7 +513,7 @@ class Simulation:
clocks = self.clocks
dt = self.dt
tVals = np.linspace(0, dt*(nPts-1), nPts)
- for cl in self.clocks.itervalues():
+ for cl in self.clocks.values():
for i in xrange(1,nPts):
nextT = tVals[i]
while True:
@@ -549,7 +548,7 @@ class Simulation:
## make sure reference clock is not present in the list of clocks--this will be handled separately.
clocks = clocks.copy()
- for k,v in clocks.iteritems():
+ for k,v in clocks.items():
if v is ref:
del clocks[k]
break
@@ -586,7 +585,7 @@ class Simulation:
## update all other clocks
- for cl in clocks.itervalues():
+ for cl in clocks.values():
while True:
g = cl.acceleration()
tau1, tau2 = cl.accelLimits()
@@ -635,7 +634,7 @@ class Simulation:
def plot(self, plot):
plot.clear()
- for cl in self.clocks.itervalues():
+ for cl in self.clocks.values():
c, p = cl.getCurve()
plot.addItem(c)
plot.addItem(p)
diff --git a/examples/template.py b/examples/template.py
index 1198e317..6b5e1f75 100644
--- a/examples/template.py
+++ b/examples/template.py
@@ -11,6 +11,8 @@ import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
+app = QtGui.QApplication([])
+
# win.setWindowTitle('pyqtgraph example: ____')
## Start Qt event loop unless running in interactive mode or using pyside.
diff --git a/pyqtgraph/GraphicsScene/exportDialog.py b/pyqtgraph/GraphicsScene/exportDialog.py
index 5efb7c44..eebf5999 100644
--- a/pyqtgraph/GraphicsScene/exportDialog.py
+++ b/pyqtgraph/GraphicsScene/exportDialog.py
@@ -1,4 +1,4 @@
-from ..Qt import QtCore, QtGui, USE_PYSIDE
+from ..Qt import QtCore, QtGui, USE_PYSIDE, USE_PYQT5
from .. import exporters as exporters
from .. import functions as fn
from ..graphicsItems.ViewBox import ViewBox
@@ -6,6 +6,8 @@ from ..graphicsItems.PlotItem import PlotItem
if USE_PYSIDE:
from . import exportDialogTemplate_pyside as exportDialogTemplate
+elif USE_PYQT5:
+ from . import exportDialogTemplate_pyqt5 as exportDialogTemplate
else:
from . import exportDialogTemplate_pyqt as exportDialogTemplate
diff --git a/pyqtgraph/GraphicsScene/exportDialogTemplate_pyqt5.py b/pyqtgraph/GraphicsScene/exportDialogTemplate_pyqt5.py
new file mode 100644
index 00000000..418fd0f0
--- /dev/null
+++ b/pyqtgraph/GraphicsScene/exportDialogTemplate_pyqt5.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file './pyqtgraph/GraphicsScene/exportDialogTemplate.ui'
+#
+# Created: Wed Mar 26 15:09:29 2014
+# by: PyQt5 UI code generator 5.0.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(241, 367)
+ self.gridLayout = QtWidgets.QGridLayout(Form)
+ self.gridLayout.setSpacing(0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.label = QtWidgets.QLabel(Form)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 3)
+ self.itemTree = QtWidgets.QTreeWidget(Form)
+ self.itemTree.setObjectName("itemTree")
+ self.itemTree.headerItem().setText(0, "1")
+ self.itemTree.header().setVisible(False)
+ self.gridLayout.addWidget(self.itemTree, 1, 0, 1, 3)
+ self.label_2 = QtWidgets.QLabel(Form)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 2, 0, 1, 3)
+ self.formatList = QtWidgets.QListWidget(Form)
+ self.formatList.setObjectName("formatList")
+ self.gridLayout.addWidget(self.formatList, 3, 0, 1, 3)
+ self.exportBtn = QtWidgets.QPushButton(Form)
+ self.exportBtn.setObjectName("exportBtn")
+ self.gridLayout.addWidget(self.exportBtn, 6, 1, 1, 1)
+ self.closeBtn = QtWidgets.QPushButton(Form)
+ self.closeBtn.setObjectName("closeBtn")
+ self.gridLayout.addWidget(self.closeBtn, 6, 2, 1, 1)
+ self.paramTree = ParameterTree(Form)
+ self.paramTree.setObjectName("paramTree")
+ self.paramTree.headerItem().setText(0, "1")
+ self.paramTree.header().setVisible(False)
+ self.gridLayout.addWidget(self.paramTree, 5, 0, 1, 3)
+ self.label_3 = QtWidgets.QLabel(Form)
+ self.label_3.setObjectName("label_3")
+ self.gridLayout.addWidget(self.label_3, 4, 0, 1, 3)
+ self.copyBtn = QtWidgets.QPushButton(Form)
+ self.copyBtn.setObjectName("copyBtn")
+ self.gridLayout.addWidget(self.copyBtn, 6, 0, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Export"))
+ self.label.setText(_translate("Form", "Item to export:"))
+ self.label_2.setText(_translate("Form", "Export format"))
+ self.exportBtn.setText(_translate("Form", "Export"))
+ self.closeBtn.setText(_translate("Form", "Close"))
+ self.label_3.setText(_translate("Form", "Export options"))
+ self.copyBtn.setText(_translate("Form", "Copy"))
+
+from ..parametertree import ParameterTree
diff --git a/pyqtgraph/Qt.py b/pyqtgraph/Qt.py
index efbe66c4..0dc6eeb0 100644
--- a/pyqtgraph/Qt.py
+++ b/pyqtgraph/Qt.py
@@ -13,25 +13,35 @@ import sys, re
from .python2_3 import asUnicode
+PYSIDE = 'PySide'
+PYQT4 = 'PyQt4'
+PYQT5 = 'PyQt5'
+
+QT_LIB = None
+
## Automatically determine whether to use PyQt or PySide.
## This is done by first checking to see whether one of the libraries
## is already imported. If not, then attempt to import PyQt4, then PySide.
-if 'PyQt4' in sys.modules:
- USE_PYSIDE = False
-elif 'PySide' in sys.modules:
- USE_PYSIDE = True
-else:
- try:
- import PyQt4
- USE_PYSIDE = False
- except ImportError:
- try:
- import PySide
- USE_PYSIDE = True
- except ImportError:
- raise Exception("PyQtGraph requires either PyQt4 or PySide; neither package could be imported.")
+libOrder = [PYQT4, PYSIDE, PYQT5]
-if USE_PYSIDE:
+for lib in libOrder:
+ if lib in sys.modules:
+ QT_LIB = lib
+ break
+
+if QT_LIB is None:
+ for lib in libOrder:
+ try:
+ __import__(lib)
+ QT_LIB = lib
+ break
+ except ImportError:
+ pass
+
+if QT_LIB == None:
+ raise Exception("PyQtGraph requires one of PyQt4, PyQt5 or PySide; none of these packages could be imported.")
+
+if QT_LIB == PYSIDE:
from PySide import QtGui, QtCore, QtOpenGL, QtSvg
try:
from PySide import QtTest
@@ -98,9 +108,9 @@ if USE_PYSIDE:
base_class = eval('QtGui.%s'%widget_class)
return form_class, base_class
-
-
-else:
+
+elif QT_LIB == PYQT4:
+
from PyQt4 import QtGui, QtCore, uic
try:
from PyQt4 import QtSvg
@@ -115,21 +125,82 @@ else:
except ImportError:
pass
+ VERSION_INFO = 'PyQt4 ' + QtCore.PYQT_VERSION_STR + ' Qt ' + QtCore.QT_VERSION_STR
+elif QT_LIB == PYQT5:
+
+ # We're using PyQt5 which has a different structure so we're going to use a shim to
+ # recreate the Qt4 structure for Qt5
+ from PyQt5 import QtGui, QtCore, QtWidgets, Qt, uic
+ try:
+ from PyQt5 import QtSvg
+ except ImportError:
+ pass
+ try:
+ from PyQt5 import QtOpenGL
+ except ImportError:
+ pass
+
+ # Re-implement deprecated APIs
+ def scale(self, sx, sy):
+ tr = self.transform()
+ tr.scale(sx, sy)
+ self.setTransform(tr)
+ QtWidgets.QGraphicsItem.scale = scale
+
+ def rotate(self, angle):
+ tr = self.transform()
+ tr.rotate(angle)
+ self.setTransform(tr)
+ QtWidgets.QGraphicsItem.rotate = rotate
+
+ def translate(self, dx, dy):
+ tr = self.transform()
+ tr.translate(dx, dy)
+ self.setTransform(tr)
+ QtWidgets.QGraphicsItem.translate = translate
+
+ def setMargin(self, i):
+ self.setContentsMargins(i, i, i, i)
+ QtWidgets.QGridLayout.setMargin = setMargin
+
+ def setResizeMode(self, mode):
+ self.setSectionResizeMode(mode)
+ QtWidgets.QHeaderView.setResizeMode = setResizeMode
+
+
+ QtGui.QApplication = QtWidgets.QApplication
+ QtGui.QGraphicsScene = QtWidgets.QGraphicsScene
+ QtGui.QGraphicsObject = QtWidgets.QGraphicsObject
+ QtGui.QGraphicsWidget = QtWidgets.QGraphicsWidget
+
+ QtGui.QApplication.setGraphicsSystem = None
+
+ # Import all QtWidgets objects into QtGui
+ for o in dir(QtWidgets):
+ if o.startswith('Q'):
+ setattr(QtGui, o, getattr(QtWidgets,o) )
+
+ VERSION_INFO = 'PyQt5 ' + QtCore.PYQT_VERSION_STR + ' Qt ' + QtCore.QT_VERSION_STR
+
+# Common to PyQt4 and 5
+if QT_LIB.startswith('PyQt'):
import sip
def isQObjectAlive(obj):
return not sip.isdeleted(obj)
loadUiType = uic.loadUiType
QtCore.Signal = QtCore.pyqtSignal
- VERSION_INFO = 'PyQt4 ' + QtCore.PYQT_VERSION_STR + ' Qt ' + QtCore.QT_VERSION_STR
-
+
+
## Make sure we have Qt >= 4.7
versionReq = [4, 7]
-QtVersion = PySide.QtCore.__version__ if USE_PYSIDE else QtCore.QT_VERSION_STR
+USE_PYSIDE = QT_LIB == PYSIDE
+USE_PYQT4 = QT_LIB == PYQT4
+USE_PYQT5 = QT_LIB == PYQT5
+QtVersion = PySide.QtCore.__version__ if QT_LIB == PYSIDE else QtCore.QT_VERSION_STR
m = re.match(r'(\d+)\.(\d+).*', QtVersion)
if m is not None and list(map(int, m.groups())) < versionReq:
print(list(map(int, m.groups())))
raise Exception('pyqtgraph requires Qt version >= %d.%d (your version is %s)' % (versionReq[0], versionReq[1], QtVersion))
-
diff --git a/pyqtgraph/WidgetGroup.py b/pyqtgraph/WidgetGroup.py
index 29541454..d7e265c5 100644
--- a/pyqtgraph/WidgetGroup.py
+++ b/pyqtgraph/WidgetGroup.py
@@ -8,7 +8,7 @@ This class addresses the problem of having to save and restore the state
of a large group of widgets.
"""
-from .Qt import QtCore, QtGui
+from .Qt import QtCore, QtGui, USE_PYQT5
import weakref, inspect
from .python2_3 import asUnicode
@@ -60,9 +60,13 @@ def setComboState(w, v):
class WidgetGroup(QtCore.QObject):
- """This class takes a list of widgets and keeps an internal record of their state which is always up to date. Allows reading and writing from groups of widgets simultaneously."""
+ """This class takes a list of widgets and keeps an internal record of their
+ state that is always up to date.
- ## List of widget types which can be handled by WidgetGroup.
+ Allows reading and writing from groups of widgets simultaneously.
+ """
+
+ ## List of widget types that can be handled by WidgetGroup.
## The value for each type is a tuple (change signal function, get function, set function, [auto-add children])
## The change signal function that takes an object and returns a signal that is emitted any time the state of the widget changes, not just
## when it is changed by user interaction. (for example, 'clicked' is not a valid signal here)
@@ -200,51 +204,35 @@ class WidgetGroup(QtCore.QObject):
if hasattr(obj, 'widgetGroupInterface'):
return True
return False
- #return (type(obj) in WidgetGroup.classes)
def setScale(self, widget, scale):
val = self.readWidget(widget)
self.scales[widget] = scale
self.setWidget(widget, val)
- #print "scaling %f to %f" % (val, self.readWidget(widget))
-
def mkChangeCallback(self, w):
return lambda *args: self.widgetChanged(w, *args)
def widgetChanged(self, w, *args):
- #print "widget changed"
n = self.widgetList[w]
v1 = self.cache[n]
v2 = self.readWidget(w)
if v1 != v2:
- #print "widget", n, " = ", v2
- self.emit(QtCore.SIGNAL('changed'), self.widgetList[w], v2)
+ if not USE_PYQT5:
+ # Old signal kept for backward compatibility.
+ self.emit(QtCore.SIGNAL('changed'), self.widgetList[w], v2)
self.sigChanged.emit(self.widgetList[w], v2)
def state(self):
for w in self.uncachedWidgets:
self.readWidget(w)
-
- #cc = self.cache.copy()
- #if 'averageGroup' in cc:
- #val = cc['averageGroup']
- #w = self.findWidget('averageGroup')
- #self.readWidget(w)
- #if val != self.cache['averageGroup']:
- #print " AverageGroup did not match cached value!"
- #else:
- #print " AverageGroup OK"
return self.cache.copy()
def setState(self, s):
- #print "SET STATE", self, s
for w in self.widgetList:
n = self.widgetList[w]
- #print " restore %s?" % n
if n not in s:
continue
- #print " restore state", w, n, s[n]
self.setWidget(w, s[n])
def readWidget(self, w):
diff --git a/pyqtgraph/__init__.py b/pyqtgraph/__init__.py
index 1c152d46..687208f8 100644
--- a/pyqtgraph/__init__.py
+++ b/pyqtgraph/__init__.py
@@ -41,7 +41,8 @@ elif 'darwin' in sys.platform: ## openGL can have a major impact on mac, but als
useOpenGL = False
if QtGui.QApplication.instance() is not None:
print('Warning: QApplication was created before pyqtgraph was imported; there may be problems (to avoid bugs, call QApplication.setGraphicsSystem("raster") before the QApplication is created).')
- QtGui.QApplication.setGraphicsSystem('raster') ## work around a variety of bugs in the native graphics system
+ if QtGui.QApplication.setGraphicsSystem:
+ QtGui.QApplication.setGraphicsSystem('raster') ## work around a variety of bugs in the native graphics system
else:
useOpenGL = False ## on windows there's a more even performance / bugginess tradeoff.
diff --git a/pyqtgraph/canvas/CanvasTemplate_pyqt5.py b/pyqtgraph/canvas/CanvasTemplate_pyqt5.py
new file mode 100644
index 00000000..13b0c83c
--- /dev/null
+++ b/pyqtgraph/canvas/CanvasTemplate_pyqt5.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file './pyqtgraph/canvas/CanvasTemplate.ui'
+#
+# Created: Wed Mar 26 15:09:28 2014
+# by: PyQt5 UI code generator 5.0.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(490, 414)
+ self.gridLayout = QtWidgets.QGridLayout(Form)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setSpacing(0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.splitter = QtWidgets.QSplitter(Form)
+ self.splitter.setOrientation(QtCore.Qt.Horizontal)
+ self.splitter.setObjectName("splitter")
+ self.view = GraphicsView(self.splitter)
+ self.view.setObjectName("view")
+ self.layoutWidget = QtWidgets.QWidget(self.splitter)
+ self.layoutWidget.setObjectName("layoutWidget")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.layoutWidget)
+ self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.storeSvgBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.storeSvgBtn.setObjectName("storeSvgBtn")
+ self.gridLayout_2.addWidget(self.storeSvgBtn, 1, 0, 1, 1)
+ self.storePngBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.storePngBtn.setObjectName("storePngBtn")
+ self.gridLayout_2.addWidget(self.storePngBtn, 1, 1, 1, 1)
+ self.autoRangeBtn = QtWidgets.QPushButton(self.layoutWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(1)
+ sizePolicy.setHeightForWidth(self.autoRangeBtn.sizePolicy().hasHeightForWidth())
+ self.autoRangeBtn.setSizePolicy(sizePolicy)
+ self.autoRangeBtn.setObjectName("autoRangeBtn")
+ self.gridLayout_2.addWidget(self.autoRangeBtn, 3, 0, 1, 2)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setSpacing(0)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.redirectCheck = QtWidgets.QCheckBox(self.layoutWidget)
+ self.redirectCheck.setObjectName("redirectCheck")
+ self.horizontalLayout.addWidget(self.redirectCheck)
+ self.redirectCombo = CanvasCombo(self.layoutWidget)
+ self.redirectCombo.setObjectName("redirectCombo")
+ self.horizontalLayout.addWidget(self.redirectCombo)
+ self.gridLayout_2.addLayout(self.horizontalLayout, 6, 0, 1, 2)
+ self.itemList = TreeWidget(self.layoutWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(100)
+ sizePolicy.setHeightForWidth(self.itemList.sizePolicy().hasHeightForWidth())
+ self.itemList.setSizePolicy(sizePolicy)
+ self.itemList.setHeaderHidden(True)
+ self.itemList.setObjectName("itemList")
+ self.itemList.headerItem().setText(0, "1")
+ self.gridLayout_2.addWidget(self.itemList, 7, 0, 1, 2)
+ self.ctrlLayout = QtWidgets.QGridLayout()
+ self.ctrlLayout.setSpacing(0)
+ self.ctrlLayout.setObjectName("ctrlLayout")
+ self.gridLayout_2.addLayout(self.ctrlLayout, 11, 0, 1, 2)
+ self.resetTransformsBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.resetTransformsBtn.setObjectName("resetTransformsBtn")
+ self.gridLayout_2.addWidget(self.resetTransformsBtn, 8, 0, 1, 1)
+ self.mirrorSelectionBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.mirrorSelectionBtn.setObjectName("mirrorSelectionBtn")
+ self.gridLayout_2.addWidget(self.mirrorSelectionBtn, 4, 0, 1, 1)
+ self.reflectSelectionBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.reflectSelectionBtn.setObjectName("reflectSelectionBtn")
+ self.gridLayout_2.addWidget(self.reflectSelectionBtn, 4, 1, 1, 1)
+ self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.storeSvgBtn.setText(_translate("Form", "Store SVG"))
+ self.storePngBtn.setText(_translate("Form", "Store PNG"))
+ self.autoRangeBtn.setText(_translate("Form", "Auto Range"))
+ self.redirectCheck.setToolTip(_translate("Form", "Check to display all local items in a remote canvas."))
+ self.redirectCheck.setText(_translate("Form", "Redirect"))
+ self.resetTransformsBtn.setText(_translate("Form", "Reset Transforms"))
+ self.mirrorSelectionBtn.setText(_translate("Form", "Mirror Selection"))
+ self.reflectSelectionBtn.setText(_translate("Form", "MirrorXY"))
+
+from ..widgets.GraphicsView import GraphicsView
+from ..widgets.TreeWidget import TreeWidget
+from CanvasManager import CanvasCombo
diff --git a/pyqtgraph/canvas/TransformGuiTemplate_pyqt5.py b/pyqtgraph/canvas/TransformGuiTemplate_pyqt5.py
new file mode 100644
index 00000000..549f3008
--- /dev/null
+++ b/pyqtgraph/canvas/TransformGuiTemplate_pyqt5.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file './pyqtgraph/canvas/TransformGuiTemplate.ui'
+#
+# Created: Wed Mar 26 15:09:28 2014
+# by: PyQt5 UI code generator 5.0.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(224, 117)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
+ Form.setSizePolicy(sizePolicy)
+ self.verticalLayout = QtWidgets.QVBoxLayout(Form)
+ self.verticalLayout.setSpacing(1)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.translateLabel = QtWidgets.QLabel(Form)
+ self.translateLabel.setObjectName("translateLabel")
+ self.verticalLayout.addWidget(self.translateLabel)
+ self.rotateLabel = QtWidgets.QLabel(Form)
+ self.rotateLabel.setObjectName("rotateLabel")
+ self.verticalLayout.addWidget(self.rotateLabel)
+ self.scaleLabel = QtWidgets.QLabel(Form)
+ self.scaleLabel.setObjectName("scaleLabel")
+ self.verticalLayout.addWidget(self.scaleLabel)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.mirrorImageBtn = QtWidgets.QPushButton(Form)
+ self.mirrorImageBtn.setToolTip("")
+ self.mirrorImageBtn.setObjectName("mirrorImageBtn")
+ self.horizontalLayout.addWidget(self.mirrorImageBtn)
+ self.reflectImageBtn = QtWidgets.QPushButton(Form)
+ self.reflectImageBtn.setObjectName("reflectImageBtn")
+ self.horizontalLayout.addWidget(self.reflectImageBtn)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.translateLabel.setText(_translate("Form", "Translate:"))
+ self.rotateLabel.setText(_translate("Form", "Rotate:"))
+ self.scaleLabel.setText(_translate("Form", "Scale:"))
+ self.mirrorImageBtn.setText(_translate("Form", "Mirror"))
+ self.reflectImageBtn.setText(_translate("Form", "Reflect"))
+
diff --git a/pyqtgraph/console/Console.py b/pyqtgraph/console/Console.py
index 896de924..7b3f6d97 100644
--- a/pyqtgraph/console/Console.py
+++ b/pyqtgraph/console/Console.py
@@ -1,8 +1,10 @@
-from ..Qt import QtCore, QtGui, USE_PYSIDE
+from ..Qt import QtCore, QtGui, USE_PYSIDE, USE_PYQT5
import sys, re, os, time, traceback, subprocess
if USE_PYSIDE:
from . import template_pyside as template
+elif USE_PYQT5:
+ from . import template_pyqt5 as template
else:
from . import template_pyqt as template
diff --git a/pyqtgraph/console/template_pyqt5.py b/pyqtgraph/console/template_pyqt5.py
new file mode 100644
index 00000000..1fbc5bed
--- /dev/null
+++ b/pyqtgraph/console/template_pyqt5.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file './pyqtgraph/console/template.ui'
+#
+# Created: Wed Mar 26 15:09:29 2014
+# by: PyQt5 UI code generator 5.0.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(710, 497)
+ self.gridLayout = QtWidgets.QGridLayout(Form)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setSpacing(0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.splitter = QtWidgets.QSplitter(Form)
+ self.splitter.setOrientation(QtCore.Qt.Vertical)
+ self.splitter.setObjectName("splitter")
+ self.layoutWidget = QtWidgets.QWidget(self.splitter)
+ self.layoutWidget.setObjectName("layoutWidget")
+ self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
+ self.verticalLayout.setContentsMargins(0, 0, 0, 0)
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.output = QtWidgets.QPlainTextEdit(self.layoutWidget)
+ font = QtGui.QFont()
+ font.setFamily("Monospace")
+ self.output.setFont(font)
+ self.output.setReadOnly(True)
+ self.output.setObjectName("output")
+ self.verticalLayout.addWidget(self.output)
+ self.horizontalLayout = QtWidgets.QHBoxLayout()
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.input = CmdInput(self.layoutWidget)
+ self.input.setObjectName("input")
+ self.horizontalLayout.addWidget(self.input)
+ self.historyBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.historyBtn.setCheckable(True)
+ self.historyBtn.setObjectName("historyBtn")
+ self.horizontalLayout.addWidget(self.historyBtn)
+ self.exceptionBtn = QtWidgets.QPushButton(self.layoutWidget)
+ self.exceptionBtn.setCheckable(True)
+ self.exceptionBtn.setObjectName("exceptionBtn")
+ self.horizontalLayout.addWidget(self.exceptionBtn)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.historyList = QtWidgets.QListWidget(self.splitter)
+ font = QtGui.QFont()
+ font.setFamily("Monospace")
+ self.historyList.setFont(font)
+ self.historyList.setObjectName("historyList")
+ self.exceptionGroup = QtWidgets.QGroupBox(self.splitter)
+ self.exceptionGroup.setObjectName("exceptionGroup")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.exceptionGroup)
+ self.gridLayout_2.setSpacing(0)
+ self.gridLayout_2.setContentsMargins(-1, 0, -1, 0)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.catchAllExceptionsBtn = QtWidgets.QPushButton(self.exceptionGroup)
+ self.catchAllExceptionsBtn.setCheckable(True)
+ self.catchAllExceptionsBtn.setObjectName("catchAllExceptionsBtn")
+ self.gridLayout_2.addWidget(self.catchAllExceptionsBtn, 0, 1, 1, 1)
+ self.catchNextExceptionBtn = QtWidgets.QPushButton(self.exceptionGroup)
+ self.catchNextExceptionBtn.setCheckable(True)
+ self.catchNextExceptionBtn.setObjectName("catchNextExceptionBtn")
+ self.gridLayout_2.addWidget(self.catchNextExceptionBtn, 0, 0, 1, 1)
+ self.onlyUncaughtCheck = QtWidgets.QCheckBox(self.exceptionGroup)
+ self.onlyUncaughtCheck.setChecked(True)
+ self.onlyUncaughtCheck.setObjectName("onlyUncaughtCheck")
+ self.gridLayout_2.addWidget(self.onlyUncaughtCheck, 0, 2, 1, 1)
+ self.exceptionStackList = QtWidgets.QListWidget(self.exceptionGroup)
+ self.exceptionStackList.setAlternatingRowColors(True)
+ self.exceptionStackList.setObjectName("exceptionStackList")
+ self.gridLayout_2.addWidget(self.exceptionStackList, 2, 0, 1, 5)
+ self.runSelectedFrameCheck = QtWidgets.QCheckBox(self.exceptionGroup)
+ self.runSelectedFrameCheck.setChecked(True)
+ self.runSelectedFrameCheck.setObjectName("runSelectedFrameCheck")
+ self.gridLayout_2.addWidget(self.runSelectedFrameCheck, 3, 0, 1, 5)
+ self.exceptionInfoLabel = QtWidgets.QLabel(self.exceptionGroup)
+ self.exceptionInfoLabel.setObjectName("exceptionInfoLabel")
+ self.gridLayout_2.addWidget(self.exceptionInfoLabel, 1, 0, 1, 5)
+ self.clearExceptionBtn = QtWidgets.QPushButton(self.exceptionGroup)
+ self.clearExceptionBtn.setEnabled(False)
+ self.clearExceptionBtn.setObjectName("clearExceptionBtn")
+ self.gridLayout_2.addWidget(self.clearExceptionBtn, 0, 4, 1, 1)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+ self.gridLayout_2.addItem(spacerItem, 0, 3, 1, 1)
+ self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Console"))
+ self.historyBtn.setText(_translate("Form", "History.."))
+ self.exceptionBtn.setText(_translate("Form", "Exceptions.."))
+ self.exceptionGroup.setTitle(_translate("Form", "Exception Handling"))
+ self.catchAllExceptionsBtn.setText(_translate("Form", "Show All Exceptions"))
+ self.catchNextExceptionBtn.setText(_translate("Form", "Show Next Exception"))
+ self.onlyUncaughtCheck.setText(_translate("Form", "Only Uncaught Exceptions"))
+ self.runSelectedFrameCheck.setText(_translate("Form", "Run commands in selected stack frame"))
+ self.exceptionInfoLabel.setText(_translate("Form", "Exception Info"))
+ self.clearExceptionBtn.setText(_translate("Form", "Clear Exception"))
+
+from .CmdInput import CmdInput
diff --git a/pyqtgraph/exporters/SVGExporter.py b/pyqtgraph/exporters/SVGExporter.py
index a91466c8..ccf92165 100644
--- a/pyqtgraph/exporters/SVGExporter.py
+++ b/pyqtgraph/exporters/SVGExporter.py
@@ -45,41 +45,6 @@ class SVGExporter(Exporter):
if toBytes is False and copy is False and fileName is None:
self.fileSaveDialog(filter="Scalable Vector Graphics (*.svg)")
return
- #self.svg = QtSvg.QSvgGenerator()
- #self.svg.setFileName(fileName)
- #dpi = QtGui.QDesktopWidget().physicalDpiX()
- ### not really sure why this works, but it seems to be important:
- #self.svg.setSize(QtCore.QSize(self.params['width']*dpi/90., self.params['height']*dpi/90.))
- #self.svg.setResolution(dpi)
- ##self.svg.setViewBox()
- #targetRect = QtCore.QRect(0, 0, self.params['width'], self.params['height'])
- #sourceRect = self.getSourceRect()
-
- #painter = QtGui.QPainter(self.svg)
- #try:
- #self.setExportMode(True)
- #self.render(painter, QtCore.QRectF(targetRect), sourceRect)
- #finally:
- #self.setExportMode(False)
- #painter.end()
-
- ## Workaround to set pen widths correctly
- #data = open(fileName).readlines()
- #for i in range(len(data)):
- #line = data[i]
- #m = re.match(r'(
Links this axis with another view. When linked, both views will display the same data range.
"))
+ self.autoPercentSpin.setToolTip(_translate("Form", "Percent of data to be visible when auto-scaling. It may be useful to decrease this value for data with spiky noise.
"))
+ self.autoPercentSpin.setSuffix(_translate("Form", "%"))
+ self.autoRadio.setToolTip(_translate("Form", "Automatically resize this axis whenever the displayed data is changed.
"))
+ self.autoRadio.setText(_translate("Form", "Auto"))
+ self.manualRadio.setToolTip(_translate("Form", " Set the range for this axis manually. This disables automatic scaling.
"))
+ self.manualRadio.setText(_translate("Form", "Manual"))
+ self.minText.setToolTip(_translate("Form", "Minimum value to display for this axis.
"))
+ self.minText.setText(_translate("Form", "0"))
+ self.maxText.setToolTip(_translate("Form", "Maximum value to display for this axis.
"))
+ self.maxText.setText(_translate("Form", "0"))
+ self.invertCheck.setToolTip(_translate("Form", "Inverts the display of this axis. (+y points downward instead of upward)
"))
+ self.invertCheck.setText(_translate("Form", "Invert Axis"))
+ self.mouseCheck.setToolTip(_translate("Form", "
Enables mouse interaction (panning, scaling) for this axis.
"))
+ self.mouseCheck.setText(_translate("Form", "Mouse Enabled"))
+ self.visibleOnlyCheck.setToolTip(_translate("Form", "When checked, the axis will only auto-scale to data that is visible along the orthogonal axis.
"))
+ self.visibleOnlyCheck.setText(_translate("Form", "Visible Data Only"))
+ self.autoPanCheck.setToolTip(_translate("Form", "When checked, the axis will automatically pan to center on the current data, but the scale along this axis will not change.
"))
+ self.autoPanCheck.setText(_translate("Form", "Auto Pan Only"))
+
diff --git a/pyqtgraph/imageview/ImageView.py b/pyqtgraph/imageview/ImageView.py
index 65252cfe..61193fc4 100644
--- a/pyqtgraph/imageview/ImageView.py
+++ b/pyqtgraph/imageview/ImageView.py
@@ -12,7 +12,7 @@ Widget used for displaying 2D or 3D data. Features:
- ROI plotting
- Image normalization through a variety of methods
"""
-import os, sys
+import os
import numpy as np
from ..Qt import QtCore, QtGui, USE_PYSIDE
@@ -34,7 +34,7 @@ try:
from bottleneck import nanmin, nanmax
except ImportError:
from numpy import nanmin, nanmax
-
+
class PlotROI(ROI):
def __init__(self, size):
@@ -145,13 +145,13 @@ class ImageView(QtGui.QWidget):
self.view.addItem(self.roi)
self.roi.hide()
self.normRoi = PlotROI(10)
- self.normRoi.setPen(QtGui.QPen(QtGui.QColor(255,255,0)))
+ self.normRoi.setPen('y')
self.normRoi.setZValue(20)
self.view.addItem(self.normRoi)
self.normRoi.hide()
self.roiCurve = self.ui.roiPlot.plot()
self.timeLine = InfiniteLine(0, movable=True)
- self.timeLine.setPen(QtGui.QPen(QtGui.QColor(255, 255, 0, 200)))
+ self.timeLine.setPen((255, 255, 0, 200))
self.timeLine.setZValue(1)
self.ui.roiPlot.addItem(self.timeLine)
self.ui.splitter.setSizes([self.height()-35, 35])
diff --git a/pyqtgraph/imageview/ImageViewTemplate_pyqt.py b/pyqtgraph/imageview/ImageViewTemplate_pyqt.py
index e728b265..8c9d5633 100644
--- a/pyqtgraph/imageview/ImageViewTemplate_pyqt.py
+++ b/pyqtgraph/imageview/ImageViewTemplate_pyqt.py
@@ -7,7 +7,7 @@
#
# WARNING! All changes made in this file will be lost!
-from PyQt4 import QtCore, QtGui
+from ..Qt import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
diff --git a/pyqtgraph/imageview/ImageViewTemplate_pyqt5.py b/pyqtgraph/imageview/ImageViewTemplate_pyqt5.py
new file mode 100644
index 00000000..4b4009b6
--- /dev/null
+++ b/pyqtgraph/imageview/ImageViewTemplate_pyqt5.py
@@ -0,0 +1,156 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file './pyqtgraph/imageview/ImageViewTemplate.ui'
+#
+# Created: Wed Mar 26 15:09:28 2014
+# by: PyQt5 UI code generator 5.0.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(726, 588)
+ self.gridLayout_3 = QtWidgets.QGridLayout(Form)
+ self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout_3.setSpacing(0)
+ self.gridLayout_3.setObjectName("gridLayout_3")
+ self.splitter = QtWidgets.QSplitter(Form)
+ self.splitter.setOrientation(QtCore.Qt.Vertical)
+ self.splitter.setObjectName("splitter")
+ self.layoutWidget = QtWidgets.QWidget(self.splitter)
+ self.layoutWidget.setObjectName("layoutWidget")
+ self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
+ self.gridLayout.setSpacing(0)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.graphicsView = GraphicsView(self.layoutWidget)
+ self.graphicsView.setObjectName("graphicsView")
+ self.gridLayout.addWidget(self.graphicsView, 0, 0, 2, 1)
+ self.histogram = HistogramLUTWidget(self.layoutWidget)
+ self.histogram.setObjectName("histogram")
+ self.gridLayout.addWidget(self.histogram, 0, 1, 1, 2)
+ self.roiBtn = QtWidgets.QPushButton(self.layoutWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(1)
+ sizePolicy.setHeightForWidth(self.roiBtn.sizePolicy().hasHeightForWidth())
+ self.roiBtn.setSizePolicy(sizePolicy)
+ self.roiBtn.setCheckable(True)
+ self.roiBtn.setObjectName("roiBtn")
+ self.gridLayout.addWidget(self.roiBtn, 1, 1, 1, 1)
+ self.normBtn = QtWidgets.QPushButton(self.layoutWidget)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(1)
+ sizePolicy.setHeightForWidth(self.normBtn.sizePolicy().hasHeightForWidth())
+ self.normBtn.setSizePolicy(sizePolicy)
+ self.normBtn.setCheckable(True)
+ self.normBtn.setObjectName("normBtn")
+ self.gridLayout.addWidget(self.normBtn, 1, 2, 1, 1)
+ self.roiPlot = PlotWidget(self.splitter)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.roiPlot.sizePolicy().hasHeightForWidth())
+ self.roiPlot.setSizePolicy(sizePolicy)
+ self.roiPlot.setMinimumSize(QtCore.QSize(0, 40))
+ self.roiPlot.setObjectName("roiPlot")
+ self.gridLayout_3.addWidget(self.splitter, 0, 0, 1, 1)
+ self.normGroup = QtWidgets.QGroupBox(Form)
+ self.normGroup.setObjectName("normGroup")
+ self.gridLayout_2 = QtWidgets.QGridLayout(self.normGroup)
+ self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout_2.setSpacing(0)
+ self.gridLayout_2.setObjectName("gridLayout_2")
+ self.normSubtractRadio = QtWidgets.QRadioButton(self.normGroup)
+ self.normSubtractRadio.setObjectName("normSubtractRadio")
+ self.gridLayout_2.addWidget(self.normSubtractRadio, 0, 2, 1, 1)
+ self.normDivideRadio = QtWidgets.QRadioButton(self.normGroup)
+ self.normDivideRadio.setChecked(False)
+ self.normDivideRadio.setObjectName("normDivideRadio")
+ self.gridLayout_2.addWidget(self.normDivideRadio, 0, 1, 1, 1)
+ self.label_5 = QtWidgets.QLabel(self.normGroup)
+ font = QtGui.QFont()
+ font.setBold(True)
+ font.setWeight(75)
+ self.label_5.setFont(font)
+ self.label_5.setObjectName("label_5")
+ self.gridLayout_2.addWidget(self.label_5, 0, 0, 1, 1)
+ self.label_3 = QtWidgets.QLabel(self.normGroup)
+ font = QtGui.QFont()
+ font.setBold(True)
+ font.setWeight(75)
+ self.label_3.setFont(font)
+ self.label_3.setObjectName("label_3")
+ self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)
+ self.label_4 = QtWidgets.QLabel(self.normGroup)
+ font = QtGui.QFont()
+ font.setBold(True)
+ font.setWeight(75)
+ self.label_4.setFont(font)
+ self.label_4.setObjectName("label_4")
+ self.gridLayout_2.addWidget(self.label_4, 2, 0, 1, 1)
+ self.normROICheck = QtWidgets.QCheckBox(self.normGroup)
+ self.normROICheck.setObjectName("normROICheck")
+ self.gridLayout_2.addWidget(self.normROICheck, 1, 1, 1, 1)
+ self.normXBlurSpin = QtWidgets.QDoubleSpinBox(self.normGroup)
+ self.normXBlurSpin.setObjectName("normXBlurSpin")
+ self.gridLayout_2.addWidget(self.normXBlurSpin, 2, 2, 1, 1)
+ self.label_8 = QtWidgets.QLabel(self.normGroup)
+ self.label_8.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_8.setObjectName("label_8")
+ self.gridLayout_2.addWidget(self.label_8, 2, 1, 1, 1)
+ self.label_9 = QtWidgets.QLabel(self.normGroup)
+ self.label_9.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_9.setObjectName("label_9")
+ self.gridLayout_2.addWidget(self.label_9, 2, 3, 1, 1)
+ self.normYBlurSpin = QtWidgets.QDoubleSpinBox(self.normGroup)
+ self.normYBlurSpin.setObjectName("normYBlurSpin")
+ self.gridLayout_2.addWidget(self.normYBlurSpin, 2, 4, 1, 1)
+ self.label_10 = QtWidgets.QLabel(self.normGroup)
+ self.label_10.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+ self.label_10.setObjectName("label_10")
+ self.gridLayout_2.addWidget(self.label_10, 2, 5, 1, 1)
+ self.normOffRadio = QtWidgets.QRadioButton(self.normGroup)
+ self.normOffRadio.setChecked(True)
+ self.normOffRadio.setObjectName("normOffRadio")
+ self.gridLayout_2.addWidget(self.normOffRadio, 0, 3, 1, 1)
+ self.normTimeRangeCheck = QtWidgets.QCheckBox(self.normGroup)
+ self.normTimeRangeCheck.setObjectName("normTimeRangeCheck")
+ self.gridLayout_2.addWidget(self.normTimeRangeCheck, 1, 3, 1, 1)
+ self.normFrameCheck = QtWidgets.QCheckBox(self.normGroup)
+ self.normFrameCheck.setObjectName("normFrameCheck")
+ self.gridLayout_2.addWidget(self.normFrameCheck, 1, 2, 1, 1)
+ self.normTBlurSpin = QtWidgets.QDoubleSpinBox(self.normGroup)
+ self.normTBlurSpin.setObjectName("normTBlurSpin")
+ self.gridLayout_2.addWidget(self.normTBlurSpin, 2, 6, 1, 1)
+ self.gridLayout_3.addWidget(self.normGroup, 1, 0, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ _translate = QtCore.QCoreApplication.translate
+ Form.setWindowTitle(_translate("Form", "Form"))
+ self.roiBtn.setText(_translate("Form", "ROI"))
+ self.normBtn.setText(_translate("Form", "Norm"))
+ self.normGroup.setTitle(_translate("Form", "Normalization"))
+ self.normSubtractRadio.setText(_translate("Form", "Subtract"))
+ self.normDivideRadio.setText(_translate("Form", "Divide"))
+ self.label_5.setText(_translate("Form", "Operation:"))
+ self.label_3.setText(_translate("Form", "Mean:"))
+ self.label_4.setText(_translate("Form", "Blur:"))
+ self.normROICheck.setText(_translate("Form", "ROI"))
+ self.label_8.setText(_translate("Form", "X"))
+ self.label_9.setText(_translate("Form", "Y"))
+ self.label_10.setText(_translate("Form", "T"))
+ self.normOffRadio.setText(_translate("Form", "Off"))
+ self.normTimeRangeCheck.setText(_translate("Form", "Time range"))
+ self.normFrameCheck.setText(_translate("Form", "Frame"))
+
+from ..widgets.HistogramLUTWidget import HistogramLUTWidget
+from ..widgets.PlotWidget import PlotWidget
+from ..widgets.GraphicsView import GraphicsView
diff --git a/pyqtgraph/opengl/GLViewWidget.py b/pyqtgraph/opengl/GLViewWidget.py
index 992aa73e..0ab91188 100644
--- a/pyqtgraph/opengl/GLViewWidget.py
+++ b/pyqtgraph/opengl/GLViewWidget.py
@@ -1,4 +1,4 @@
-from ..Qt import QtCore, QtGui, QtOpenGL
+from ..Qt import QtCore, QtGui, QtOpenGL, USE_PYQT5
from OpenGL.GL import *
import OpenGL.GL.framebufferobjects as glfbo
import numpy as np
@@ -324,10 +324,17 @@ class GLViewWidget(QtOpenGL.QGLWidget):
def wheelEvent(self, ev):
- if (ev.modifiers() & QtCore.Qt.ControlModifier):
- self.opts['fov'] *= 0.999**ev.delta()
+ delta = 0
+ if not USE_PYQT5:
+ delta = ev.delta()
else:
- self.opts['distance'] *= 0.999**ev.delta()
+ delta = ev.angleDelta().x()
+ if delta == 0:
+ delta = ev.angleDelta().y()
+ if (ev.modifiers() & QtCore.Qt.ControlModifier):
+ self.opts['fov'] *= 0.999**delta
+ else:
+ self.opts['distance'] *= 0.999**delta
self.update()
def keyPressEvent(self, ev):
diff --git a/pyqtgraph/widgets/MatplotlibWidget.py b/pyqtgraph/widgets/MatplotlibWidget.py
index 959e188a..3de063fc 100644
--- a/pyqtgraph/widgets/MatplotlibWidget.py
+++ b/pyqtgraph/widgets/MatplotlibWidget.py
@@ -1,11 +1,16 @@
-from ..Qt import QtGui, QtCore, USE_PYSIDE
+from ..Qt import QtGui, QtCore, USE_PYSIDE, USE_PYQT5
import matplotlib
-if USE_PYSIDE:
- matplotlib.rcParams['backend.qt4']='PySide'
+if not USE_PYQT5:
+ if USE_PYSIDE:
+ matplotlib.rcParams['backend.qt4']='PySide'
+
+ from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
+ from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
+else:
+ from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
+ from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
-from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
-from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from matplotlib.figure import Figure
class MatplotlibWidget(QtGui.QWidget):
diff --git a/tools/pyuic5 b/tools/pyuic5
new file mode 100755
index 00000000..628cc2f8
--- /dev/null
+++ b/tools/pyuic5
@@ -0,0 +1,2 @@
+#!/usr/bin/python3
+import PyQt5.uic.pyuic
diff --git a/tools/rebuildUi.py b/tools/rebuildUi.py
index 36f4d34c..98751412 100644
--- a/tools/rebuildUi.py
+++ b/tools/rebuildUi.py
@@ -4,6 +4,7 @@ import os, sys
pyqtuic = 'pyuic4'
pysideuic = 'pyside-uic'
+pyqt5uic = 'pyuic5'
for path, sd, files in os.walk('.'):
for f in files:
@@ -21,3 +22,9 @@ for path, sd, files in os.walk('.'):
if not os.path.exists(py) or os.stat(ui).st_mtime > os.stat(py).st_mtime:
os.system('%s %s > %s' % (pysideuic, ui, py))
print(py)
+
+ py = os.path.join(path, base + '_pyqt5.py')
+ if not os.path.exists(py) or os.stat(ui).st_mtime > os.stat(py).st_mtime:
+ os.system('%s %s > %s' % (pyqt5uic, ui, py))
+ print(py)
+