python - 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_()
解决方案
创建和删除小部件几乎总是一个坏主意,并且您的代码陷入了那些坏主意,最好隐藏小部件,为此您应该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_())
推荐阅读
- c# - 即使我强制用户刷新页面,是否有任何方法可以使用 C# 更改键盘布局(英语 - 阿拉伯语)?
- android - 发现两个 getter 或属性的区分大小写冲突的字段,一旦 minifyEnabled 为 True
- angular - Ngrx 选择器未定义的 EntityAdapter
- typescript - TypeScript:typeof 泛型类型函数,无需解析为任何或未知
- vba - VBA IsMissing 返回错误的缺失参数
- java - 使用 LambdaMetaFactory 暴露 getter 导致类转换异常
- javascript - componentDidUpdate 在多个屏幕上获取触发器
- c++ - 显示错误的输出
- reactjs - React Hooks 创建失败:类型错误对象(...)不是函数
- reactjs - 如何将 useLocation() 与 useSelector() 结合使用?