pyside6 主窗口和小部件之间的通信

pyside6 comunication between mainwindow and widget

我有 2 个文件(main、widget1),我需要的是能够在 2 个文件之间进行通信。

编辑: 很抱歉弄得一团糟,我会尝试放置更清晰的代码。

所以我有一个带有 stackedWidget 的主文件(使用 Qt 设计器生成的 Ui 文件)和一个小部件文件(也使用 qt 生成的 Ui 文件)。 我需要的是能够从小部件访问主文件,这样我就可以更改 stackedWidget 的页面。

main.py:

from ui_main import Ui_MainWindow
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.widget1 = W1.Widget1(self)
        self.ui.stackedWidget_1.insertWidget(0, self.widget1)
        self.ui.stackedWidget_1.setCurrentIndex(0)

        def nextpage():
            self.ui.stackedWidget_1.setCurrentIndex(0)

        self.ui.b0.clicked.connect(nextpage)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

widget.py

from PySide6.QtWidgets import *
from ui_widget import Ui_W1
import main
class Widget1(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        self.ui = Ui_W1()
        self.ui.setupUi(self)
        def widget_next_page():
            main.MainWindow().ui.stackedWidget_1.setCurrentIndex(0)
            print('0')

        self.ui.widget_button.clicked.connect(widget_next_page)

感谢您的帮助,我正在尝试了解如何将代码分解成文件,这样主文件就不会变得很大... 如果有更好的方法(不是太复杂,因为你肯定知道我已经开始了。)

widget_next_page 中,您正在创建 MainWindownew 实例,而不是使用现有实例。

OOP 模块化和 Qt signals/slots 背后的整个概念是一个对象应该只发出一个信号,而不是自己对其他对象采取行动,尤其是当它们超出其范围时。

在您的情况下,Widget1 不应尝试更改其父页面(主 window 的堆叠小部件)。

相反,更改堆叠小部件索引的函数应该在主 window 中,并且该函数应该连接到它应该响应的任何信号。由于您已经拥有该功能 (nextpage),因此您可以重复使用它。

class MainWindow(QMainWindow):
    def __init__(self):
        # ...
        self.widget1.ui.widget_button.clicked.connect(nextpage)

以上也就是把Widget1__init__里面的widget_button的信号连接去掉。

注意局部函数只在必要时才使用,尤其是连接信号时,否则在需要时很难断开特定函数,因为引用会丢失当外层函数returns。除此之外,我强烈建议您对对象(特别是 类 和实例)在 OOP 中的一般工作方式以及 Python.

的工作方式进行更多研究