使用 PyQt 快速搭建带有 GUI 的应用(6)–动态添加组件

王 茂南 2021年5月6日07:45:08
评论
2895字阅读9分39秒
摘要本文会介绍一个动态增加组件的 PyQt 的例子。通过点击按钮,向应用中动态的增加 QLabel 和 QLineEdit。

简介

在使用 PyQt 制作应用的时候,有时我们需要动态的在其中增加组件。本文就是一个简单的例子,说明如何在一个应用中增加组件,并修改组件的内容。

首先说一下简单的原理:

  • 我们就是向例如 .formLayout 的布局中添加 Widget 来实现动态添加组件的。
  • 对于添加的组件,我们可以放在一个 tuple 中,这样就可以使用 loop 来向里面进行添加。
  • 使用的时候指需要指定 index,就可以获取我们需要的组件了。

整个过程其实是非常简单的,下面我们看一个例子,强化一下上面的内容。

 

PyQt 动态添加组件例子

使用 QtDesigner 设计主界面

首先我们使用 QtDesigner 做一个非常简单的界面。主要分为上下两个部分。

  • 上面是一个 QFormatLayout,这个后面会在里面动态的添加 QLabelQLineEdit
  • 下面是两个按钮,左侧的按钮点击后动态添加组件,右侧的按钮点击后打印出组件中的 text。

下图是主界面的样子,和里面类的组成(可以照着做一下):

使用 PyQt 快速搭建带有 GUI 的应用(6)–动态添加组件

 

完成主要功能

在完成了界面之后,下面就是要完成相应的功能了。我们主要是要实现两个功能:

  • 点击 Add Row 这个按钮,可以在QFormatLayout添加不同的 QLineEdit
  • 点击 Print Text 这个按钮,打印出上面 QLineEdit 中的 text

动态添加组件的代码如下,将组件添加到一个 list 中,之后可以从 list 中取:

  1. def add_raw(self):
  2.     """动态的增加行
  3.     """
  4.     self.layout_tuple = []
  5.     for i in range(7):
  6.         self.layout_tuple.append((QLabel(self), QLineEdit(self)))
  7.         self.layout_tuple[i][0].setText("{}".format(i))
  8.         self.formLayout.addRow(self.layout_tuple[i][0], self.layout_tuple[i][1])
  9.     self.text_pushButton.setEnabled(True# 增加完毕之后才可以点击

打印组件的相关文字代码如下:

  1. def print_text(self):
  2.     """打印 LineEdit 中的 text 的内容
  3.     """
  4.     for row_info in self.layout_tuple:
  5.         label_data = row_info[0]
  6.         linEdit_data = row_info[1]
  7.         print("Label: {}, LineEdit: {}".format(label_data.text(), linEdit_data.text()))

同时,有一个需要注意的是。如果我们直接点击 Print Text 这个按钮,会出现错误,这是因为还没有添加组件。所以我们需要首先添加组件,也就是 Print Text 这个按钮一开始需要是灰色的。

我们使用 setEnabled 来进行设置按钮是否可以点击,如下所示:

  1. self.text_pushButton.setEnabled(False)

最终的效果如下所示(完整的代码在最后一部分):

使用 PyQt 快速搭建带有 GUI 的应用(6)–动态添加组件

我们对上面的功能进行一个简单的说明:

  • 首先刚打开应用,Print Text 这个按钮是灰色的,是无法点击的;
  • 接着我们点击 Add Row,应用中会动态的添加 QLabelQLineEdit
  • 在点击 Add Row 的按钮之后,Print Text 会变为可以点击的状态;
  • 我们在 QLineEdit 中输入内容,点击 Print Text,就会在终端上出现 QLineEdit 的内容了;

 

动态添加组件的完整代码

以下是实现功能部分的完整代码,没有包含界面的 .ui 的代码:

  1. import os
  2. import sys
  3. from PyQt5.uic import loadUi
  4. from PyQt5.QtWidgets import QApplication, QDialog, QFileDialog, QLabel, QLineEdit
  5. class dynamicAdd_GUI(QDialog):
  6.     def __init__(self, parent=None) -> None:
  7.         super().__init__(parent)
  8.         loadUi(os.path.abspath(os.path.join(os.path.dirname(__file__), '../ui/generateRoute.ui')), self)
  9.         # 绑定按钮
  10.         self.addRow_pushButton.clicked.connect(self.add_raw)
  11.         self.text_pushButton.clicked.connect(self.print_text)
  12.         self.text_pushButton.setEnabled(False# 初始时按钮不可以点击
  13.     def add_raw(self):
  14.         """动态的增加行
  15.         """
  16.         self.layout_tuple = []
  17.         for i in range(7):
  18.             self.layout_tuple.append((QLabel(self), QLineEdit(self)))
  19.             self.layout_tuple[i][0].setText("{}".format(i))
  20.             self.formLayout.addRow(self.layout_tuple[i][0], self.layout_tuple[i][1])
  21.         self.text_pushButton.setEnabled(True# 增加完毕之后才可以点击
  22.     def print_text(self):
  23.         """打印 LineEdit 中的 text 的内容
  24.         """
  25.         for row_info in self.layout_tuple:
  26.             label_data = row_info[0]
  27.             linEdit_data = row_info[1]
  28.             print("Label: {}, LineEdit: {}".format(label_data.text(), linEdit_data.text()))
  29. if __name__ == "__main__":
  30.     app = QApplication(sys.argv)
  31.     win = dynamicAdd_GUI()
  32.     win.show()
  33.     sys.exit(app.exec())

 

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2021年5月6日07:45:08
  • 转载请务必保留本文链接:https://mathpretty.com/13677.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: