You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_())

代码说明:

  1. 整合查询逻辑到UI类:新增fetch_book_price方法,直接访问UI控件,避免了原lambda表达式的局限。
  2. 参数化查询:用?占位符传递书名,避免了SQL注入风险,这是数据库操作的最佳实践。
  3. 异常处理:添加了数据库异常捕获,避免程序崩溃,同时给用户反馈错误状态。
  4. 空输入处理:如果用户没输入书名,会提示"Empty!",避免无效查询。
  5. 动态更新输入框:查询到结果后,用self.rs.setText(str(m[2]))把价格设置到rs_QLineEdit;查询不到时显示"Not found",错误时显示"Error!"。

这样修改后,点击按钮就能直接在输入框中看到查询到的价格了,同时控制台也会输出相关信息。

内容的提问来源于stack exchange,提问作者Krishna Kishore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:51:38