如何在 QScrollArea 中绘制图形而不缩小它们?

问题描述

我正在创建一个界面,我想通过单击按钮在另一个选项卡中绘制图形。我希望在滚动区域中并排绘制图形。问题是,当我绘制图形时,而不是滚动条在可视化上工作,图形实际上缩小以适合小部件

这是一个最小的可重现示例

import sys
from PyQt5.QtWidgets import (QApplication,QMainWindow,QWidget,QPushButton,QLabel,QVBoxLayout,QHBoxLayout,QMessageBox,QLineEdit,QComboBox,QAction,QTabWidget,QScrollArea)

from matplotlib.backends.backend_qt5agg import figureCanvasQTAgg as figureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

from matplotlib.figure import figure
import matplotlib.pyplot as plt
                             
from PyQt5.QtCore import Qt
from PyQt5 import QtGui

class MainWindow(QMainWindow):    

    #view (GUI)
    def __init__(self,parent = None):
        #initalizer
        super(MainWindow,self).__init__(parent)
        
        #Window
        self.setwindowTitle("DataVisualizationPrototype")
        self.setGeometry(400,200,900,800)
        self.activateWindow()
        self.raise_()
        
        
        self.tab_widget = TabWidget(self)
        self.setCentralWidget(self.tab_widget)
        
class TabWidget(QWidget):
    
    def __init__(self,parent):
        super(QWidget,self).__init__(parent)
        self.layout =QVBoxLayout(self)
        
        self.tabs = QTabWidget()
        self.tab1 = QWidget()
        self.tab2 = QWidget()
        self.tabs.addTab(self.tab1,"Home")
        self.tabs.addTab(self.tab2,"Comparison")
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)
        
        
        #HOME PAGE
        #==========================================
        #GeneralLayout
        self.tab1layout = QVBoxLayout()
        self.tab1.setLayout(self.tab1layout)
        self.tab1layout.sizeHint()
        
        plotButton = QPushButton()
        self.tab1layout.addWidget(plotButton)
        plotbutton.clicked.connect(onclick2)

       
      
        #COMPARISON TAB
        #==========================================
        #GeneralLayout
        self.tab2layout = QVBoxLayout()
        self.tab2.setLayout(self.tab2layout)
        self.tab2layout.sizeHint()
        
        self.compGraphLayout = QHBoxLayout()
        self.compGraphLayout.addStretch()
        
        self.compScroll = QScrollArea()
        self.compScroll.setHorizontalScrollBarPolicy(Qt.ScrollBaralwaysOn)
        self.compScroll.setVerticalScrollBarPolicy(Qt.ScrollBaralwaysOff)
        self.scrollWidget = QWidget()
        
        self.compScroll.setWidget(self.scrollWidget)
        self.compScroll.setWidgetResizable(True)
        
        self.tab2layout.addWidget(self.compScroll)
        self.scrollWidget.setLayout(self.compGraphLayout)
        
   def onclick2(self,event):
        self.plotLayout = QVBoxLayout()
        self.fig = plt.figure()
        self.plotLayout.addWidget(figureCanvas(self.fig))
        
   
   
   
        self.plotLayout.addWidget(NavigationToolbar
                                 (figureCanvas(self.fig),self.scrollWidget))
        self.compGraphLayout.addLayout(self.plotLayout)
        

#Plot MRE
        self.fig.plt.plot([1,2,3,4])
        self.fig.plt.ylabel('some numbers')
        
        figureCanvas(self.fig).adjustSize()
        
        
 
        
def main():

    pt1 = QApplication(sys.argv)
    view = MainWindow()
    view.show()
    
    sys.exit(pt1.exec())

if __name__ == '__main__':
    main()

解决方法

OP 提供的代码凌乱、冗余且有一些拼写错误,因此我将避免指出错误的原因。

我的解决方案提出了一种简单明了的方法来实现水平显示图的目标。另一方面,画布没有合适的 sizeHint,因此小部件将被压缩,使滚动条不可见,因此可能的选项是设置最小宽度。

import sys

from PyQt5.QtWidgets import (
    QApplication,QMainWindow,QWidget,QPushButton,QVBoxLayout,QHBoxLayout,QTabWidget,QScrollArea,)

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

from matplotlib.figure import Figure


class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)

        # Window
        self.setWindowTitle("DataVisualizationPrototype")
        self.setGeometry(400,200,900,800)
        self.activateWindow()
        self.raise_()

        self.tab_widget = TabWidget()
        self.setCentralWidget(self.tab_widget)


class TabWidget(QTabWidget):
    def __init__(self,parent=None):
        super(TabWidget,self).__init__(parent)

        self.tab1 = QWidget()
        self.plot_button = QPushButton("Add plot")
        lay = QVBoxLayout(self.tab1)
        lay.addWidget(self.plot_button)

        self.tab2 = QWidget()
        self.scroll_area = QScrollArea()
        self.scroll_container = QWidget()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_area.setWidget(self.scroll_container)
        self.scroll_layout = QHBoxLayout(self.scroll_container)
        lay = QVBoxLayout(self.tab2)
        lay.addWidget(self.scroll_area)

        self.addTab(self.tab1,"Home")
        self.addTab(self.tab2,"Comparison")

        self.plot_button.clicked.connect(self.plot)

    def plot(self):
        canvas = FigureCanvas(Figure())
        ax = canvas.figure.add_subplot(111)
        toolbar = NavigationToolbar(canvas,self)

        container = QWidget()
        lay = QVBoxLayout(container)
        lay.addWidget(canvas)
        lay.addWidget(toolbar)

        self.scroll_layout.addWidget(container)
        container.setMinimumWidth(400)

        ax.plot([1,2,3,4])
        ax.set_ylabel("some numbers")


def main():

    app = QApplication(sys.argv)
    view = MainWindow()
    view.show()

    sys.exit(app.exec())


if __name__ == "__main__":
    main()