0

私はGUIを設計しており、GUIの一部として、特別な方法でデータを取得し、それをスクロール領域に表示したいと考えています。ただし、その方法がわかりません。データベース取得関数をcpu_alertとして定義しましたが、結果(行)をスクロール領域に配置するにはどうすればよいですか?コードを見てください。

from PyQt4 import QtCore, QtGui
import ui_intex_server_monitorui as intex
from PyQt4 import Qt
import sys
import os
import MySQLdb as mdb

class MyMain(QtGui.QMainWindow, intex.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMain, self).__init__(parent)
        self.setupUi(self)  

        #Exit Button
        self.connect(self.pushButton_2, QtCore.SIGNAL('clicked()'),
            self.close)
        #Refresh Button here#
        self.testdata = QtGui.QListWidget(self)
        layout = self.scrollArea_10
        layout.setWidget(self.testdata)
        self.testdata.addItem(self.cpu_alert.rows)

def cpu_alert():
    control = True

    while (control == True):

        f = open("connection_cpu.txt","r")
        a = f.read()
        con = mdb.connect('server', 'user', 'pass', 'db')

        if a == "CPU Overload":
            with con: 
                cur = con.cursor()
                cur.execute("""SELECT *
                               FROM cpu_alert
                               WHERE date = (SELECT MAX(date) FROM cpu_alert)""")
                rows = str(cur.fetchone())
                rows = rows.strip("()" "''")
                open("connection_cpu.txt","w").close()
      return rows


def main():
   app = QtGui.QApplication(sys.argv)
   app.setStyle(QtGui.QStyleFactory.create("plastique"))
   main_window = MyMain()
   main_window.show()
   app.exec_()

if __name__ == '__main__':
   main()
4

1 に答える 1

0

まず、新しいアップデートが利用可能かどうかを確認する方法について説明します。このcpu_alertメソッドを呼び出すと、メインスレッドでビジーループに入り、GUI機能の多くがブロックされます。さらに、このビジーループを制限するものは何もないため、ファイル上で非常に高速に回転します。ファイルのコンテンツをチェックすることが使用するアプローチであると仮定すると、ファイルは別のスレッドにある必要があります。スレッドはファイルをループし、適度な量をスリープします。必要なテキストが見つかると、信号を発することができます。このシグナルは、テーブルを更新するスロットに接続します。

ただし、チェックするのはファイルをすばやく読み取るだけなので、これをさらに簡単にしましょう。時間がかからないので、QTimerを使用できます。タイマーが起動し、チェッカーを呼び出します。チェッカーが検出して更新した場合は、テーブルの更新を直接呼び出すか、信号を送信するだけでより堅牢にすることができます。

これが私が後で分解する完全な例です:

from PyQt4 import QtGui, QtCore, QtSql
import time

class Window(QtGui.QDialog):

    update_ready = QtCore.pyqtSignal()

    def __init__(self):
        super(Window, self).__init__()

        self.layout = QtGui.QVBoxLayout(self)
        self.table = QtGui.QTableView()
        self.layout.addWidget(self.table)

        self.db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
        self.db.setHostName("server")
        self.db.setDatabaseName("db")
        self.db.setUserName("user")
        self.db.setPassword("pass")
        self.db.open()

        self.model = QtSql.QSqlTableModel(self, self.db)
        self.model.setTable("cpu_alert")
        self.model.setEditStrategy(self.model.OnManualSubmit)
        self.model.setQuery(QtSql.QSqlQuery("""
            SELECT *
            FROM cpu_alert
            WHERE date = (SELECT MAX(date) FROM cpu_alert)"""))
        self.model.select()

        self.table.setModel(self.model)

        self.button = QtGui.QPushButton("Select")
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.model.select)
        self.update_ready.connect(self.model.select)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.cpu_alert_checker)
        # check every second
        self.timer.start(1000*1)

        # this is only for the temp time test
        self._now = time.time()

    def cpu_alert_checker(self):
        # You would do whatever check you want 
        # in this function
        if time.time() - self._now > 5:
            print "Update ready!"
            # emit this signal if the table should refresh
            self.update_ready.emit()
            self._now = time.time()

生のドライバークエリを実行する代わりに、組み込みのQSqlを使用して、テーブルを自動的に駆動するモデルを作成できます。テーブルとモデルが各行をどのように表示するかを設定するためのオプションがたくさんあります。しかし、私はそれをかなり基本的なままにしておきます。

ボタンを作成し、SQLモデルのselect()に接続します。また、QTimerを作成し、そのタイムアウトを設定してcpu_alert_checker()を呼び出します。毎秒起動するようにタイマーを開始します。この速度はお好みに合わせて調整できます。

タイムアウトが発生すると、cpu_alert_checkerのコードが実行されます。テストを見やすくするために、プレースホルダーとしてタイムカウンターを配置するだけです。時間が5秒経過すると、起動してリセットされます。update_readyというカスタムシグナルを定義したことがわかります。私たちはそれに放出し、それに接続することができます。それはそれが可能であることを直接知る必要がないので、それはあなたのチェッカーをより頑強にします。何かの準備ができたことをアプリに通知するだけです。

この例がお役に立てば幸いです。この方法で管理する方がはるかに簡単だと思います。チェッカーがより多くの重い作業を行っている場合は、メインスレッドをブロックしないようにQThreadに移動する必要があります。

于 2012-07-21T19:36:08.837 に答える