1

我完全是 PyQt 的新手。我想到了这个项目。我想从我的数据库中搜索数据,如果找到它,它会将所选数据显示到我的 QTreeView。我已经有一个可以连接到我的 Postgresql 数据库的查询。例如,我的表由 pkey、itemcode、description 和 Quantity 组成。我的 Gui 中有一个 QLineEdit。在那个 QLineEdit 中,它将从我的表中搜索 ItemCode,当它找到一个项目时,它会自动将该项目数据及其详细信息发送到我的 QTreeView。这怎么可能。我希望你能帮助我。请。

这是我的代码:

连接.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_())
4

1 回答 1

1

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

简而言之,您将使用QSqlDatabaseQSqlTableModelQSqlQuery的组合

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

需要注意的重要事项:

  • 在您的 init 中,创建了数据库,然后将其传递给 QSqlTableModel。
  • 您的模型设置在此处的视图上。所有的 UI 都应该在 init 中设置,除非你有一个令人信服的理由来分离逻辑。
  • 我在这里定义的唯一额外方法是setItemCode. 这允许您传入另一个itemCode值并在您的模型上更新查询。
  • lineedit现在是self.lineedit,因此您可以在其他方法中再次引用它。
  • 实例方法需要一个self参数。你只是定义了一堆全局函数来在你的类上做一点点工作。
于 2012-07-24T05:40:45.543 回答