我有下面的代码,我想知道是否有一种方法可以让它更有效率。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_()发布于 2012-10-27 01:55:56
您的问题与.scrollToItem或.setCurrentItem没有任何关系。logLoop方法中的循环不会给Qt事件循环提供任何更新内容的机会。解决这个问题的一种方法是,给Qt一个使用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),以保持图形用户界面的响应。
另一个问题是,一旦QListWidget中有了大量的项目,事情就会变得很慢。您可能注意到,添加第25项比添加第925项更快。这是因为QListWidget (或QTableWidget/QTreeWidget)不能很好地伸缩。如果你有大量的项目,模型/视图框架(QListView/QTableView/QTreeView)应该是你的选择。
https://stackoverflow.com/questions/13090223
复制相似问题