我目前在 Pyside2 中有一個應用程式,檔案結構如下:
檔案:
螢屏1.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
螢屏2.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
主.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 上通過單擊按鈕在螢屏 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())
uj5u.com熱心網友回復:
您收到錯誤的原因是因為win2不知道是什么win1。
您可以在第二個視窗上創建一個可以由其按鈕觸發的信號,并且信號視窗 1 可以偵聽信號并在按下它時創建堆疊的小部件。
例如:
主檔案
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")
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/487704.html
