user7547667
user7547667

Reputation:

How do I close a window in PyQT when opening a new one?

I am trying to create something, for school. I am using PyQT and QtDesigner. I was unaware that I wasn't supposed to edit the PYUIC4 generated code. Is there a way to close the window when opening a new window? Any help would be much appreciated, thanks:

from PyQt4 import QtCore, QtGui
from medLogin import *
import webbrowser
import time

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_titleMain(object):
    class openUiMain(object):
        def openLogin(self):
            print("Opening Login...")
            self.openLogin = QtGui.QMainWindow()
            self.ui = Ui_loginMainWin()
            self.ui.setupUi(self.openLogin)
            self.openLogin.show()


        def quitProgram(self):
            print("Program terminating...")
            time.sleep(0.5)
            quit()

        def openVleSite(self):
            print("Opening VLE Revision page.")
            time.sleep(0.5)
            webbrowser.open("")
            webbrowser.open("")

        def setupUi(self, titleMain):
            titleMain.setObjectName(_fromUtf8("titleMain"))
            titleMain.resize(300, 470)
            titleMain.setMinimumSize(QtCore.QSize(300, 470))
            titleMain.setMaximumSize(QtCore.QSize(300, 470))
            self.centralwidget = QtGui.QWidget(titleMain)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.mainTitle = QtGui.QLabel(self.centralwidget)
            self.mainTitle.setGeometry(QtCore.QRect(0, 10, 301, 141))
            self.mainTitle.setText(_fromUtf8(""))
            self.mainTitle.setPixmap(QtGui.QPixmap(_fromUtf8("C:\Users\Elliot\Desktop\m\logo1.jpg")))
            self.mainTitle.setAlignment(QtCore.Qt.AlignCenter)
            self.mainTitle.setObjectName(_fromUtf8("mainTitle"))
            self.bottomHorzLine = QtGui.QFrame(self.centralwidget)
            self.bottomHorzLine.setGeometry(QtCore.QRect(0, 150, 301, 16))
            self.bottomHorzLine.setFrameShape(QtGui.QFrame.HLine)
            self.bottomHorzLine.setFrameShadow(QtGui.QFrame.Sunken)
            self.bottomHorzLine.setObjectName(_fromUtf8("bottomHorzLine"))
            self.topHorzLine = QtGui.QFrame(self.centralwidget)
            self.topHorzLine.setGeometry(QtCore.QRect(0, 0, 301, 16))
            self.topHorzLine.setFrameShape(QtGui.QFrame.HLine)
            self.topHorzLine.setFrameShadow(QtGui.QFrame.Sunken)
            self.topHorzLine.setObjectName(_fromUtf8("topHorzLine"))
            self.beginButton = QtGui.QPushButton(self.centralwidget)
            self.beginButton.setGeometry(QtCore.QRect(0, 330, 301, 28))
            self.beginButton.setObjectName(_fromUtf8("beginButton"))
            self.beginButton.clicked.connect(self.openLogin)
            self.vleMedRevButton = QtGui.QPushButton(self.centralwidget)
            self.vleMedRevButton.setGeometry(QtCore.QRect(0, 370, 301, 28))
            self.vleMedRevButton.setObjectName(_fromUtf8("vleMedRevButton"))
            self.vleMedRevButton.clicked.connect(self.openVleSite)
            self.quitButton = QtGui.QPushButton(self.centralwidget)
            self.quitButton.setGeometry(QtCore.QRect(0, 410, 301, 28))
            self.quitButton.setObjectName(_fromUtf8("quitButton"))
            self.quitButton.clicked.connect(self.quitProgram)
            self.secondTitle = QtGui.QLabel(self.centralwidget)
            self.secondTitle.setGeometry(QtCore.QRect(4, 160, 291, 151))
            self.secondTitle.setObjectName(_fromUtf8("secondTitle"))
            self.bottomHorzLine_2 = QtGui.QFrame(self.centralwidget)
            self.bottomHorzLine_2.setGeometry(QtCore.QRect(0, 310, 301, 16))
            self.bottomHorzLine_2.setFrameShape(QtGui.QFrame.HLine)
            self.bottomHorzLine_2.setFrameShadow(QtGui.QFrame.Sunken)
            self.bottomHorzLine_2.setObjectName(_fromUtf8("bottomHorzLine_2"))
            titleMain.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(titleMain)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 26))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            self.menuMenu = QtGui.QMenu(self.menubar)
            self.menuMenu.setObjectName(_fromUtf8("menuMenu"))
            titleMain.setMenuBar(self.menubar)
            self.actionVisit_VLE_Page = QtGui.QAction(titleMain)
            self.actionVisit_VLE_Page.setObjectName(_fromUtf8("actionVisit_VLE_Page"))
            self.actionVisit_VLE_Page.triggered.connect(self.openVleSite)
            self.actionQuit = QtGui.QAction(titleMain)
            self.actionQuit.setObjectName(_fromUtf8("actionQuit"))
            self.actionQuit.triggered.connect(self.quitProgram)
            self.menuMenu.addAction(self.actionVisit_VLE_Page)
            self.menuMenu.addAction(self.actionQuit)
            self.menubar.addAction(self.menuMenu.menuAction())

            self.retranslateUi(titleMain)
            QtCore.QMetaObject.connectSlotsByName(titleMain)

        def retranslateUi(self, titleMain):
            titleMain.setWindowTitle(_translate("titleMain", "Revision Program", None))
            self.beginButton.setText(_translate("titleMain", "Begin / Open menu", None))
            self.vleMedRevButton.setText(_translate("titleMain", "Visit  - Revision Page", None))
            self.quitButton.setText(_translate("titleMain", "Quit Program", None))
            self.secondTitle.setText(_translate("titleMain", "<html><head/><body><p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">  Revision</span></p><p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">Program</span></p><p align=\"center\"><span style=\" font-size:10pt;\">Made with Python.<br/>Made to .</span></p><p align=\"center\"><span style=\" font-size:7pt; font-style:italic;\">Use the menu to choose your option.</span></p></body></html>", None))
            self.menuMenu.setTitle(_translate("titleMain", "Menu", None))
            self.actionVisit_VLE_Page.setText(_translate("titleMain", "Visit VLE Page", None))
            self.actionQuit.setText(_translate("titleMain", "Quit", None))

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    titleMain = QtGui.QMainWindow()
    ui = Ui_titleMain.openUiMain()
    ui.setupUi(titleMain)
    titleMain.show()
    sys.exit(app.exec_())

Upvotes: 1

Views: 5764

Answers (1)

eyllanesc
eyllanesc

Reputation: 244282

Your code is a bit tangled, Qt Designer is used to design the view and it is advisable not to modify them, but to use them as inside another class that handles the logic, and that is what you do. If you want to display a new window of a view designed based on QMainWindow it is necessary to pass a QWidget parent.

In order to display a window from another it is necessary to pass a parent as a parameter. So we create the object, and hide the previous window with hide() and show the new window with show().

def openLogin(self):
        print("Opening Login...")
        self.hide()
        w = loginMainWin(self)
        w.show()

Also as a suggestion: you should not modify the file generated by pyuicx, you must inherit it from the window you used in Qt Designer and pass the design as a parameter.

class TitleMain(QtGui.QMainWindow, openUiMain):

complete code:

from PyQt4 import QtCore, QtGui
from medLogin import *
import webbrowser
import time

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)


class openUiMain(object):
    def setupUi(self, titleMain):
        titleMain.setObjectName(_fromUtf8("titleMain"))
        titleMain.resize(300, 470)
        titleMain.setMinimumSize(QtCore.QSize(300, 470))
        titleMain.setMaximumSize(QtCore.QSize(300, 470))
        self.centralwidget = QtGui.QWidget(titleMain)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.mainTitle = QtGui.QLabel(self.centralwidget)
        self.mainTitle.setGeometry(QtCore.QRect(0, 10, 301, 141))
        self.mainTitle.setText(_fromUtf8(""))
        self.mainTitle.setPixmap(QtGui.QPixmap("logo1.jpg"))
        self.mainTitle.setAlignment(QtCore.Qt.AlignCenter)
        self.mainTitle.setObjectName(_fromUtf8("mainTitle"))
        self.bottomHorzLine = QtGui.QFrame(self.centralwidget)
        self.bottomHorzLine.setGeometry(QtCore.QRect(0, 150, 301, 16))
        self.bottomHorzLine.setFrameShape(QtGui.QFrame.HLine)
        self.bottomHorzLine.setFrameShadow(QtGui.QFrame.Sunken)
        self.bottomHorzLine.setObjectName(_fromUtf8("bottomHorzLine"))
        self.topHorzLine = QtGui.QFrame(self.centralwidget)
        self.topHorzLine.setGeometry(QtCore.QRect(0, 0, 301, 16))
        self.topHorzLine.setFrameShape(QtGui.QFrame.HLine)
        self.topHorzLine.setFrameShadow(QtGui.QFrame.Sunken)
        self.topHorzLine.setObjectName(_fromUtf8("topHorzLine"))
        self.beginButton = QtGui.QPushButton(self.centralwidget)
        self.beginButton.setGeometry(QtCore.QRect(0, 330, 301, 28))
        self.beginButton.setObjectName(_fromUtf8("beginButton"))

        self.vleMedRevButton = QtGui.QPushButton(self.centralwidget)
        self.vleMedRevButton.setGeometry(QtCore.QRect(0, 370, 301, 28))
        self.vleMedRevButton.setObjectName(_fromUtf8("vleMedRevButton"))

        self.quitButton = QtGui.QPushButton(self.centralwidget)
        self.quitButton.setGeometry(QtCore.QRect(0, 410,301, 28))
        self.quitButton.setObjectName(_fromUtf8("quitButton"))

        self.secondTitle = QtGui.QLabel(self.centralwidget)
        self.secondTitle.setGeometry(QtCore.QRect(4, 160, 291, 151))
        self.secondTitle.setObjectName(_fromUtf8("secondTitle"))
        self.bottomHorzLine_2 = QtGui.QFrame(self.centralwidget)
        self.bottomHorzLine_2.setGeometry(QtCore.QRect(0, 310, 301, 16))
        self.bottomHorzLine_2.setFrameShape(QtGui.QFrame.HLine)
        self.bottomHorzLine_2.setFrameShadow(QtGui.QFrame.Sunken)
        self.bottomHorzLine_2.setObjectName(_fromUtf8("bottomHorzLine_2"))
        titleMain.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(titleMain)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 26))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        self.menuMenu = QtGui.QMenu(self.menubar)
        self.menuMenu.setObjectName(_fromUtf8("menuMenu"))
        titleMain.setMenuBar(self.menubar)
        self.actionVisit_VLE_Page = QtGui.QAction(titleMain)
        self.actionVisit_VLE_Page.setObjectName(_fromUtf8("actionVisit_VLE_Page"))
        self.actionVisit_VLE_Page.triggered.connect(self.openVleSite)
        self.actionQuit = QtGui.QAction(titleMain)
        self.actionQuit.setObjectName(_fromUtf8("actionQuit"))
        self.actionQuit.triggered.connect(self.quitProgram)
        self.menuMenu.addAction(self.actionVisit_VLE_Page)
        self.menuMenu.addAction(self.actionQuit)
        self.menubar.addAction(self.menuMenu.menuAction())

        self.retranslateUi(titleMain)
        QtCore.QMetaObject.connectSlotsByName(titleMain)

    def retranslateUi(self, titleMain):
        titleMain.setWindowTitle(_translate("titleMain", "Revision Program", None))
        self.beginButton.setText(_translate("titleMain", "Begin / Open menu", None))
        self.vleMedRevButton.setText(_translate("titleMain", "Visit  - Revision Page", None))
        self.quitButton.setText(_translate("titleMain", "Quit Program", None))
        self.secondTitle.setText(_translate("titleMain", "<html><head/><body><p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">  Revision</span></p><p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">Program</span></p><p align=\"center\"><span style=\" font-size:10pt;\">Made with Python.<br/>Made to .</span></p><p align=\"center\"><span style=\" font-size:7pt; font-style:italic;\">Use the menu to choose your option.</span></p></body></html>", None))
        self.menuMenu.setTitle(_translate("titleMain", "Menu", None))
        self.actionVisit_VLE_Page.setText(_translate("titleMain", "Visit VLE Page", None))
        self.actionQuit.setText(_translate("titleMain", "Quit", None))

class TitleMain(QtGui.QMainWindow, openUiMain):
    def __init__(self, parent=None):
        super(TitleMain, self).__init__(parent=parent)
        self.setupUi(self)
        self.beginButton.clicked.connect(self.openLogin)
        self.vleMedRevButton.clicked.connect(self.openVleSite)
        self.quitButton.clicked.connect(self.quitProgram)

    def openLogin(self):
            print("Opening Login...")
            self.hide()
            w = loginMainWin(self)
            w.show()

    def quitProgram(self):
            print("Program terminating...")
            time.sleep(0.5)
            self.close()

    def openVleSite(self):
            print("Opening VLE Revision page.")
            time.sleep(0.5)
            webbrowser.open("")
            webbrowser.open("")

class loginMainWin(QtGui.QMainWindow, Ui_loginMainWin):
    def __init__(self, parent=None):
        super(loginMainWin, self).__init__(parent=parent)
        self.setupUi(self)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    titleMain = TitleMain()
    titleMain.show()
    sys.exit(app.exec_())

Upvotes: 2

Related Questions