python - 如何在 PyQT 中打开新窗口时关闭窗口?

标签 python pyqt pyqt4 qt-designer

我正在尝试为学校创造一些东西。我正在使用 PyQT 和 QtDesigner。我不知道我不应该编辑 PYUIC4 生成的代码。有没有办法在打开新窗口时关闭窗口? 任何帮助将不胜感激,谢谢:

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_())

最佳答案

您的代码有点困惑,Qt Designer 用于设计 View ,建议不要修改它们,而是将它们用作处理逻辑的另一个类内部,这就是您所做的。如果您想显示基于QMainWindow设计的 View 的新窗口,则需要传递QWidget父级。

为了显示另一个窗口,有必要将父窗口作为参数传递。因此,我们创建该对象,并使用 hide() 隐藏前一个窗口,并使用 show() 显示新窗口。

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

另外建议:您不应修改 pyuicx 生成的文件,您必须从您在 Qt Designer 中使用的窗口继承它,并将设计作为参数。

class TitleMain(QtGui.QMainWindow, openUiMain):

完整代码:

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_())

关于python - 如何在 PyQT 中打开新窗口时关闭窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667578/

相关文章:

python - 在测试期间从 sys.exit() 捕获错误消息

python - QtQuickControls 2.0 与 PyQt5

python - 如何在右键单击 Qdoublespinbox 时向 QtCore.Qt.Default ContextMenu 添加操作?

python - gTTS 可以保存哪些类型的文件?

python - 如何将按钮添加到 QTreeView 行

python - 从 Qt Designer 和 PyQt 开始

python - Pandas join() 有效,但 concat() 失败

python - 如何在 python 中编写没有任何定界符的文本文件?

python - 如何在 python 中相等和/或比较保存字符串的四个不同变量

python - 为什么在 PyQt 中使用信号和槽?