1

QSortFilterProxyModel を使用した QTreeView の並べ替えは、(基本的な QTreeWidget と比較して) 非常に低速です。コードの何が問題になっていますか? どうすればスピードアップできますか?

# 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_()
4

1 に答える 1