Daniel Severo
Daniel Severo

Reputation: 1848

Updating child widget in Qt

I have a simple project with the following classes

  1. class MainWindow(QMainWindow)
  2. class Home(QWidget)
  3. class Login(QWidget)

All I want is to be able to nest the QWidget classes (make them children of the QMainWindow) and display them INSIDE the MainWindow. I can't seam to figure out how to make the QWidgets "appear" after I've called them in the MainWindow.

Code is bellow:

import sys
from gui.MainWindow import Ui_MainWindow
from gui.home import Ui_Home
from gui.login import Ui_Login
from PyQt4.QtGui import QMainWindow, QApplication, QWidget

class Home(QWidget, Ui_Home):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)

class Login(QWidget, Ui_Login):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)

class MainWindow(QMainWindow,Ui_MainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)

        #INSERT pushButton.click to go to HOME here
        #INSERT pushButton.click to go to LOGIN here

    def setHome(self):    
        self.label_Screen.setText("HOME")
        self.mainwidget = Home()
        #NEEDS SOMETHING HERE

    def setLogin(self):    
        self.label_Screen.setText("LOGIN")
        self.mainwidget = Login()
        #NEEDS SOMETHING HERE

if __name__ == '__main__':
    app = QApplication(sys.argv)
    Main = MainWindow()
    Main.show()
    sys.exit(app.exec_())

I think I just need something where I've tagged "#NEEDS SOMETHING HERE", but I'm not sure what!

Cheers!

RESOLVED: thanks to kh25

Just had to add a layout to the QMainWindow and change the setHome to this:

def setHome(self):    
    self.label_Screen.setText("HOME")
    self.currentScreen = Home()
    self.layout.addWidget(self.currentScreen)
    self.setLayout(self.layout)

The equivalent should be done for the setLogin method also.

Upvotes: 1

Views: 1016

Answers (1)

kh25
kh25

Reputation: 1298

You need to create a layout and add the widgets to this layout first. There are various types of layout. Read here:

http://doc.qt.io/qt-4.8/layout.html

For a simple case like yours I'd suggest either using a QHBoxLayout or QVBoxLayout.

Declare this layout. Call addWidget() on the layout for each of the Login and Home widgets and then call setLayout() on the QMainWindow.

Upvotes: 1

Related Questions