我目前在 Pyside2 中有一个应用程序,文件结构如下所示:
文件:
screen1.py
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(368, 275)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.pushButton = QPushButton(self.centralwidget)
self.pushButton.setObjectName(u"pushButton")
self.verticalLayout.addWidget(self.pushButton)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 368, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Go to screen 2 and create widget", None))
# retranslateUi
screen2.py:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(348, 227)
self.add_widget = QPushButton(Form)
self.add_widget.setObjectName(u"add_widget")
self.add_widget.setGeometry(QRect(9, 120, 174, 23))
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.add_widget.setText(QCoreApplication.translate("Form", u"create stackerdwidget on screen 1", None))
# retranslateUi
main.py:
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2 import QtWidgets
from screen1 import Ui_MainWindow
from screen2 import Ui_Form
import sys
class win2(QtWidgets.QMainWindow, Ui_Form):
def __init__(self):
super(win2, self).__init__()
self.setupUi(self)
self.add_widget.clicked.connect(lambda:win1.creat_stackedwidget(self))
class win1(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(win1, self).__init__()
self.setupUi(self)
self.show()
self.pushButton.clicked.connect(self.open_win2)
def open_win2(self):
self.tela2 = win2()
self.tela2.show()
def creat_stackedwidget(self):
print("here")
self.stackedWidget = QStackedWidget(self.centralwidget)
self.stackedWidget.setObjectName(u"stackedWidget")
self.stackedWidget.setStyleSheet(u"background-color: rgb(0, 0, 0);")
self.page = QWidget()
self.page.setObjectName(u"page")
self.stackedWidget.addWidget(self.page)
self.page_2 = QWidget()
self.page_2.setObjectName(u"page_2")
self.stackedWidget.addWidget(self.page_2)
self.verticalLayout.addWidget(self.stackedWidget)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainWin = win1()
ret = app.exec_()
sys.exit()
主要问题是如何从屏幕 2 调用函数 creat_stackedwidget 以便在 screen1 上执行并创建 stackedwidget ,而不给出错误:
“ AttributeError: 'win2' object has no attribute 'centralwidget''”
在本例中,当单击按钮在屏幕 2 上执行该函数时,该函数将在屏幕 1 内创建一个 stackedWidget。 注意:如果我在 main.py 的屏幕类 1 中定义 creat_stackedwidget,它会正常创建 stackedwidget。
class win1(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(win1, self).__init__()
self.setupUi(self)
self.show()
self.pushButton.clicked.connect(lambda:self.creat_stackedwidget())
最佳答案
您收到错误的原因是 win2
不知道 win1
是什么。
您可以在第二个窗口上创建一个信号,该信号可以通过其按钮触发,并且信号窗口 1 可以监听该信号并在按下该信号时创建堆叠小部件。
例如:
main.py
class win2(QtWidgets.QMainWindow, Ui_Form):
stackSignal = Signal() # added this
def __init__(self):
super(win2, self).__init__()
self.setupUi(self)
self.add_widget.clicked.connect(lambda: self.stackSignal.emit()) # changed this
class win1(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(win1, self).__init__()
self.setupUi(self)
self.show()
self.pushButton.clicked.connect(self.open_win2)
def open_win2(self):
self.tela2 = win2()
self.tela2.stackSignal.connect(self.creat_stackedwidget) # added this
self.tela2.show()
def creat_stackedwidget(self):
print("here")
self.stackedWidget = QStackedWidget(self.centralwidget)
self.stackedWidget.setObjectName(u"stackedWidget")
...
关于python - 在另一个 Pyside/Pyqt 屏幕上调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72510828/