2012-07-23 24 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

相關問題