10

使用 PyQt 快速搭建带有 GUI 的应用(6)–动态添加组件 | 文艺数学君

 3 years ago
source link: https://mathpretty.com/13677.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

所属分类:Python库介绍

摘要本文会介绍一个动态增加组件的 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.     self.layout_tuple = []
  4.     for i in range(7):
  5.         self.layout_tuple.append((QLabel(self), QLineEdit(self)))
  6.         self.layout_tuple[i][0].setText("{}".format(i))
  7.         self.formLayout.addRow(self.layout_tuple[i][0], self.layout_tuple[i][1])
  8.     self.text_pushButton.setEnabled(True) # 增加完毕之后才可以点击

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

  1. def print_text(self):
  2.     """打印 LineEdit 中的 text 的内容
  3.     for row_info in self.layout_tuple:
  4.         label_data = row_info[0]
  5.         linEdit_data = row_info[1]
  6.         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.         self.layout_tuple = []
  16.         for i in range(7):
  17.             self.layout_tuple.append((QLabel(self), QLineEdit(self)))
  18.             self.layout_tuple[i][0].setText("{}".format(i))
  19.             self.formLayout.addRow(self.layout_tuple[i][0], self.layout_tuple[i][1])
  20.         self.text_pushButton.setEnabled(True) # 增加完毕之后才可以点击
  21.     def print_text(self):
  22.         """打印 LineEdit 中的 text 的内容
  23.         for row_info in self.layout_tuple:
  24.             label_data = row_info[0]
  25.             linEdit_data = row_info[1]
  26.             print("Label: {}, LineEdit: {}".format(label_data.text(), linEdit_data.text()))
  27. if __name__ == "__main__":
  28.     app = QApplication(sys.argv)
  29.     win = dynamicAdd_GUI()
  30.     win.show()
  31.     sys.exit(app.exec())
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK