使用QStackedWidget更改屏幕时,如何在更改的屏幕中调用函数



我正在尝试调用屏幕的init函数,我正在将屏幕索引更改为

举个例子,我有这样的代码:

from PyQt5 import QtWidgets   as qtw
from PyQt5 import QtGui       as qtg
from sys   import argv        as sysArgv
from sys   import exit        as sysExit
arialLarge = qtg.QFont("Arial", 18)
class MainWindow(qtw.QWidget):
def __init__(self):
super().__init__()
# Current screen label;
mainWindowLabel = qtw.QLabel("This is the main window", self)
mainWindowLabel.setFont(arialLarge)
mainWindowLabel.move(20, 40)
# Button for going to the HelloWindow screen;
gotoHelloWindowButton = qtw.QPushButton("Go to hello window", self, clicked=lambda: appStack.setCurrentIndex(appStack.currentIndex()+1))
gotoHelloWindowButton.move(100, 100)

class HelloWindow(qtw.QWidget):
def __init__(self):
super().__init__()
# EG: print hello world when I visit this page
print("hello world")

# Current screen label;
helloWindowLabel = qtw.QLabel("This is the hello window", self)
helloWindowLabel.setFont(arialLarge)
helloWindowLabel.move(20, 40)
# Button for going to the MainWindow screen;
gotoMainWindowButton = qtw.QPushButton("Go to main window", self, clicked=lambda: appStack.setCurrentIndex(appStack.currentIndex()-1))
gotoMainWindowButton.move(100, 100)

if __name__ == "__main__":
app = qtw.QApplication(sysArgv)
appStack = qtw.QStackedWidget()
appStack.addWidget(MainWindow())
appStack.setFixedSize(300, 300)
appStack.show()
appStack.addWidget(HelloWindow())
sysExit(app.exec())

如果我从MainWindow访问HelloWindow,我如何运行HelloWindow屏幕的init函数,以便在其中运行我想要的任何代码?

我需要能够像在我工作的应用程序上一样做到这一点,就像在主页上一样。我已经动态创建了按钮,这些按钮都有不同索引的功能参数,我需要能够根据点击按钮的数据索引从服务器获取数据,这样我就可以在另一个页面上查看所需的数据。

python类的__init__是在创建实例(使用SomeClass()(时调用的,因此您不应该尝试(甚至思考(再次调用它,因为它可能会产生难以跟踪的严重问题和错误。

我强烈建议您阅读Python中关于类的文档,因为在面向对象编程中不能忽略这一方面。

如果每次索引更改时都需要调用一些东西,那么您应该更好地将QStackedWidget子类化,并从那里控制所有内容。

一个好的解决方案是创建一个标准化的函数,每当页面出现时都会调用该函数,并确保堆栈小部件正确地调用它

class FirstPage(QtWidgets.QWidget):
def __init__(self):
super().__init__(self)
# ...
self.nextButton = QtWidgets.QPushButton('Next')
self.doSomething()
def doSomething(self):
...

class SecondPage(QtWidgets.QWidget):
def __init__(self):
super().__init__(self)
# ...
self.prevButton = QtWidgets.QPushButton('Previous')
self.doSomething()
def doSomething(self):
...

class Stack(QtWidgets.QStackedWidget):
def __init__(self):
super().__init__(self)
self.first = FirstPage()
self.first.nextButton.clicked.connect(self.goNext)
self.addWidget(self.first)
self.second = SecondPage()
self.second.prevButton.clicked.connect(self.goPrev)
self.currentChanged.connect(self.initCurrent)
def goNext(self):
self.setCurrentIndex(1)
def goPrev(self):
self.setCurrentIndex(0)
def initCurrent()
if self.currentWidget():
self.currentWidget().doSomething()

if __name__ == "__main__":
app = qtw.QApplication(sysArgv)
appStack = Stack()
appStack.setFixedSize(300, 300)
appStack.show()
sysExit(app.exec())

请注意,将QMainWindow添加到父窗口不是一个好主意,因为Qt主窗口旨在用作顶级窗口;还要注意,使用固定的几何图形(位置和大小(通常被认为是不好的做法,应该使用布局管理器

相关内容

  • 没有找到相关文章

最新更新