首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高PyQt4 QListWidget的效率

如何提高PyQt4 QListWidget的效率
EN

Stack Overflow用户
提问于 2012-10-26 23:52:04
回答 1查看 595关注 0票数 1

我有下面的代码,我想知道是否有一种方法可以让它更有效率。setCurrentItem()和scrollToItem()函数似乎大大减慢了这个过程。此外,我希望看到项目显示在列表中,因为它们是添加的,而不是在循环完成后一次全部显示。任何帮助或讨论都会受到极大的欢迎。

代码语言:javascript
复制
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_()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-27 01:55:56

您的问题与.scrollToItem.setCurrentItem没有任何关系。logLoop方法中的循环不会给Qt事件循环提供任何更新内容的机会。解决这个问题的一种方法是,给Qt一个使用QApplication.processEvents()更新图形用户界面的机会。因此,如果您按如下所示修改logLoop,您应该会看到添加的项:

代码语言:javascript
复制
  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)应该是你的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13090223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档