python - 在 Pyqt5 中单击按钮时如何从动态创建的文本框中获取数据?
问题描述
我正在尝试在 pyqt5 中创建一个窗口应用程序,其中用户输入一个数字然后单击(“按我”)按钮。
之后,根据用户输入的数字和一个按钮(“GO”)创建多行
每列有三个标签和三个文本框
我已经设法制作了行,但是我无法管理的是在单击按钮时从文本框中获取数据
注意1:为简单起见,我只是尝试了一个文本框的代码,然后我将添加更多文本框
注2:我听说过一些名为 Lambda 的函数,但我搜索了它,但找不到很好的解释
注意3:对我不起作用的类似问题: 访问动态添加的小部件我不知道如何使用这个答案,因为我在布局中有两种小部件,标签和qlinedit
从动态创建的 qlinedits 中获取值这个答案不适合我的情况,因为我想要一个按钮来获取所有创建的文本框中的数据
代码 :
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5 import *
from PyQt5.QtWidgets import QLineEdit,QLabel,QGridLayout
import sys
class Window(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.home()
def home(self):
self.grid=QGridLayout()
self.setLayout(self.grid)
self.label=QLabel(self)
self.label.setText("NO")
self.grid.addWidget(self.label,0,1)
self.pushButton_ok = QtWidgets.QPushButton("Press me", self)
self.pushButton_ok.clicked.connect(self.addtextbox)
self.grid.addWidget(self.pushButton_ok,0,10)
self.input1=QLineEdit(self)
self.grid.addWidget(self.input1,0,5)
def addtextbox(self):
no_of_process=(self.input1.text())
no=int(no_of_process)
n=0
while(n<no):
self.bursttime=QLabel(self)
self.bursttime.setText("b")
self.timeinput=QLineEdit(self)
self.grid.addWidget(self.bursttime,2*n+1,0)
self.grid.addWidget(self.timeinput,2*n+1,1)
n=n+1
self.go=QtWidgets.QPushButton("GO",self)
self.grid.addWidget(self.go,6,0)
self.go.clicked.connect(self.printvalues)
def printvalues():
n=0
#fetch data in some way
application = QtWidgets.QApplication(sys.argv)
window = Window()
window.setWindowTitle('Dynamically adding textboxes using a push button')
window.resize(250, 180)
window.show()
sys.exit(application.exec_())
解决方案
我正在开发一个 PyQt5 应用程序,它有一个动态加载的整个选项卡,带有 QTableView、QLineEdit 和几个 QPushButtons,并且遇到了类似的问题,我需要每个选项卡中来自那个 QLineEdit 的数据。我使用了 QSignalMapper,因为我必须在textChanged()
信号上获取数据,但是由于您有一个简单的按钮来获取数据,因此您可以QObject.findChildren()
像我在此示例中所做的那样使用:
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5 import *
from PyQt5.QtWidgets import QLineEdit,QLabel,QGridLayout
import sys
class Window(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.home()
def home(self):
self.grid=QGridLayout()
self.setLayout(self.grid)
self.label=QLabel(self)
self.label.setText("NO")
self.grid.addWidget(self.label,0,1)
self.pushButton_ok = QtWidgets.QPushButton("Press me", self)
self.pushButton_ok.clicked.connect(self.addtextbox)
self.grid.addWidget(self.pushButton_ok,0,10)
self.input1=QLineEdit(self)
self.grid.addWidget(self.input1,0,5)
def addtextbox(self):
no_of_process=(self.input1.text())
no=int(no_of_process)
n=0
while(n<no):
self.bursttime=QLabel(self)
self.bursttime.setText("b")
self.timeinput=QLineEdit(self)
self.timeinput.setObjectName("timeinput_{0}".format(n))
self.grid.addWidget(self.bursttime,2*n+1,0)
self.grid.addWidget(self.timeinput,2*n+1,1)
n=n+1
self.go=QtWidgets.QPushButton("GO",self)
self.grid.addWidget(self.go,6,0)
self.go.clicked.connect(self.printvalues)
def printvalues(self):
for child in self.findChildren(QLineEdit, QtCore.QRegExp("timeinput_(\d)+")):
print(child.text())
application = QtWidgets.QApplication(sys.argv)
window = Window()
window.setWindowTitle('Dynamically adding textboxes using a push button')
window.resize(250, 180)
window.show()
sys.exit(application.exec_())
PS我修复了你的pushButton_ok.clicked()
信号,它正在调用addCheckBox()
不存在的信号。
推荐阅读
- mongodb - 仅使用 2 GCE 使用 mongomirror 迁移 mongodb 的方法
- html - 不同浏览器的打印显示问题
- kubernetes - YAML 中的块标量样式折叠多行在 k8s 中通过 kubectl 不起作用
- css - 有没有办法将 Materialize CDN 与 Next.js 一起使用?
- javascript - 如何正确瞄准弹出窗口?
- sql - 获取与最近出现的重复名称相对应的最早日期
- javascript - 如何在 Nest.js 中获取嵌套的 URL 查询
- raspberry-pi - 无法在树莓派上安装 python3-lxml
- postgresql - 无法连接到 Postgres 面临错误 psql:错误:致命:主机“10.xxx”、用户“user”、数据库“db”没有 pg_hba.conf 条目
- angular - 子模块方法上的 SpyOn 在茉莉花中没有返回间谍