添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
2021年5月6日 07:45:08
评论 2895字 阅读9分39秒
摘要 本文会介绍一个动态增加组件的 PyQt 的例子。通过点击按钮,向应用中动态的增加 QLabel 和 QLineEdit。

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

首先说一下简单的原理:

  • 我们就是向例如 .formLayout 的布局中添加 Widget 来实现动态添加组件的。
  • 对于添加的组件,我们可以放在一个 tuple 中,这样就可以使用 loop 来向里面进行添加。
  • 使用的时候指需要指定 index ,就可以获取我们需要的组件了。
  • 整个过程其实是非常简单的,下面我们看一个例子,强化一下上面的内容。

    PyQt 动态添加组件例子

    使用 QtDesigner 设计主界面

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

  • 上面是一个 QFormatLayout ,这个后面会在里面动态的添加 QLabel QLineEdit
  • 下面是两个按钮,左侧的按钮点击后动态添加组件,右侧的按钮点击后打印出组件中的 text。
  • 下图是主界面的样子,和里面类的组成(可以照着做一下):

    完成主要功能

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

  • 点击 Add Row 这个按钮,可以在 QFormatLayout 添加不同的 QLineEdit
  • 点击 Print Text 这个按钮,打印出上面 QLineEdit 中的 text
  • 动态添加组件 的代码如下,将组件添加到一个 list 中,之后可以从 list 中取:

  • def add_raw( self ):
  • """动态的增加行
  • self .layout_tuple = []
  • for i in range (7):
  • self .layout_tuple. append ((QLabel( self ), QLineEdit( self )))
  • self .layout_tuple[i][0].setText("{}".format(i))
  • self .formLayout.addRow( self .layout_tuple[i][0], self .layout_tuple[i][1])
  • self .text_pushButton.setEnabled( True ) # 增加完毕之后才可以点击
  • 打印组件的相关文字 代码如下:

  • def print_text( self ):
  • """打印 LineEdit 中的 text 的内容
  • for row_info in self .layout_tuple:
  • label_data = row_info[0]
  • linEdit_data = row_info[1]
  • print ("Label: {}, LineEdit: {}".format(label_data.text(), linEdit_data.text()))
  • 同时,有一个需要注意的是。如果我们直接点击 Print Text 这个按钮,会出现错误,这是因为还没有添加组件。所以我们需要首先添加组件,也就是 Print Text 这个按钮一开始需要是灰色的。

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

  • self .text_pushButton.setEnabled( False )
  • 最终的效果如下所示( 完整的代码在最后一部分 ):

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

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

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

  • import os
  • import sys
  • from PyQt5.uic import loadUi
  • from PyQt5.QtWidgets import QApplication, QDialog, QFileDialog, QLabel, QLineEdit
  • class dynamicAdd_GUI(QDialog):
  • def __init__ ( self , parent=None) -> None:
  • super (). __init__ (parent)
  • loadUi( os .path.abspath( os .path.join( os .path.dirname(__file__), '../ui/generateRoute.ui')), self )
  • # 绑定按钮
  • self .addRow_pushButton.clicked.connect( self .add_raw)
  • self .text_pushButton.clicked.connect( self .print_text)
  • self .text_pushButton.setEnabled( False ) # 初始时按钮不可以点击
  • def add_raw( self ):
  • """动态的增加行
  • self .layout_tuple = []
  • for i in range (7):
  • self .layout_tuple. append ((QLabel( self ), QLineEdit( self )))
  • self .layout_tuple[i][0].setText("{}".format(i))
  • self .formLayout.addRow( self .layout_tuple[i][0], self .layout_tuple[i][1])
  • self .text_pushButton.setEnabled( True ) # 增加完毕之后才可以点击
  • def print_text( self ):
  • """打印 LineEdit 中的 text 的内容
  • for row_info in self .layout_tuple:
  • label_data = row_info[0]
  • linEdit_data = row_info[1]
  • print ("Label: {}, LineEdit: {}".format(label_data.text(), linEdit_data.text()))
  • if __name__ == " __main__ ":
  • app = QApplication( sys .argv)
  • win = dynamicAdd_GUI()
  • win.show()
  • sys .exit(app. exec ())
  • 生成式 AI 辅助学术写作 生成式 AI 辅助学术写作 09/07
  • 北邮人论坛十大_2024_08_27 北邮人论坛十大_2024_08_27 08/27
  • 北邮人论坛十大_2024_08_26 北邮人论坛十大_2024_08_26 08/26
  • 北邮人论坛十大_2024_08_30 北邮人论坛十大_2024_08_30 08/30
  • 北邮人论坛十大_2024_09_01 北邮人论坛十大_2024_09_01 09/01
  •