代码之家  ›  专栏  ›  技术社区  ›  Zeb

在QMainWindow中,使用python中的pyqt4调用另一个QMainWindow?

  •  0
  • Zeb  · 技术社区  · 11 年前

    我使用python2.7版本,并使用pyqt4在python中进行GUI编程。我想从 Ui_MainWindow1 Ui_MainWindow2 。这里是代码:

    类Ui_MainWindow1

    class Ui_MainWindow1(object):
        def setupUi(self, MainWindow):
            ...
            ...
            self.pushButton = QtGui.QPushButton(self.centralwidget)
            self.pushButton.setGeometry(QtCore.QRect(70, 90, 181, 27))
            self.pushButton.setObjectName(_fromUtf8("pushButton"))
            MainWindow.setCentralWidget(self.centralwidget)
            ...
            QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"),self.callSecondWindow)
        def callSecondWindow(self):
            MainWindow2 = QtGui.QMainWindow()
            ui = Ui_MainWindow2()
            ui.setupUi(MainWindow2)
            MainWindow2.show()
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow1()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    Ui_Main窗口2

    class Ui_MainWindow2(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(336, 277)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.label = QtGui.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(110, 70, 131, 51))
            font = QtGui.QFont()
            ...
            ...
    

    当我点击 pushButton 在里面 Ui_主窗口1 。它没有显示另一个GUI( Ui_Main窗口2 )并且没有给出任何错误。

    如何解决这个问题?需要帮助!

    1 回复  |  直到 11 年前
        1
  •  1
  •   BoshWash    11 年前

    那看起来很乱。这是一种更常见的方式来编写这样的内容:

    from PyQt4 import QtGui
    from PyQt4.uic.properties import QtCore
    
    class MainWindow1(QtGui.QMainWindow):
        def __init__(self, *args, **kwargs):
            super(MainWindow1, self).__init__(*args, **kwargs)
    
            self.pushButton = QtGui.QPushButton('pushButton')
            self.pushButton.released.connect(self.callSecondWindow)
            self.mainWindow2 = MainWindow2()
    
            self.setCentralWidget(self.pushButton)
    
        def callSecondWindow(self):
            self.mainWindow2.show()
    
    class MainWindow2(QtGui.QMainWindow):
        def __init__(self, *args, **kwargs):
            super(MainWindow2, self).__init__(*args, **kwargs)
            self.resize(336, 227)
            self.setObjectName('centralwidget')
            self.label = QtGui.QLabel()
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        mainWindow = MainWindow1()
        mainWindow.show()
        sys.exit(app.exec_())
    

    几点注意事项

    • 不需要 setupUi python已经具有的函数 __init__ 为此

    • Signal语法: QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"),self.callSecondWindow)

    • 已替换为更可读的: self.pushButton.released.connect(self.callSecondWindow)

    • 通常没有理由持有 QMainWindow 在一个额外的对象中,直接将其子类化

    • 大多数人对变量使用小写名称,对类使用大写名称,这只是一种惯例,但它使代码对其他人更可读