PyQt5:点击事件时将值动态传入QLineEdit输入框
解决方法:将查询结果动态传入QLineEdit
你需要调整代码,让查询到的价格能直接更新rs_QLineEdit控件。原代码的fetch函数只是在控制台打印结果,没有和UI控件交互,我们可以把数据库查询逻辑整合到UI类的方法里,这样就能直接操作输入框了。
关键修改点:
- 将查询逻辑移到UI类的方法中,方便直接访问
self.rs控件 - 使用参数化查询避免SQL注入风险(原代码的字符串拼接方式不安全)
- 处理查询不到书籍的情况,给用户明确反馈
修改后的完整代码:
from PyQt5.QtCore import QRegExp from PyQt5.QtGui import QRegExpValidator from PyQt5 import QtCore, QtGui, QtWidgets import sqlite3 class Ui_Form(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(635, 510) self.find = QtWidgets.QPushButton(Form) self.find.setGeometry(QtCore.QRect(370, 200, 93, 28)) self.find.setObjectName("find_button") self.find.setToolTip("Press this") self.name = QtWidgets.QLabel(Form) self.name.setGeometry(QtCore.QRect(100, 200, 55, 16)) self.name.setObjectName("name_label") self.price = QtWidgets.QLabel(Form) self.price.setGeometry(QtCore.QRect(100, 260, 55, 16)) self.price.setObjectName("price_label") self.rs = QtWidgets.QLineEdit(Form) self.rs.setGeometry(QtCore.QRect(230, 260, 55, 16)) self.rs.setObjectName("rs_QLineEdit") self.lineEdit = QtWidgets.QLineEdit(Form) self.lineEdit.setGeometry(QtCore.QRect(220, 200, 113, 22)) self.lineEdit.setObjectName("lineEdit") self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) # 连接按钮到自定义的查询方法 self.find.clicked.connect(self.fetch_book_price) reg_ex = QRegExp("[0-9]+.?[0-9]{,2}") input_validator = QRegExpValidator(reg_ex, self.rs) self.rs.setValidator(input_validator) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "Book Price Finder")) self.find.setText(_translate("Form", "Find")) self.name.setText(_translate("Form", "Name")) self.price.setText(_translate("Form", "Price")) self.rs.setText(_translate("Form", "RS.")) def fetch_book_price(self): # 获取输入的书名 book_name = self.lineEdit.text().strip() if not book_name: self.rs.setText("Empty!") print("Please enter a book name") return # 数据库查询(使用参数化查询避免SQL注入) try: store = sqlite3.connect("store.db") book_cursor = store.cursor() # 参数化查询,用?占位符传递参数 book_cursor.execute("select * from books where title = ?;", (book_name,)) m = book_cursor.fetchone() if m is None: self.rs.setText("Not found") print("Book is not Found") else: print(f"The name is {book_name}") print(f"Price: {m[2]}") # 将价格设置到rs_QLineEdit中 self.rs.setText(str(m[2])) except sqlite3.Error as e: print(f"Database error: {e}") self.rs.setText("Error!") finally: store.close() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
代码说明:
- 整合查询逻辑到UI类:新增
fetch_book_price方法,直接访问UI控件,避免了原lambda表达式的局限。 - 参数化查询:用
?占位符传递书名,避免了SQL注入风险,这是数据库操作的最佳实践。 - 异常处理:添加了数据库异常捕获,避免程序崩溃,同时给用户反馈错误状态。
- 空输入处理:如果用户没输入书名,会提示"Empty!",避免无效查询。
- 动态更新输入框:查询到结果后,用
self.rs.setText(str(m[2]))把价格设置到rs_QLineEdit;查询不到时显示"Not found",错误时显示"Error!"。
这样修改后,点击按钮就能直接在输入框中看到查询到的价格了,同时控制台也会输出相关信息。
内容的提问来源于stack exchange,提问作者Krishna Kishore
相关产品推荐
相关产品推荐

