Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 链式QSortFilterProxy模型_Python_Qt_Pyqt_Pyside_Qsortfilterproxymodel - Fatal编程技术网

Python 链式QSortFilterProxy模型

Python 链式QSortFilterProxy模型,python,qt,pyqt,pyside,qsortfilterproxymodel,Python,Qt,Pyqt,Pyside,Qsortfilterproxymodel,假设我有一个列表变量datalist存储10000个字符串实体。 QTableView只需要显示其中一些实体。这就是为什么为QTableView分配了执行所有筛选的QSortFilterProxyModel。 所有代理工作完成后,QTableView将“接收”25个要显示的实体(因此剩余的9975个实体被“过滤掉”) 现在,我创建了一个QLineEdit用作搜索字段,用户可以在其中键入关键字以进一步缩小显示的25个实体(项目)的列表。为此,我将QLineEdit的textChanged信号链接到

假设我有一个列表变量
datalist
存储10000个字符串实体。
QTableView
只需要显示其中一些实体。这就是为什么为
QTableView
分配了执行所有筛选的
QSortFilterProxyModel
。 所有代理工作完成后,
QTableView
将“接收”25个要显示的实体(因此剩余的9975个实体被“过滤掉”)

现在,我创建了一个
QLineEdit
用作搜索字段,用户可以在其中键入关键字以进一步缩小显示的25个实体(项目)的列表。为此,我将
QLineEdit
textChanged
信号链接到分配给QTableView代理的
filteraccessrow()
方法

我在这里看到的问题是,代理模型需要返回到原始的10000个实体长列表,以便再次进行筛选

我想知道是否有可能创建第二个代理来获取第一个代理已经过滤掉的内容:25个实体,而不是10000个

因此,生成的模式如下所示:

datalist
QAbstractTableModel
QSortFilterProxyModel
QSortFilterProxyModel
QTableView

其中:

datalist
是10000个实体的长列表变量

QAbstractTableModel
是一个基本数据模型

QSortFilterProxyModel
是第一个执行最脏、最慢过滤工作的代理模型

QSortFilterProxyModel
是第二个代理模型,它处理由第一个代理数据预过滤的数据(用于根据用户的关键字进行过滤)

QTableView
是用于显示实体项的QTableView本身


所以,问题是:这是一个有效的想法吗?

下面的代码使用两个ProxyModels过滤10000项。它可以工作。。。

从PyQt4.QtCore导入*
从PyQt4.QtGui导入*
导入系统
类MyTableModel(QAbstractTableModel):
定义初始化(self,parent=None,*args):
QAbstractTableModel.\uuuuu init\uuuuu(self,parent,*args)
self.items=[i代表范围内的i(10000)]
def行数(自身、父级):
返回len(自我项目)
def列数(自身、父项):
返回1
def数据(自身、索引、角色):
如果不是index.isValid():
返回QVariant()
elif角色!=Qt.DisplayRole:
返回QVariant()
行=索引。行()
column=index.column()

如果行不正确,因为
QSortFilterProxyModel.setSourceModel(model)
希望传入的模型是
qabstractemmodel
的子类,
QSortFilterProxyModel
qabstractemmodel
的子类,您的想法至少应该运行无误。我不确定您是否获得了所需的速度提升。确实值得编写一个最小的测试示例并尝试一下尽管如此!
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class MyTableModel(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = [i for i in range(10000)]

    def rowCount(self, parent):
        return len(self.items)       
    def columnCount(self, parent):
        return 1

    def data(self, index, role):
        if not index.isValid():
            return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()

        row=index.row()
        column=index.column()
        if row<len(self.items):
            return QVariant(self.items[row])
        else:
            return QVariant()

class Proxy01(QSortFilterProxyModel):
    def __init__(self):
        super(Proxy01, self).__init__()
    def filterAcceptsRow(self, row, parent):        
        sourceModel=self.sourceModel()
        index=sourceModel.index(row, 0, parent)
        name=sourceModel.data(index, Qt.DisplayRole).toString()

        if name and not int(name)%10:
            return True
        return False

class Proxy02(QSortFilterProxyModel):
    def __init__(self):
        super(Proxy02, self).__init__()
        self.keyword=None

    def setKeyword(self, arg):
        if arg: self.keyword=str(arg)
        self.reset()    

    def filterAcceptsRow(self, row, parent):
        sourceModel=self.sourceModel().sourceModel()
        index=sourceModel.index(row, 0, parent)
        name=sourceModel.data(index, Qt.DisplayRole).toString()

        if self.keyword and name and not self.keyword.lower() in str(name).lower():
            return False        
        return True

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.tablemodel=MyTableModel(self)               

        self.proxy1=Proxy01()
        self.proxy1.setSourceModel(self.tablemodel)

        self.proxy2=Proxy02()
        self.proxy2.setSourceModel(self.proxy1)

        tableviewA=QTableView() 
        tableviewA.setModel(self.proxy2)

        searchEdit=QLineEdit()
        searchEdit.textChanged.connect(self.proxy2.setKeyword)

        layout = QVBoxLayout(self)
        layout.addWidget(tableviewA)
        layout.addWidget(searchEdit)
        self.setLayout(layout)

    def test(self, arg):
        print arg

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class MyTableModel(QAbstractTableModel):
    def __init__(self, parent=None, *args):
        QAbstractTableModel.__init__(self, parent, *args)
        self.items = [i for i in range(10000)]

    def rowCount(self, parent):
        return len(self.items)       
    def columnCount(self, parent):
        return 1

    def data(self, index, role):
        if not index.isValid():
            return QVariant()
        elif role != Qt.DisplayRole:
            return QVariant()

        row=index.row()
        column=index.column()
        if row<len(self.items):
            return QVariant(self.items[row])
        else:
            return QVariant()

class Proxy01(QSortFilterProxyModel):
    def __init__(self):
        super(Proxy01, self).__init__()
        self.keyword=None

    def setKeyword(self, arg):
        if arg: self.keyword=str(arg)
        self.reset()    

    def filterAcceptsRow(self, row, parent):
        sourceModel=self.sourceModel()
        index=sourceModel.index(row, 0, parent)
        name=sourceModel.data(index, Qt.DisplayRole).toString()

        if self.keyword and name and not self.keyword.lower() in str(name).lower():
            return False        
        return True

class MyWindow(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)

        self.tablemodel=MyTableModel(self)               

        self.proxy1=Proxy01()
        self.proxy1.setSourceModel(self.tablemodel)

        tableviewA=QTableView() 
        tableviewA.setModel(self.proxy1)

        searchEdit=QLineEdit()
        searchEdit.textChanged.connect(self.proxy1.setKeyword)

        layout = QVBoxLayout(self)
        layout.addWidget(tableviewA)
        layout.addWidget(searchEdit)
        self.setLayout(layout)

    def test(self, arg):
        print arg

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())