首页 > 解决方案 > pyqt5 使用 clicked.connect 加载小部件是否有限制?

问题描述

我正在使用QPushButton加载用户界面。First -> Jumin -> Department -> next -> next我想按顺序创建 UI。问题是我无法将第三个部门加载到 QMainwindow 窗口中。我不知道为什么

当您在其中创建一个小部件时QVBoxLayout,它会根据墙纸之类的方式更改小部件的大小wxpython layout (wx.all)。不能通过自动定心来改变position (move)和吗?size (resize)

import sys
from PyQt5.QtWidgets import *
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.center_widget = QWidget()
        self.setCentralWidget(self.center_widget)
        self.FirstUI()

    def FirstUI(self):
        self.btn1 = QPushButton('test1', self)
        self.btn1.move(50, 50)
        self.btn1.clicked.connect(self.btn1_click)

    def JuminUI(self):
        self.ju1 = QLineEdit('13')
        self.btn2 = QPushButton('^^^^^^^^^^')
        self.ju_text = QLabel('asd')
        self.jumim_layout = QVBoxLayout()
        self.jumim_layout.addWidget(self.ju_text)
        self.jumim_layout.addWidget(self.ju1)
        self.jumim_layout.addWidget(self.btn2)
        self.centralWidget().setLayout(self.jumim_layout)
        self.btn2.clicked.connect(self.btn2_click)

    def DepartmentUI(self):
        self.depart_layout = QVBoxLayout()
        self.depart_layout.addWidget(QPushButton('sdfsdf'))
        self.centralWidget().setLayout(self.depart_layout)

    def btn1_click(self):
        self.btn1.deleteLater()
        self.JuminUI()

    def btn2_click(self):
        self.ju1.deleteLater()
        self.btn2.deleteLater()
        self.ju_text.deleteLater()
        self.DepartmentUI()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    fream = MainWindow()
    fream.show()
    app.exec_()

标签: pythonpython-3.xpyqtpyqt5

解决方案


创建和删除小部件几乎总是一个坏主意,并且您的代码陷入了那些坏主意,最好隐藏小部件,为此您应该QStackedWidget使用QStackedWidget通过更改分配currentIndex

import sys
from functools import partial
from PyQt5 import QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.center_widget = QtWidgets.QStackedWidget()
        self.setCentralWidget(self.center_widget)
        self.FirstUI()
        self.JuminUI()
        self.DepartmentUI()

    def FirstUI(self):
        widget = QtWidgets.QWidget()
        self.btn1 = QtWidgets.QPushButton('test1', widget)
        self.btn1.move(50, 50)

        self.center_widget.addWidget(widget)
        self.btn1.clicked.connect(partial(self.center_widget.setCurrentIndex, 1))

    def JuminUI(self):
        widget = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(widget)

        self.ju1 = QtWidgets.QLineEdit('13')
        self.btn2 = QtWidgets.QPushButton('^^^^^^^^^^')
        self.ju_text = QtWidgets.QLabel('asd')

        lay.addWidget(self.ju_text)
        lay.addWidget(self.ju1)
        lay.addWidget(self.btn2)

        self.center_widget.addWidget(widget)
        self.btn2.clicked.connect(partial(self.center_widget.setCurrentIndex, 2))

    def DepartmentUI(self):
        widget = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(widget)
        lay.addWidget(QtWidgets.QPushButton('sdfsdf'))

        self.center_widget.addWidget(widget)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    fream = MainWindow()
    fream.show()
    sys.exit(app.exec_())

推荐阅读