Pyqt5: Передавать значение динамически в поле QlineEdit при нажатии на событие - PullRequest
0 голосов
/ 29 мая 2018

При необходимости передать результат из события в поле QlineEdit ( rs_QLineEdit ). Если событие щелкается при передаче имени книги, оно отображает название книги и цену.Нет проблем с подключением к базе данных, так как он работает хорошо и отображает результат в оболочке python.

Я хочу передать цену динамически, которая должна передать 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 голосов
/ 29 мая 2018

Принятый ответ - хорошо, но я не обязательно согласен с тем, чтобы избегать лямбда-функций.Они очень полезны при программировании на PyQt.Согласно документы для суперкласса QPushButton QAbstractButton, clicked принимают один аргумент, bool checked = false.На самом деле это довольно бесполезно в QPushButton, насколько я видел, но, тем не менее, ваша лямбда должна учитывать любые аргументы.Измените свою соединительную линию на

self.find.clicked.connect(lambda c: fetch(str(self.lineEdit.text())))
                               # ^ This is the important part
0 голосов
/ 29 мая 2018

Хотя лямбда-методы полезны для определенных типов задач, в общем, вы не должны злоупотреблять ими, потому что они имеют много ограничений, в вашем случае функция fetch должна возвращать результат, но в лямбда-методе это трудно установить (это может бытьв теории, но это было бы нечитабельно).

В дополнение к этому я потрудился улучшить ваш код, следуя рекомендациям 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...