python - 在另一个 Pyside/Pyqt 屏幕上调用函数

标签 python qt pyqt attributes pyside

我目前在 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/

相关文章:

python - 使用 SMOTE 库在 Python 中平衡数据

python - 处理来自 IOS 设备的请求时发生异常

qt - Autodesk Maya 模型面板调整大小事件

python - 我可以覆盖 QListWidgetItem 的 __lt__ 比较器的输入吗? (PyQt)

c++ - C++ 中的 PyQt 自定义小部件

python - 列中缺少/NaT 值时如何转换日期格式

python - 使用由数组列表组成的数据文件在 Python 中制作点图

c++ - Windows 中的 Qt Creator - 我如何知道正在使用哪个编译器?

c++ - 在 QMainWindow 中创建 Widget 并加载到 ScrollArea

c++ - 打开文件有问题