Search code examples
pythonpyqtpyqt4qtgui

QScroll area within QStackedLayout


I have a QMainWindow with a QStackedWidget as the central widget, and having been switching between layouts by changing the current widget of this central widget.

This has been working fine, but now I am trying to make one of these possible layouts scrollable and this is the result:

enter image description here


Code for MainWindow class:

class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
    super(MainWindow, self).__init__(parent)
    self.central_widget = QtGui.QStackedWidget()
    self.setCentralWidget(self.central_widget)        

    #-- On load open main menu
    self.showMenu()  

# Go to the menu screen
def showMenu(self):
    widget_menu = WidgetMain(self)
    widget_menu.btnConfigu.clicked.connect(self.showConfig)
    self.central_widget.addWidget(widget_menu)
    self.central_widget.setCurrentWidget(widget_menu)
    self.resize(420,350)

# Go to the config screen
def showConfigu(self):
    widget_configu = WidgetOptions(self)
    self.central_widget.addWidget(widget_configu)
    self.central_widget.setCurrentWidget(widget_configu)

Code for WidgetOptions class:

class WidgetOptions(QtGui.QWidget):

def __init__(self, parent=None):
    super(WidgetOptions, self).__init__(parent)

    #Container Widget        
    widget = QtGui.QWidget()
    layoutRightContainer = QtGui.QVBoxLayout()
    for _ in range(11):
        btn = QtGui.QPushButton("test")
        layoutRightContainer.addWidget(btn)
    widget.setLayout(layoutRightContainer)   
    widget
    self.setFixedHeight(300)             

    #Scroll Area Properties
    scroll = QtGui.QScrollArea()
    scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
    scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
    scroll.setWidgetResizable(True)
    scroll.setWidget(widget)        

    layoutMain = QtGui.QHBoxLayout()
    layoutMain.addWidget(widget)

I've tried numerous tweaks to the set sizes, and making different containers non-/resizable. What works outside of a StackedWidget doesn't seem to work within one. There also doesn't seem to be any questions on SO with such a situation. self.setLayout(layoutMain)


Solution

  • I solved this by making the WidgetOptions class itself an extension of QScrollArea rather than a QWidget containing the QScrollArea

    Code for WidgetOptions class:

    class WidgetOptions(QtGui.QScrollArea):
    
    def __init__(self, parent=None):
        super(WidgetOptions, self).__init__(parent)
    
        layoutLeft = QtGui.QVBoxLayout()                
        self.btnVariables = QtGui.QPushButton("Variables")
        self.btnGroups = QtGui.QPushButton("Groups")
        layoutLeft.addWidget(self.btnVariables)
        layoutLeft.addWidget(self.btnGroups)
    
        #Container Widget        
        widget = QtGui.QWidget()
        layoutRightContainer = QtGui.QVBoxLayout()
        for _ in range(11):
            btn = QtGui.QPushButton("test")
            layoutRightContainer.addWidget(btn)
        widget.setLayout(layoutRightContainer)   
    
        #Scroll Area Properties
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setWidgetResizable(True)
        self.setWidget(widget)        
    
        self.setWidget(widget)