预期功能:
界面上有一个按钮,点击之后,能够在界面上添加一个控件组,控件组内包括:label,LineEdit,ToolButton等,能多次添加,并且能获取控件上的数据。
界面设计:(在QT Designer中实现)
新建一个GroupBox和Layout,将Layout拖入GroupBox,再将GroupBox设置为垂直布局,因为在QT Designer中GroupBox只有内部有元素了才可以设置是水平布局还是垂直布局。
再添加一个“添加”按钮,就得到如下界面:
程序编写:
控件添加
每一个控件组需要用一个单独的子Layout来承载。
所以可以通过计算GroupBox中Layout下的子layout数量来对动态添加的控件进行命名。
# 初始化全局命名空间
names = globals()
# 获取YanshiLayout中子Layout的数量
count = self.YanshisLayout.count()
# 新建一个水平布局的子Layout
self.names["Yanshi_layout_{}".format(count+1)] = QHBoxLayout(self)
# 将新建的Layout添加到UI已有YanshiLayout中
self.YanshisLayout.addLayout(self.names["Yanshi_layout_{}".format(count+1)])
此处对于新建Layout的命名,通过全局命名空间来实现,下面的动态控件命名也是如此。
def Yanshis_add(self):
# 在新建的Layout中动态地添加控件
self.names["Yanshi_label_{}".format(count+1)] = QLabel("Yanshi{}:".format(count+1))
self.names["Yanshi_lineEdit_{}".format(count+1)] = QLineEdit(self)
self.names["Yanshi_Button_{}".format(count+1)] = QToolButton(self)
绑定按钮函数
self.Yanshis_add.clicked.connect(self.Yanshi_add)
此处注意:按钮的对象名和绑定的函数名不能一样,不然会报错。
控件删除
因为是通过Layout数量来实现规范命名的,那么删除同样是通过循环Layout实现。
# 首先判断目前layout中有多少个子layout以此来判断添加了多少个控件组
for i in range(self.YanshisLayout.count()):
# 循环判断子layout中有多少个控件
for j in range(self.YanshisLayout.itemAt(i).count()):
# 挨个删除控件
self.YanshisLayout.itemAt(i).itemAt(j).widget().deleteLater()
# 然后删除该子layout
self.YanshisLayout.itemAt(i).deleteLater()
控件数据获取
举例的控件组中包含三个控件,其中标签控件和按钮控件都不需要数据读取,只有LineEdit需要读取。循环Layout进行读取。
# 读取Yanshi列表
def Yanshi_read(self):
# 新建字体列表
Yanshi_list = []
for i in range(self.YanshisLayout.count()):
Yanshi_list.append(self.names["Yanshi_lineEdit_{}".format(i+1)].text())
return Yanshi_list