1

私は次のコードを持っていますが、これをより効率的にする方法があるかどうか疑問に思っています。setCurrentItem()およびscrollToItem()関数は、プロセスをかなり遅くするようです。また、ループが完了した後、アイテムが一度に追加されるのではなく、追加されるときにリストに表示されるようにしたいと思います。どんな助けや議論も大いに感謝されるでしょう。

import sys
from math import *
#from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import (Qt, SIGNAL, QSize)
from PyQt4.QtGui import (QApplication, QDialog, QLabel, QListWidget, QListWidgetItem,     QPushButton, QScrollArea, QTextDocument, QVBoxLayout)
from time import localtime, strftime
import time

class LogDlg(QDialog):

  def __init__(self, parent=None):
    super(LogDlg, self).__init__(parent)
    self.resize(450, 380)

    self.log1 = QListWidget()
    self.log2 = QListWidget()
    lbl = QLabel()
    lbl_2 = QLabel()
    lbl.setText("Communications Log")
    lbl_2.setText("Command/Data Log")
    self.pushButton = QPushButton()
    self.pushButton.setMaximumSize(QSize(110, 24))
    self.pushButton.setObjectName("pushButton")

    self.pushbutton = QPushButton
    self.pushButton.setText("Start Log Loop")
    layout = QVBoxLayout()
    layout.addWidget(self.pushButton)
    layout.addWidget(lbl)
    layout.addWidget(self.log1)
    layout.addWidget(lbl_2)
    layout.addWidget(self.log2)
    self.setLayout(layout)
    self.setWindowTitle("Transaction Logs")
    self.connect(self.pushButton,SIGNAL("clicked()"),self.logLoop) 
    self.time = time.time()

  def logLoop(self):
    for i in range(1000):
        print i
        self.addLog("This is a test","c",True)      

  def timeStamp(self):
    now = time.time()
    localtime = time.localtime(now)
    milliseconds = '%02d' % int((now - int(now)) * 100)
    val = time.strftime('%H:%M:%S.', localtime) + milliseconds
    return val

  def clearUi(self):
    self.log1.clear()
    self.log2.clear()

  def addLog(self, data, type="c", ts=False):
#        pass
    t = self.timeStamp()
    if ts == True:
        data = t + " " + data
    if type == "c":
        self.listItem1 = QListWidgetItem()
        self.listItem1.setText(data)
        self.log1.addItem(self.listItem1)
#        self.log1.scrollToItem(self.listItem1)
        self.log1.setCurrentItem(self.listItem1)


    elif type == "d":
        self.listItem2 = QListWidgetItem()
        self.listItem2.setText(data)
        self.log2.addItem(self.listItem2)
#        self.log2.scrollToItem(self.listItem2)
        self.log2.setCurrentItem(self.listItem2)


app = QApplication(sys.argv)
form = LogDlg()
form.open()
app.exec_()
4

1 に答える 1

1

あなたの問題はまたはとは何の関係もありませ.scrollToItem.setCurrentItem。ループインlogLoopメソッドは、Qtイベントループが更新する機会を与えません。これを解決する1つの方法は、QtにGUIを更新する機会を与えることですQApplication.processEvents()。したがって、logLoop次のように変更すると、追加されたアイテムが表示されます。

  def logLoop(self):
    for i in range(1000):
        print i
        self.addLog("This is a test","c",True)
        QApplication.processEvents()

これはある程度役に立ちます。間隔processEventsが十分に短い場合は、レスポンシブUIを取得します。しかし、事態がさら​​に複雑になり、各セグメントのタスクを完了する時間が長くなるとQThread、GUIの応答性を維持するために、そのコードを別のスレッド()に委任する必要があります。

もう1つの問題は、に多数のアイテムがあると処理が遅くなることですQListWidget。25番目のアイテムの追加は925番目のアイテムよりも速いことに気付くかもしれません。これは、QListWidget(またはQTableWidget/ QTreeWidget)が適切にスケーリングされないためです。多数のアイテムを使用する場合は、モデル/ビューフレームワーク(QListView/ QTableView/ QTreeView)を選択する必要があります。

于 2012-10-26T17:55:55.867 に答える