2013-07-03 62 views
1

使用QSortFilterProxyModel對QTreeView排序非常慢(與基本的QTreeWidget相比)。代碼有什麼問題?我如何加快速度?QTreeView排序非常慢

# coding: utf-8 

import sys 
from PyQt5.QtWidgets import (QTreeView, QAbstractItemView, 
          QMainWindow, QApplication) 
from PyQt5.QtSql import (QSqlDatabase, QSqlQuery, QSqlQueryModel) 
from PyQt5.QtCore import QSortFilterProxyModel 


class Database: 
    def __init__(self): 
     self.db = QSqlDatabase.addDatabase("QODBC") 
     self.db.setDatabaseName(
      r'Driver={SQL Server Native Client 11.0};Server={(localdb)\v11.0};') 
     self.db.open() 


class Model(QSqlQueryModel): 
    def __init__(self, parent=None): 
     super().__init__(parent) 

     query = QSqlQuery() 
     query.prepare('SELECT * FROM Companies WHERE Name LIKE ?') 
     query.bindValue(0, '%elektro%') 
     query.exec_() 
     self.setQuery(query) 


class TreeView(QTreeView):  
    def edit(self, index, trigger, event): 
     if trigger == QAbstractItemView.DoubleClicked: 
      return False 
     return QTreeView.edit(self, index, trigger, event) 


class Window(QMainWindow): 
    def __init__(self): 
     super().__init__() 

     self.db = Database() 
     self.model = Model() 
     sortFilterModel = QSortFilterProxyModel() 
     sortFilterModel.setSourceModel(self.model) 

     treeView = TreeView(self) 
     treeView.setModel(sortFilterModel) 
     treeView.hideColumn(0) 
     treeView.hideColumn(9) 
     treeView.setIndentation(0) 
     treeView.setSelectionMode(QAbstractItemView.MultiSelection) 
     treeView.setAllColumnsShowFocus(True) 
     treeView.setSortingEnabled(True) 
     treeView.clicked.connect(self.row_id) 

     self.setCentralWidget(treeView) 

    def row_id(self, index): 
     if index.isValid(): 
      id_ = index.sibling(index.row(), 0).data() 
     print(id_) 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    window = Window() 
    window.show() 
    app.exec_() 

回答

1

一些技巧(從C++的角度,所以我失去了一些東西)

  1. QTreeView則是知名的比QTableView中和consume a lot of memory慢,你反正用普通的表格模型,所以,試試QTableview。

    此外,在真正的樹層次模型隱藏列0將隱藏所有的子項目。

  2. 嘗試使用QSqlTableModel而不是QSqlQueryModel,它具有便利setSort,setFilter方法並只提取可見行。所以我可能會更快。

+0

如注2所示。它具有執行更多數據庫訪問的副作用 – Trompa