2016-11-21 19 views
0

PyQt GuiでTableViewを更新しようとしています.QPSQLデータベースに新しいエントリが追加されるたびに、Gui内のTableViewで更新されます。 現在のところ、接続はうまく機能し、データベースに正しく接続していて、名前、電話番号、およびアドレス列を持つ電話帳だけのテーブルに何が表示されているかを示します。問題は、Postgrese Sqlデータベースに新しい行を挿入すると、GUIを閉じてコードを再実行しない限り、TableViewで更新されません。 私は何かがPostrgese SQLデータベースに追加された場合、プッシュボタンや何もせずに自動的に行うように、TableViewを更新する方法を探しています。どんな助けもありがとうございます。事前に感謝します。新しいエントリがデータベースに追加されたときにPyQtのTableViewを更新するには?

私のコードのセクションも示します。

class Ui_Dialog(object): 
def setupUi(self, Dialog): 
    Dialog.setObjectName(_fromUtf8("Dialog")) 
    Dialog.resize(400, 300) 
    self.buttonBox = QtGui.QDialogButtonBox(Dialog) 
    self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32)) 
    self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
    self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
    self.buttonBox.setObjectName(_fromUtf8("buttonBox")) 
    self.tableView = QtGui.QTableView(Dialog) 
    self.tableView.setGeometry(QtCore.QRect(20, 50, 256, 192)) 
    self.tableView.setObjectName(_fromUtf8("tableView")) 
###############################データベース
db = QSqlDatabase.addDatabase("QPSQL") # Database typed set to QPSQL for postgres use 
    db.setDatabaseName("postgres")   # This field should stay as postgres 
    db.setUserName("postgres")    # This field should stay as postgres 
    db.setPassword("pass")    # This field is for your personal password you used for the postgres install 
    db.setHostName("localhost")    # This field should stay as localhost 
    if not db.open(): 
     QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"), 
     QtGui.qApp.tr("Unable to establish a database connection.\n" 
      "This example needs SQLite support. Please read " 
      "the Qt SQL driver documentation for information " 
      "how to build it.\n\n" "Click Cancel to exit."), 
     QtGui.QMessageBox.Cancel) 

     return False 
    ok = db.open() 
の接続は##### ##########################メインGUIでテーブルビューにデータベーステーブルを追加 #
model = QSqlTableModel() 
    query = QSqlQuery("SELECT * FROM PHONEBOOK", db) 
    model.setEditStrategy(QSqlTableModel.OnFieldChange) 
    model.setQuery(query) 
    model.submitAll() 

    self.tableView.setModel(model) 
    self.tableView.show() 
    model.select() 

答えて

1

の場合データベースに通知を有効にする機能がある場合は、QSqlDriver.subscribeToNotificationを使用して、テーブルに何かを追加するとすぐに通知イベントを受け取ることができます。通知を有効にする方法は、DBの管理方法によって異なりますが、まずhttps://www.postgresql.org/docs/9.0/static/sql-notify.htmlを見てください。

通知システムは、何かが変更されたことを通知するものです。通知に接続するスロットがある場合は、それを処理する方法を決める必要があります。通知があるたびにアプリが更新されるとは限りません。アップデートを入手するのにどれだけ費用がかかりますか?たぶん5秒に1回更新されるかもしれません。

それはこのようになります:データベースが(それは常にハードウェアを読んでいるので、例えば)永遠秒ごとに更新しようとしている場合

db.exec("NOTIFY yourEventId") # only this once for lifetime of database 
db.driver().subscribeToNotification("yourEventId") 
db.driver().notification.connect(self.yourSlot) 

一つのことしかし、あなただけ(DBをポーリングすべきです定期的な時間間隔で追加のレコードをDBに照会する)。通知のメカニズムは、dbの更新間隔が長くなる場合のポーリングよりも優れています。しかし、アップデートがGUIテーブルのリフレッシュレートよりも頻繁に(たとえば10回/秒)行われると(1秒に1回)、ポーリングがうまくいくかもしれません。

DBが変更されたときにテーブルを自動的に更新する方法はありません。少なくとも、テーブルビューのモデルを更新するコードを追加する必要があります。それをポーリングしたり、そこから変更イベントをリスンすることによって(postgresql AF​​AICTでのみ利用可能)

+0

うーん、面白いアドバイス。そうすれば、何かがデータベースに追加されたという通知や、データベースへの変更に基づいてGUIのテーブルを物理的に更新することになります。私が作業しているデータベースは、1秒ごとに行と列の新しい情報で更新されるリモートデータベースになります。ですから、データベースの新しいエントリを自動的に取得してGUIのテーブルに書き込むには、PyQtのGUIが必要です。それは可能でしょうか? – Shayan

+0

自動ではありません。私は答えを広げた。 – Schollii

+0

PyQtで自動更新メソッドを実装する方法を知っていますか?ドキュメントを見ましたが、Pythonスクリプト内でその作業を行う方法はわかりません。 – Shayan

関連する問題