Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b6a0c7e

Browse files
committed
Merge pull request #2594 from rhoef/newsubplottool
New layout for qt4 subplottool + QMainWindow -> QDialog
2 parents b92492e + ebd5b09 commit b6a0c7e

File tree

3 files changed

+295
-95
lines changed

3 files changed

+295
-95
lines changed

doc/users/whats_new.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,17 @@ You can add your own custom ``<style name>.mplstyle`` files to
118118
*Note that this is an experimental feature*, and the interface may change as
119119
users test out this new feature.
120120

121+
Backends
122+
--------
123+
124+
Qt4 backend
125+
``````````````
126+
Rudolf Höfler changed the appearance of the subplottool. All sliders are
127+
vertically arranged now, buttons for tight layout and reset were
128+
added. Furthermore, the the subplottool is now implemented as a modal
129+
dialog. It was previously a QMainWindow, leaving the SPT open if one closed the
130+
plotwindow.
131+
121132
.. _whats-new-1-3:
122133

123134
new in matplotlib-1.3

lib/matplotlib/backends/backend_qt4.py

Lines changed: 54 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
figureoptions = None
4040

4141
from .qt4_compat import QtCore, QtGui, _getSaveFileName, __version__
42+
from matplotlib.backends.qt4_editor.formsubplottool import UiSubplotTool
4243

4344
backend_version = __version__
4445

@@ -558,6 +559,7 @@ class NavigationToolbar2QT(NavigationToolbar2, QtGui.QToolBar):
558559
def __init__(self, canvas, parent, coordinates=True):
559560
""" coordinates: should we show the coordinates on the right? """
560561
self.canvas = canvas
562+
self.parent = parent
561563
self.coordinates = coordinates
562564
self._actions = {}
563565
"""A mapping of toolitem method names to their QActions"""
@@ -628,9 +630,8 @@ def edit_parameters(self):
628630
titles.append(fmt % dict(title=title,
629631
ylabel=ylabel,
630632
axes_repr=repr(axes)))
631-
item, ok = QtGui.QInputDialog.getItem(self, 'Customize',
632-
'Select axes:', titles,
633-
0, False)
633+
item, ok = QtGui.QInputDialog.getItem(
634+
self.parent, 'Customize', 'Select axes:', titles, 0, False)
634635
if ok:
635636
axes = allaxes[titles.index(six.text_type(item))]
636637
else:
@@ -676,20 +677,11 @@ def draw_rubberband(self, event, x0, y0, x1, y1):
676677
self.canvas.drawRectangle(rect)
677678

678679
def configure_subplots(self):
679-
self.adj_window = QtGui.QMainWindow()
680-
win = self.adj_window
681-
682-
win.setWindowTitle("Subplot Configuration Tool")
683680
image = os.path.join(matplotlib.rcParams['datapath'],
684681
'images', 'matplotlib.png')
685-
win.setWindowIcon(QtGui.QIcon(image))
686-
687-
tool = SubplotToolQt(self.canvas.figure, win)
688-
win.setCentralWidget(tool)
689-
win.setSizePolicy(QtGui.QSizePolicy.Preferred,
690-
QtGui.QSizePolicy.Preferred)
691-
692-
win.show()
682+
dia = SubplotToolQt(self.canvas.figure, self.parent)
683+
dia.setWindowIcon(QtGui.QIcon(image))
684+
dia.exec_()
693685

694686
def _get_canvas(self, fig):
695687
return FigureCanvasQT(fig)
@@ -712,8 +704,9 @@ def save_figure(self, *args):
712704
selectedFilter = filter
713705
filters.append(filter)
714706
filters = ';;'.join(filters)
715-
fname = _getSaveFileName(self, "Choose a filename to save to",
716-
start, filters, selectedFilter)
707+
708+
fname = _getSaveFileName(self.parent, "Choose a filename to save to",
709+
start, filters, selectedFilter)
717710
if fname:
718711
if startpath == '':
719712
# explicitly missing key or empty str signals to use cwd
@@ -730,132 +723,98 @@ def save_figure(self, *args):
730723
QtGui.QMessageBox.Ok, QtGui.QMessageBox.NoButton)
731724

732725

733-
class SubplotToolQt(SubplotTool, QtGui.QWidget):
726+
class SubplotToolQt(SubplotTool, UiSubplotTool):
734727
def __init__(self, targetfig, parent):
735-
QtGui.QWidget.__init__(self, None)
728+
UiSubplotTool.__init__(self, None)
736729

737730
self.targetfig = targetfig
738731
self.parent = parent
739-
740-
self.sliderleft = QtGui.QSlider(QtCore.Qt.Horizontal)
741-
self.sliderbottom = QtGui.QSlider(QtCore.Qt.Vertical)
742-
self.sliderright = QtGui.QSlider(QtCore.Qt.Horizontal)
743-
self.slidertop = QtGui.QSlider(QtCore.Qt.Vertical)
744-
self.sliderwspace = QtGui.QSlider(QtCore.Qt.Horizontal)
745-
self.sliderhspace = QtGui.QSlider(QtCore.Qt.Vertical)
732+
self.donebutton.clicked.connect(self.close)
733+
self.resetbutton.clicked.connect(self.reset)
734+
self.tightlayout.clicked.connect(self.functight)
746735

747736
# constraints
748737
self.sliderleft.valueChanged.connect(self.sliderright.setMinimum)
749738
self.sliderright.valueChanged.connect(self.sliderleft.setMaximum)
750739
self.sliderbottom.valueChanged.connect(self.slidertop.setMinimum)
751740
self.slidertop.valueChanged.connect(self.sliderbottom.setMaximum)
752741

753-
sliders = (self.sliderleft, self.sliderbottom, self.sliderright,
754-
self.slidertop, self.sliderwspace, self.sliderhspace,)
755-
adjustments = ('left:', 'bottom:', 'right:',
756-
'top:', 'wspace:', 'hspace:')
757-
758-
for slider, adjustment in zip(sliders, adjustments):
742+
self.defaults = {}
743+
for attr in ('left', 'bottom', 'right', 'top', 'wspace', 'hspace',):
744+
self.defaults[attr] = getattr(self.targetfig.subplotpars, attr)
745+
slider = getattr(self, 'slider' + attr)
759746
slider.setMinimum(0)
760747
slider.setMaximum(1000)
761748
slider.setSingleStep(5)
749+
slider.valueChanged.connect(getattr(self, 'func' + attr))
750+
751+
self._setSliderPositions()
762752

763-
layout = QtGui.QGridLayout()
764-
765-
leftlabel = QtGui.QLabel('left')
766-
layout.addWidget(leftlabel, 2, 0)
767-
layout.addWidget(self.sliderleft, 2, 1)
768-
769-
toplabel = QtGui.QLabel('top')
770-
layout.addWidget(toplabel, 0, 2)
771-
layout.addWidget(self.slidertop, 1, 2)
772-
layout.setAlignment(self.slidertop, QtCore.Qt.AlignHCenter)
773-
774-
bottomlabel = QtGui.QLabel('bottom') # this might not ever be used
775-
layout.addWidget(bottomlabel, 4, 2)
776-
layout.addWidget(self.sliderbottom, 3, 2)
777-
layout.setAlignment(self.sliderbottom, QtCore.Qt.AlignHCenter)
778-
779-
rightlabel = QtGui.QLabel('right')
780-
layout.addWidget(rightlabel, 2, 4)
781-
layout.addWidget(self.sliderright, 2, 3)
782-
783-
hspacelabel = QtGui.QLabel('hspace')
784-
layout.addWidget(hspacelabel, 0, 6)
785-
layout.setAlignment(hspacelabel, QtCore.Qt.AlignHCenter)
786-
layout.addWidget(self.sliderhspace, 1, 6)
787-
layout.setAlignment(self.sliderhspace, QtCore.Qt.AlignHCenter)
788-
789-
wspacelabel = QtGui.QLabel('wspace')
790-
layout.addWidget(wspacelabel, 4, 6)
791-
layout.setAlignment(wspacelabel, QtCore.Qt.AlignHCenter)
792-
layout.addWidget(self.sliderwspace, 3, 6)
793-
layout.setAlignment(self.sliderwspace, QtCore.Qt.AlignBottom)
794-
795-
layout.setRowStretch(1, 1)
796-
layout.setRowStretch(3, 1)
797-
layout.setColumnStretch(1, 1)
798-
layout.setColumnStretch(3, 1)
799-
layout.setColumnStretch(6, 1)
800-
801-
self.setLayout(layout)
802-
803-
self.sliderleft.setSliderPosition(int(targetfig.subplotpars.left*1000))
804-
self.sliderbottom.setSliderPosition(
805-
int(targetfig.subplotpars.bottom*1000))
806-
self.sliderright.setSliderPosition(
807-
int(targetfig.subplotpars.right*1000))
808-
self.slidertop.setSliderPosition(int(targetfig.subplotpars.top*1000))
809-
self.sliderwspace.setSliderPosition(
810-
int(targetfig.subplotpars.wspace*1000))
811-
self.sliderhspace.setSliderPosition(
812-
int(targetfig.subplotpars.hspace*1000))
813-
814-
self.sliderleft.valueChanged.connect(self.funcleft)
815-
self.sliderbottom.valueChanged.connect(self.funcbottom)
816-
self.sliderright.valueChanged.connect(self.funcright)
817-
self.slidertop.valueChanged.connect(self.functop)
818-
self.sliderwspace.valueChanged.connect(self.funcwspace)
819-
self.sliderhspace.valueChanged.connect(self.funchspace)
753+
def _setSliderPositions(self):
754+
for attr in ('left', 'bottom', 'right', 'top', 'wspace', 'hspace',):
755+
slider = getattr(self, 'slider' + attr)
756+
slider.setSliderPosition(int(self.defaults[attr] * 1000))
820757

821758
def funcleft(self, val):
822759
if val == self.sliderright.value():
823760
val -= 1
824-
self.targetfig.subplots_adjust(left=val/1000.)
761+
val /= 1000.
762+
self.targetfig.subplots_adjust(left=val)
763+
self.leftvalue.setText("%.2f" % val)
825764
if self.drawon:
826765
self.targetfig.canvas.draw()
827766

828767
def funcright(self, val):
829768
if val == self.sliderleft.value():
830769
val += 1
831-
self.targetfig.subplots_adjust(right=val/1000.)
770+
val /= 1000.
771+
self.targetfig.subplots_adjust(right=val)
772+
self.rightvalue.setText("%.2f" % val)
832773
if self.drawon:
833774
self.targetfig.canvas.draw()
834775

835776
def funcbottom(self, val):
836777
if val == self.slidertop.value():
837778
val -= 1
838-
self.targetfig.subplots_adjust(bottom=val/1000.)
779+
val /= 1000.
780+
self.targetfig.subplots_adjust(bottom=val)
781+
self.bottomvalue.setText("%.2f" % val)
839782
if self.drawon:
840783
self.targetfig.canvas.draw()
841784

842785
def functop(self, val):
843786
if val == self.sliderbottom.value():
844787
val += 1
845-
self.targetfig.subplots_adjust(top=val/1000.)
788+
val /= 1000.
789+
self.targetfig.subplots_adjust(top=val)
790+
self.topvalue.setText("%.2f" % val)
846791
if self.drawon:
847792
self.targetfig.canvas.draw()
848793

849794
def funcwspace(self, val):
850-
self.targetfig.subplots_adjust(wspace=val/1000.)
795+
val /= 1000.
796+
self.targetfig.subplots_adjust(wspace=val)
797+
self.wspacevalue.setText("%.2f" % val)
851798
if self.drawon:
852799
self.targetfig.canvas.draw()
853800

854801
def funchspace(self, val):
855-
self.targetfig.subplots_adjust(hspace=val/1000.)
802+
val /= 1000.
803+
self.targetfig.subplots_adjust(hspace=val)
804+
self.hspacevalue.setText("%.2f" % val)
856805
if self.drawon:
857806
self.targetfig.canvas.draw()
858807

808+
def functight(self):
809+
self.targetfig.tight_layout()
810+
self._setSliderPositions()
811+
self.targetfig.canvas.draw()
812+
813+
def reset(self):
814+
self.targetfig.subplots_adjust(**self.defaults)
815+
self._setSliderPositions()
816+
self.targetfig.canvas.draw()
817+
859818

860819
def error_msg_qt(msg, parent=None):
861820
if not is_string_like(msg):

0 commit comments

Comments
 (0)