经常将QStackedWidget和QListWidget或者QListView搭配使用

1 import sys
2 from PyQt5.QtWidgets import QApplication, QWidget, QStackedWidget, QLabel, QLineEdit, QDateEdit, \
3 QComboBox, QTextEdit, QListWidget, QGridLayout, QHBoxLayout
4
5 class Demo(QWidget):
6 def __init__(self):
7 super(Demo, self).__init__()
8 self.stack1 = QWidget() #实例化一个窗口
9 self.stack2 = QWidget()
10 self.stack3 = QTextEdit()
11
12 self.stack1_init()
13 self.stack2_init()
14
15 self.stacked_widget = QStackedWidget(self) # 创建一个堆叠窗口【虚拟窗口】
16 self.stacked_widget.addWidget(self.stack1) #给堆叠窗口添加子窗口或子控件
17 self.stacked_widget.addWidget(self.stack2)
18 self.stacked_widget.addWidget(self.stack3)
19 self.stacked_widget.currentChanged.connect(lambda: print(self.stacked_widget.currentIndex()))
20 #堆叠窗口发生变化时,都会触发信号
21 #self.stacked_widget.currentIndex()返回堆叠窗口序列号
22
23 self.list_widget = QListWidget(self) #创建列表控件--用来放标签项
24 self.list_widget.addItem('Basic Info') #在列表控件中添加标签项。参数:标签显示文本
25 self.list_widget.addItem('Contact Info')
26 self.list_widget.addItem('More Info')
27 self.list_widget.clicked.connect(self.change_func) #单击列表控件时触发信号
28
29 self.h_layout = QHBoxLayout()
30 self.h_layout.addWidget(self.list_widget)
31 self.h_layout.addWidget(self.stacked_widget)
32
33 self.setLayout(self.h_layout)
34
35 def stack1_init(self):
36 name_label = QLabel('姓名:', self.stack1)
37 gender_label = QLabel('性别:', self.stack1)
38 bd_label = QLabel('出生日期:', self.stack1)
39
40 name_line = QLineEdit(self.stack1)
41 items = ['请选择性别', '男', '女']
42 gender_combo = QComboBox(self.stack1)
43 gender_combo.addItems(items)
44 bd_dateedit = QDateEdit(self.stack1)
45
46 g_layout = QGridLayout()
47 g_layout.addWidget(name_label, 0, 0, 1, 1)
48 g_layout.addWidget(name_line, 0, 1, 1, 1)
49 g_layout.addWidget(gender_label, 2, 0, 1, 1)
50 g_layout.addWidget(gender_combo, 2, 1, 1, 1)
51 g_layout.addWidget(bd_label, 3, 0, 1, 1)
52 g_layout.addWidget(bd_dateedit, 3, 1, 1, 1)
53
54 self.stack1.setLayout(g_layout)
55
56 def stack2_init(self):
57 tel_label = QLabel('Tel:', self.stack2)
58 mobile_label = QLabel('Mobile:', self.stack2)
59 add_label = QLabel('Address:', self.stack2)
60
61 tel_line = QLineEdit(self.stack2)
62 mobile_line = QLineEdit(self.stack2)
63 add_line = QLineEdit(self.stack2)
64
65 g_layout = QGridLayout()
66 g_layout.addWidget(tel_label, 0, 0, 1, 1)
67 g_layout.addWidget(tel_line, 0, 1, 1, 1)
68 g_layout.addWidget(mobile_label, 1, 0, 1, 1)
69 g_layout.addWidget(mobile_line, 1, 1, 1, 1)
70 g_layout.addWidget(add_label, 2, 0, 1, 1)
71 g_layout.addWidget(add_line, 2, 1, 1, 1)
72
73 self.stack2.setLayout(g_layout)
74
75 def change_func(self):
76 self.stacked_widget.setCurrentIndex(self.list_widget.currentIndex().row())
77 #设置堆叠窗口显示指定索引的窗口
78 #self.list_widget.currentIndex().row() 返回当前列表选中项的索引号
79
80 if __name__ == '__main__':
81 app = QApplication(sys.argv)
82 demo = Demo()
83 demo.show()
84 sys.exit(app.exec_())

样式:

堆叠窗口QStackedWidget_控件