如何使用pyqt4从第二个mainwindowclass调用第一个mainwindowclass

How to call the first main window class from the second mainwindow class uisng pyqt4

这是我的例子 我想从第二个 window 调用我的第一个 window class.when 我在第二个 window 中单击后退按钮 我的主 window 来 front.But 我不知道要打电话给第一个 window。

下面是我的例子:

import sys
from PyQt4.QtCore    import *
from PyQt4.QtGui     import *

class Window(QMainWindow):
    def __init__(self):
        super(Window,self).__init__()
        self.setWindowTitle("TeahcherPortal")
        self.setGeometry(50,50,800,600)

        self.FirstWindow()

    def FirstWindow(self):
        btn = QPushButton("Login", self)
        btn.clicked.connect(self.secondPage)    # - (SecondPage())
        btn.move(400,300)

        self.showFullScreen()

    def secondPage(self):
        self.secondWindow = SecondPage()
        self.secondWindow.showFullScreen()

class SecondPage(QMainWindow,Window):#how to inheritence the main window properties
    def __init__(self,parent=None):
        super(SecondPage,self).__init__(parent)
        self.setWindowTitle("SecondPage")
        self.secondwindow()
        self.showFullScreen()

    def secondwindow(self):
        btn = QPushButton("back", self)
        btn.clicked.connect(self.FirstWindow)    # - (SecondPage())
        btn.move(400,300)
    def FirstWindow(self):
        print "here i want to call the first window login button"


def run():
    app = QApplication(sys.argv)
    GUI = Window()
    sys.exit(app.exec_())

run()

如果你想引用其他对象,最好有一个 "main" 对象来收集它们并使用它在它们之间进行交互。
此外,最好避免使用多个 QMainWindows,除非您真的 需要 QMainWindow 具有的所有功能,如工具栏、停靠小部件、状态栏、菜单等。最后两个可以添加无论如何使用布局。
请记住,您甚至可以使用单个 window 并使用 QTabWidget,或者更好的是 QStackedWidget,这将帮助您 "centralize" 在单个界面中全部使用,而无需多个 window classes。另一种可能是使用QWizard,但它的界面有点复杂。

就是说,您不能从 class 声明中引用其他实例,使用它也不是一个好习惯,至少对于您来说是这样。

在这个例子中,我子classing QApplication 将其用作所有页面之间交互的"parent controller"。这只是 一种 的实现方式,但是当您实际上没有一个独特的 "main" window 时,这是一种很好的实现方式。当然,您可以使用任何其他对象,只要您在所有 widgets/windows.

中都具有唯一引用即可
from PyQt4 import QtCore, QtGui

class MyApplication(QtGui.QApplication):
    def __init__(self, *args, **kwargs):
        super(MyApplication, self).__init__(*args, **kwargs)
        self.windows = []
        self.currentIndex = 0

    def addWindow(self, newWindow):
        if self.windows:
            # enable next button of the last window, if one exists...
            self.windows[-1].nextButton.setEnabled(True)
            # and enable the back button of the new one
            newWindow.backButton.setEnabled(True)
        self.windows.append(newWindow)
        newWindow.goBack.connect(self.goBack)
        newWindow.goNext.connect(self.goNext)
        if len(self.windows) == 1:
            self.windows[-1].show()

    def goBack(self):
        self.goToWindow(self.currentIndex - 1)

    def goToWindow(self, index):
        # ensure that the index is between the range
        if not 0 <= index <= len(self.windows) - 1:
            return
        # hide the current window, set the new index and show the new one
        self.windows[self.currentIndex].hide()
        self.currentIndex = index
        self.windows[self.currentIndex].show()

    def goNext(self):
        self.goToWindow(self.currentIndex + 1)

class BaseWindow(QtGui.QWidget):
    goBack = QtCore.pyqtSignal()
    goNext = QtCore.pyqtSignal()

    def __init__(self, title):
        super(BaseWindow, self).__init__()
        self.setWindowTitle(title)
        mainLayout = QtGui.QVBoxLayout()
        self.setLayout(mainLayout)

        # create a layout for the actual contents of the window
        self.widgetLayout = QtGui.QGridLayout()
        mainLayout.addLayout(self.widgetLayout)

        # add a layout for the buttons, placing it at the bottom
        buttonLayout = QtGui.QHBoxLayout()
        mainLayout.addLayout(buttonLayout)

        # the navigation buttons are disabled by default (see above)
        self.backButton = QtGui.QPushButton('Back')
        buttonLayout.addWidget(self.backButton)
        self.backButton.setEnabled(False)
        self.backButton.clicked.connect(self.goBack)

        self.nextButton = QtGui.QPushButton('Next')
        buttonLayout.addWidget(self.nextButton)
        self.nextButton.setEnabled(False)
        self.nextButton.clicked.connect(self.goNext)

class LoginPage(BaseWindow):
    def __init__(self):
        super(LoginPage, self).__init__('Login')
        # add widgets to the "BaseWindow" inherited class' widgetLayout
        self.userEdit = QtGui.QLineEdit()
        self.widgetLayout.addWidget(self.userEdit)
        self.passwordEdit = QtGui.QLineEdit()
        self.widgetLayout.addWidget(self.passwordEdit)

class SecondPage(BaseWindow):
    def __init__(self):
        super(SecondPage, self).__init__('Second page')
        self.widgetLayout.addWidget(QtGui.QLabel('Hello!'))


if __name__ == '__main__':
    import sys
    app = MyApplication(sys.argv)

    loginPage = LoginPage()
    app.addWindow(loginPage)

    secondPage = SecondPage()
    app.addWindow(secondPage)
    sys.exit(app.exec_())