我完全是PyQt的新手。我有这个项目。我想从我的数据库中搜索数据,如果找到它,它会将所选数据显示给我的QTreeView。我已经有一个可以连接到Postgresql数据库的查询。我的表格例如由pkey,itemcode,description和Quantity组成。我的Gui里有一个QLineEdit。在那个QLineEdit中,它将从我的表中搜索ItemCode,当它找到一个项目时,它会自动将该项目数据发送到我的QTreeView及其详细信息。这怎么可能。我希望你能帮助我。请。
这是我的代码:
connection.py
def createConnection(db):
db = QSqlDatabase.addDatabase("QPSQL");
db.setHostName("localhost")
db.setPort(5432)
db.setDatabaseName("posdb")
db.setUserName("username")
db.setPassword("password")
if not db.open():
QtGui.QMessageBox.Warning(None,"Test", QtCore.QString("Database Error: %1").arg(db.lastError().text()))
sys.exit(1)
ok = db.open()
def sqlquery():
query = QSqlQuery(db)
query.prepare("Select itemcode, description, srp, vat from items Where itemcode=:itemcode;");
if query.next():
itemcode = query.value(0).toInt()
description = query.value(1).toString()
srp = query.value(2).toInt()
vat = query.value(3).toInt()
query.bindvalue(":itemcode", QtCore.QVariant(itemcode))
query.exec_()
return True
在我的baseui.ui中,我将其转换为.py,然后在那里,它有QLineEdit,我如何在我的main.py中使用它?就像把它称为函数一样。再次感谢JDI。
这是我的main.py
import baseui,connection
from baseui import Ui_Dialog
from connection import createConnection
class PosForm(QtGui.QWidget):
def __init__(self,parent=None):
super(PosForm,self).__init__(parent)
self.ui = baseui()
self.ui.setupUi(self)
lineedit = QLineEdit(self.ui)
selectitem = lineedit.toInt
def initializeModel(model):
model = QSqlTableModel()
model.setTable('items')
model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
model.select()
def view(model):
view = QTableView()
view.setModel(model)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
model = QtSql.QSqlTableModel()
initializeModel(model)
view = PosForm()
view.show()
sys.exit(app.exec_())
答案 0 :(得分:1)
有很多关于如何使用QtSql从数据库查询中填充视图的examples here。它们都是用C ++编写的,但这些例子几乎可以转换为PyQt。
简而言之,您可以使用QSqlDatabase,QSqlTableModel和QSqlQuery
的组合通过这些设置,您只需访问myTableView.setModel(mySqlTableModel),myTableView
为QTableView
更新:反映最近的代码更新
我不知道该代码是什么,但它做了很多奇怪的事情。有顶级函数接受参数,但后来继续创建新参数。就像在main中创建QSqlTableModel一样,然后将其传递给函数,该函数将创建一个新函数。您的create database函数只创建另一个数据库。我并不真正理解所有单独函数中的逻辑。这只是代码的简化版本:
from PyQt4 import QtCore, QtGui, QtSql
from baseui import Ui_Dialog
class PosForm(QtGui.QWidget):
def __init__(self,parent=None):
super(PosForm,self).__init__(parent)
self.ui = baseui()
self.ui.setupUi(self)
# save a reference to your line edit so you can refer to it
self.lineedit = QtGui.QLineEdit(self.ui)
selectitem = lineedit.toInt # what is this?
# Your database needs to be created so you can pass it to your model
db = QtSql.QSqlDatabase.addDatabase("QPSQL", "MyDatabaseConnectionName")
db.setHostName("localhost")
db.setPort(5432)
db.setDatabaseName("posdb")
db.setUserName("username")
db.setPassword("password")
if not db.open():
QtGui.QMessageBox.Warning(
self,
"Database Connection Error",
"Database Error: %s" % db.lastError().text()
)
sys.exit(1) # you want your whole program to exit?
self.db = db
# pass the database to the model
self.model = QtSql.QSqlTableModel(self, self.db)
self.model.setTable('items')
self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
# create the view and set the model
self.view = QtGui.QTableView(self)
self.view.setModel(self.model)
def setItemCode(self, itemCode):
""" Set a new itemCode value for the sql query select """
query = QtSql.QSqlQuery()
query.prepare("Select itemcode, description, srp, vat from items Where itemcode=:itemcode;")
query.bindvalue(":itemcode", itemCode)
self.model.setQuery(query)
self.model.select()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
view = PosForm()
view.show()
sys.exit(app.exec_())
需要注意的重要事项:
setItemCode
。这允许您传入另一个itemCode
值并在您的模型上更新查询。lineedit
现在是self.lineedit
,因此您可以通过其他方式再次参考。self
参数。你只是定义了一堆全局函数来为你的班级做一些工作。