如何使用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_())
这是我的例子 我想从第二个 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_())