Show several plots in a scrollable widget with PyQt and matplotlib

前端 未结 1 1613
时光说笑
时光说笑 2021-02-11 10:06

Since I didn\'t get an answer for this question I tried solving it with PyQt. Apparently, it\'s not that easy, when QScrollArea is involved...

I wrote a small test that

1条回答
  •  北海茫月
    2021-02-11 10:39

    You are creating a QWidget for each plot. But you don't put your canvas or toolbar in it via a layout, so they can't communicate the size information with the QWidget. By default, a QWidget has no minimumSize and the widget/layout inside the QScrollArea can make them as small as it wants in order to fit the available space (which is the size of QScrollArea).

    Adding plots via layout helps, but I find that the FigureCanvas widget also doesn't have any minimum size so it can shrink. For a quick fix, you can set a minimumSize. The loop part with these fixes should look like this:

    for i in xrange(5):
      qfigWidget = QtGui.QWidget(qscrollContents)
    
      fig = Figure((5.0, 4.0), dpi=100)
      canvas = FigureCanvas(fig)
      canvas.setParent(qfigWidget)
      toolbar = NavigationToolbar(canvas, qfigWidget)
      axes = fig.add_subplot(111)
      axes.plot([1,2,3,4])
    
      # place plot components in a layout
      plotLayout = QtGui.QVBoxLayout()
      plotLayout.addWidget(canvas)
      plotLayout.addWidget(toolbar)
      qfigWidget.setLayout(plotLayout)
    
      # prevent the canvas to shrink beyond a point
      # original size looks like a good minimum size
      canvas.setMinimumSize(canvas.size())
    
      qscrollLayout.addWidget(qfigWidget)
    

    0 讨论(0)
提交回复
热议问题