如何在 Pyqt5 setcentralWidget 中取回我的主窗口?

库马尔

如何取回我的 MainWindow ?从我的主窗口。如果我按“打开左框”按钮或“打开右框”按钮,它会起作用,同时,如果我从左框中“后退”按钮,什么都不会发生。如何获取主窗口?(简单地说,我想知道如何在setcentral Widgets 中设置布局和删除布局

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()现有的小部件被删除,因为文档解释

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

当您调用setCentralWidget()另一个小部件时,前一个小部件将被完全删除,包括其所有子部件。当一个Qt对象被删除,所有子对象被与它一起删除,结果是self.mainbox你在创建之初不存在了(在蟒蛇对象存在,但要记住,PyQt的对象只是一个参考,以实际的 Qt 对象:如果 Qt 需要,可以删除 Qt 对象,即使 python 引用仍然存在)。

实际上(并且,无论如何),您不应该每次都替换中央小部件,而是使用像 QStackedWidget 这样分页小部件作为中央小部件,然后使用其功能切换到其他界面:setCurrentIndex()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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章