Pyqt5:单击事件时在QlineEdit框中动态传递值

时间:2018-05-29 03:27:13

标签: python python-3.x sqlite pyqt pyqt5

需要将事件的结果传递给 QlineEdit 框( rs_QLineEdit ) 如果通过传递图书名称点击事件,则会显示图书名称和价格。 数据库连接没有问题,因为它运行良好并在python shell中显示结果。

我想动态传递价格,将 m [2] 传递给 rs_QLineEdit

from PyQt5.QtCore import QRegExp
from PyQt5.QtGui import QRegExpValidator
from PyQt5 import QtCore, QtGui, QtWidgets
import sqlite3

def fetch(nm):
    store=sqlite3.connect("store.db")
    book=store.cursor()
    book.execute("select * from books where title='"+nm+"';")
    m=book.fetchone()
    if m==None:
        print("Book is not Found")
    else:
        print("the name is {} ".format(nm))  #The Wings of Fire
        print(m[2])                          #200

    store.close()

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(lambda : fetch(str(self.lineEdit.text())))

    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", "Form"))
    self.find.setText(_translate("Form", "Find"))
    self.name.setText(_translate("Form", "Name"))
    self.price.setText(_translate("Form", "Price"))
    self.rs.setText(_translate("Form", "RS."))

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

2 个答案:

答案 0 :(得分:2)

尽管lambda方法通常对某些类型的任务有用,但是你不应该滥用它们,因为它们有很多限制,在你的情况下,fetch函数应该返回结果但是在lambda方法中很难建立(它可以是在理论上但它是不可读的。)

除此之外,我还是按照PyQt:http://pyqt.sourceforge.net/Docs/PyQt5/designer.html#using-the-generated-code的建议来改进代码,我建议不要修改Qt Designer生成的类,而是实现从小部件继承的另一个类并使用初始类来填充小部件,在新类中实现逻辑。

代码:

import sqlite3

from PyQt5 import QtCore, QtGui, QtWidgets


def fetch(nm):
    store=sqlite3.connect("store.db")
    book=store.cursor()
    book.execute("select * from books where title='{}';".format(nm))
    m=book.fetchone()
    store.close()
    if m:
        print("the name is {} ".format(nm))
        return m[2] 
    else:
        print("Book is not Found")

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)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.find.setText(_translate("Form", "Find"))
        self.name.setText(_translate("Form", "Name"))
        self.price.setText(_translate("Form", "Price"))
        self.rs.setText(_translate("Form", "RS."))

class Widget(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setupUi(self)

        self.find.clicked.connect(self.onFindClicked)

        reg_ex = QtCore.QRegExp("[0-9]+.?[0-9]{,2}")
        input_validator = QtGui.QRegExpValidator(reg_ex, self.rs)
        self.rs.setValidator(input_validator)

    @QtCore.pyqtSlot()
    def onFindClicked(self):
        title = self.lineEdit.text()
        name = fetch(title)
        if name:
            self.rs.setText(str(name))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

答案 1 :(得分:0)

接受的答案很好,但我不一定同意避免使用lambda函数。在PyQt中编程时,它们非常有用。根据{{​​1}}的超级QPushButton的{​​{3}},QAbstractButton只需要一个参数clicked。就我所见,它在QPushButton上实际上毫无用处,但是,你的lambda必须考虑到任何争论。将连接线更改为

bool checked = false
相关问题