2012-07-23 77 views
1

我完全是PyQt的新手。我有这个项目。我想从我的数据库中搜索数据,如果它发现它,它会显示选定的数据到我的QTreeView。我已经有一个查询可以连接到我的Postgresql数据库。我的表格例如由pkey,itemcode,description和Quantity组成。我的Gui有一个QLineEdit。在那个QLineEdit中,它会从我的表中搜索ItemCode,当它找到一个项目时,它会自动发送该项目数据到我的QTreeView及其细节。这怎么可能。我希望你能帮助我。请。从db中提取数据然后传递给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_()) 

回答

1

有一个关于如何使用QtSql填充从数据库查询的观点一堆examples here。他们都是用C++编写的,但这些例子几乎可以翻译成PyQt。

简而言之,你可以使用的QSqlDatabase组合,QSqlTableModelQSqlQuery

  • QSqlDatabase:创建连接对象使用一个特定的驱动程序数据库(在你的情况下,PostgreSQL的
  • QSqlTableModel:你给这个数据库对象,它将处理接收查询的结果作为数据。它可以连接到一个表视图
  • QSqlQuery:如果你想指定一个自定义的sql查询,你可以在你的QSqlTableModel上设置它。

有了这些设置,只需到myTableView.setModel(mySqlTableModel),其中myTableViewQTableView

更新:以反映最近的代码更新

我不知道怎么回事用那个代码,但是它做了很多奇怪的事情。有顶级函数需要参数,但是继续并创建新的函数。就像在你的main中创建一个QSqlTableModel一样,然后将它传递给函数并创建一个新的函数。而你的创建数据库功能只是创建另一个数据库。我不太了解所有单独功能的逻辑。这里只是一个简化代码的版本:

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

重要的事情需要注意:

  • 在你的初始化,数据库中创建,然后传递到与QSqlTableModel。
  • 你的模型设置在那里的视图。所有的UI都应该在init中设置,除非你有一个令人信服的理由来分离逻辑。
  • 我在这里定义的唯一额外方法是setItemCode。这允许您传递另一个itemCode值并且在您的模型上更新查询。
  • 您的lineedit现在是self.lineedit因此您可以在其他方法中再次参考它。
  • 实例方法需要参数self。你只是定义了一些全局函数来为你的课程做点什么工作。
+0

男人,谢谢你的快速回复。我在哪里可以发布我的代码,以便您可以更正它?非常感谢JDI。 (): – Nethan 2012-07-25 07:04:19

+0

这是我的connection.py def createConnection(): db = QSqlDatabase.addDatabase(“QPSQL”); db.setHostName( “localhost” 的) db.setPort(5432) db.setDatabaseName( “posdb”) db.setUserName( “nethanjavier”) db.setPassword( “猜”) 如果没有db.open( ): QtGui.QMessageBox.Warning(None,“Test”,QtCore.QString(“Database Error:%1”)。arg(db.lastError()。text())) sys.exit(1) ok =我connection.py 高清sqlquery的db.open() – Nethan 2012-07-25 07:11:48

+0

延续(): 查询= QSqlQuery(DB) query.prepare( “选择itemcode,描述,SRP,从项目大桶其中itemcode =:itemcode;”) ; () if query.next(): itemcode = query.value(0).toInt() description = query.value(1).toString() srp = query.value(2).toInt() vat =查询。价值(3).toInt() query.bindvalue(“:itemcode”,QtCore.QVariant(itemcode)) query.exec_() return True – Nethan 2012-07-25 07:12:18

相关问题