如何在 Pyqt5 setcentralWidget 中取回我的主窗口? [复制]

2023-12-02

如何取回我的主窗口? 从我的主窗口。如果我按“打开左边的盒子”按钮或“打开右边的盒子”按钮,它起作用了,同时,如果我按下"Back"从左框按钮,什么也不会发生。如何获取主窗口? (简单来说,我想知道如何设置布局和删除布局setcentral 小部件)

import sys,os

from PyQt5.QtGui import  *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *


class Class_MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Main Window")
        self.initUI()

    def initUI(self):
        self.widgets()
        self.layouts()

    def widgets(self):
        self.Masterbtn = QPushButton("Master")
        self.transbtn  = QPushButton("tanscation")
        self.reportbtn = QPushButton("Reports")

        self.masterlbl = QLabel("Master Label")
        self.translbl = QLabel("transcation label")
        self.reportlbl = QLabel("Report Label")

        self.leftboxbtn = QPushButton("Open Left Box")
        self.leftboxbtn.clicked.connect(self.leftboxopn)
        self.rightboxbtn = QPushButton("Open Right Box")
        self.rightboxbtn.clicked.connect(self.rightboxopn)

        self.backbtn =QPushButton("Back")
        self.backbtn.clicked.connect(self.mainwindow)

    def layouts(self):
        self.mainbox = QVBoxLayout()
        self.mainbox.addWidget(self.leftboxbtn)
        self.mainbox.addWidget(self.rightboxbtn)


        self.leftbox = QVBoxLayout()
        self.leftbox.addWidget(self.Masterbtn)
        self.leftbox.addWidget(self.transbtn)
        self.leftbox.addWidget(self.reportbtn)
        self.leftbox.addWidget(self.backbtn)

        self.rightbox = QVBoxLayout()
        self.rightbox.addWidget(self.masterlbl)
        self.rightbox.addWidget(self.translbl)
        self.rightbox.addWidget(self.reportlbl)
        # self.rightbox.addWidget(self.backbtn)

        widget = QWidget()
        widget.setLayout(self.mainbox)
        self.setCentralWidget(widget)

    def leftboxopn(self):
        self.setWindowTitle("Left Box ")
        widget = QWidget()
        widget.setLayout(self.leftbox)
        self.setCentralWidget(widget)

    def rightboxopn(self):
        self.setWindowTitle("Right Box")
        widget = QWidget()
        widget.setLayout(self.rightbox)
        self.setCentralWidget(widget)

    def mainwindow(self):
        self.setWindowTitle("Main Window")
        widget = QWidget()
        widget.setLayout(self.mainbox)
        self.setCentralWidget(widget)

def main():
    app = QApplication(sys.argv)
    mainwindow = Class_MainWindow()
    mainwindow.show()
    sys.exit(app.exec_())

if __name__ =="__main__":
    main()

你无法“取回”任何东西,因为每次你使用setCentralWidget() the existing小部件被删除,因为文档解释:

注意:QMainWindow 获得小部件指针的所有权并在适当的时间将其删除。

你打电话时setCentralWidget()在另一个小部件上,前一个是完全删除,包括它的所有子项。当一个 Qt 对象被删除时,它的所有子对象也随之被删除,结果是self.mainbox您在开始时创建的内容不再存在(python对象存在,但请记住 PyQt 对象只是一个参考到实际的 Qt 对象:如果 Qt 需要,可以删除 Qt 对象,即使 python 引用仍然存在)。

实质上(并且在任何情况下),您不应该每次都更换中央小部件,而是使用paged像QStackedWidget这样的widget作为中心widget,然后使用其功能切换到其他界面:setCurrentIndex() or setCurrentWidget().

为了正确使用它,所有子部件必须添加到 QWidget 容器中,然后将其作为单独的“页面”添加到 QStackedWidget 中:

class Class_MainWindow(QMainWindow):
    # ...
    def layouts(self):
        self.mainContainer = QWidget()
        self.mainbox = QVBoxLayout(self.mainContainer)
        self.mainbox.addWidget(self.leftboxbtn)
        self.mainbox.addWidget(self.rightboxbtn)


        self.leftContainer = QWidget()
        self.leftbox = QVBoxLayout(self.leftContainer)
        self.leftbox.addWidget(self.Masterbtn)
        self.leftbox.addWidget(self.transbtn)
        self.leftbox.addWidget(self.reportbtn)
        self.leftbox.addWidget(self.backbtn)

        self.rightContainer = QWidget()
        self.rightbox = QVBoxLayout(self.rightContainer)
        self.rightbox.addWidget(self.masterlbl)
        self.rightbox.addWidget(self.translbl)
        self.rightbox.addWidget(self.reportlbl)
        # self.rightbox.addWidget(self.backbtn)

        self.stackedWidget = QStackedWidget()
        self.setCentralWidget(self.stackedWidget)
        self.stackedWidget.addWidget(self.mainContainer)
        self.stackedWidget.addWidget(self.leftContainer)
        self.stackedWidget.addWidget(self.rightContainer)

    def leftboxopn(self):
        self.setWindowTitle("Left Box ")
        self.stackedWidget.setCurrentWidget(self.leftContainer)

    def rightboxopn(self):
        self.setWindowTitle("Right Box")
        self.stackedWidget.setCurrentWidget(self.rightContainer)

    def mainwindow(self):
        self.setWindowTitle("Main Window")
        self.stackedWidget.setCurrentWidget(self.mainContainer)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Pyqt5 setcentralWidget 中取回我的主窗口? [复制] 的相关文章

随机推荐