从QAbstractListModel更新QListView时CPU过载

时间:2016-02-28 14:48:42

标签: python python-2.7 model-view-controller pyqt5

我正在构建一个小的pyqt5应用程序,它在QListView中显示512个值的列表。该列表通过单独的线程更新,使用QThread。 它工作得很好,除了它正在使用我正在开发的(旧)Core 2 Duo 2,53 Ghz的65/95%的CPU。

我简化了代码以删除依赖项,因为更新是通过网络协议完成的。更新每秒进行40次(每次25毫秒)。

下面的简化脚本每秒刷新列表10次,更新列表时CPU仍然是65%。

有没有办法避免过载? 更新视图是否有一些最佳实践?

(全局不在我的上一个代码中,这里有一个简单的例子)

from random import randrange
from time import sleep
from sys import argv, exit
from PyQt5.QtCore import QThread, QAbstractListModel, Qt, QVariant, pyqtSignal
from PyQt5.QtWidgets import QListView, QApplication, QGroupBox, QVBoxLayout, QPushButton

universe_1 = [0 for i in range(512)]

class SpecialProcess(QThread):
    universeChanged = pyqtSignal()
    def __init__(self):
        super(SpecialProcess, self).__init__()
        self.start()

    def run(self):
        global universe_1
        universe_1 = ([randrange(0, 101, 2) for i in range(512)])
        self.universeChanged.emit()
        sleep(0.1)
        self.run()


class Universe(QAbstractListModel):
    def __init__(self, parent=None):
        super(Universe, self).__init__(parent)

    def rowCount(self, index):
        return len(universe_1)

    def data(self, index, role=Qt.DisplayRole):
        index = index.row()
        if role == Qt.DisplayRole:
            try:
                return universe_1[index]
            except IndexError:
                return QVariant()
        return QVariant()


class Viewer(QGroupBox):
    def __init__(self):
        super(Viewer, self).__init__()
        list_view = QListView()
        self.list_view = list_view
        # create a vertical layout
        vbox = QVBoxLayout()
        universe = Universe()
        vbox.addWidget(list_view)
        # Model and View setup
        self.model = Universe(self)
        self.list_view.setModel(self.model)
        # meke a process running in parallel 
        my_process = SpecialProcess()
        my_process.universeChanged.connect(self.model.layoutChanged.emit)
        # set the layout on the groupbox
        vbox.addStretch(1)
        self.setLayout(vbox)


if __name__ == "__main__":
  app = QApplication(argv)
  group_widget = Viewer()
  group_widget.show()
  exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

这似乎是一种正常行为......