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に変換されます。

一言で言えば、 QSqlDatabaseQSqlTableModel、およびQSqlQueryの組み合わせを使用します

  • QSqlDatabase:特定のドライバー(この場合はPostgresql)を使用してデータベースへの接続オブジェクトを作成します
  • QSqlTableModel:これにデータベースオブジェクトを指定すると、クエリの結果をデータとして受け取ることができます。テーブルビューに接続できます
  • QSqlQuery:カスタムSQLクエリを指定する場合は、QSqlTableModelでこれを設定できます。

これらを設定すると、myTableView.setModel(mySqlTableModel)に移動するだけです。ここmyTableViewで、はQTableView

更新:最近のコード更新を反映するため

そのコードで何が起こっているのかわかりませんが、それは多くの奇妙なことをします。引数を取るトップレベルの関数がありますが、先に進んで新しい関数を作成します。メインで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て、モデルでクエリを更新できます。
  • これで、他の方法lineeditself.lineedit再度参照できるようになりました。
  • インスタンスメソッドにはselfパラメータが必要です。クラスで少し作業を行うために、一連のグローバル関数を定義しているだけです。
于 2012-07-24T05:40:45.543 に答える