从db中提取数据然后将其传递给qtreeview

时间:2012-07-23 07:43:56

标签: python sql pyqt

我完全是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_())

1 个答案:

答案 0 :(得分:1)

有很多关于如何使用QtSql从数据库查询中填充视图的examples here。它们都是用C ++编写的,但这些例子几乎可以转换为PyQt。

简而言之,您可以使用QSqlDatabaseQSqlTableModelQSqlQuery

的组合
  • QSqlDatabase :使用特定的驱动程序创建数据库的连接对象(在您的情况下,Postgresql
  • QSqlTableModel :您为此提供数据库对象,它将处理作为数据接收查询的结果。它可以连接到表格视图
  • QSqlQuery :如果要指定自定义sql查询,可以在QSqlTableModel上设置它。

通过这些设置,您只需访问myTableView.setModel(mySqlTableModel),myTableViewQTableView

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

我不知道该代码是什么,但它做了很多奇怪的事情。有顶级函数接受参数,但后来继续创建新参数。就像在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_())

需要注意的重要事项:

  • 在init中,创建数据库,然后传递给QSqlTableModel。
  • 您的模型设置在那里的视图上。应该在init中设置所有UI,除非你有令人信服的理由将逻辑分开。
  • 我在这里定义的唯一额外方法是setItemCode。这允许您传入另一个itemCode值并在您的模型上更新查询。
  • 您的lineedit现在是self.lineedit,因此您可以通过其他方式再次参考。
  • 实例方法需要self参数。你只是定义了一堆全局函数来为你的班级做一些工作。