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
中,您正在创建 MainWindow
的 new 实例,而不是使用现有实例。
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.
的工作方式进行更多研究
我有 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
中,您正在创建 MainWindow
的 new 实例,而不是使用现有实例。
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.
的工作方式进行更多研究