【问题标题】:How to use QSortFilterProxyModel's setFilterRegExp() along with filterAcceptsRow()如何使用 QSortFilterProxyModel 的 setFilterRegExp() 和 filterAcceptsRow()
【发布时间】:2015-01-15 01:22:56
【问题描述】:

在实现QSortFilterProxyModel(与QTableView 一起使用)时,我通过在其中定义一些自定义逻辑(关于如何过滤项目)覆盖了代理的filterAcceptsRow() 方法。现在看来,覆盖代理的“默认”filterAcceptsRow() 与围绕.setFilterRegExp() 构建的内置代理功能冲突

mySearchField=QLineEdit()
QObject.connect(mySearchField, SIGNAL("textChanged(QString)"), myProxyModel.setFilterRegExp)

在输入mySearchField 时,我确实看到代理的filterAcceptsRow() 不断被调用。但是由于我用自定义逻辑覆盖了它的filterAcceptsRow() 方法,因此不会对输入到 lineedit 的文本进行过滤。

问题:是否可以同时保留这两个功能:使用代理的内置 .setFilterRegExp() 和自定义 filterAcceptsRow() 方法的简单性?

【问题讨论】:

    标签: python qt model pyqt


    【解决方案1】:

    QSortFilterProxyModel 的构造函数中,首先声明了self.searchText 变量:

    class TaskProxyModel(QSortFilterProxyModel):
        def __init__(self):
            super(TaskProxyModel, self).__init__()
            self.searchText=None
    

    定义代理的setSearchText() 自定义设置器以链接到lineeditlineedit 用于输入搜索关键字):

    class MyProxyModel(QSortFilterProxyModel):
        def __init__(self):
            super(MyProxyModel, self).__init__()
            self.searchText=None
    
        def setSearchText(self, arg=None):
            self.searchText=arg
            self.reset()
    

    lineedit 链接到代理的setSearchText() 设置方法:

    myProxy=MyProxyModel()
    lineEdit=QLineEdit()
    lineEdit.textChanged.connect(myProxy.setSearchText)
    

    在代理的filterAcceptsRow() 开头检查self.searchText 是否不是None。 如果没有,那么做一些逻辑:

    class MyProxyModel(QSortFilterProxyModel):
        def __init__(self):
            super(MyProxyModel, self).__init__()
            self.searchText=None
    
        def filterAcceptsRow(self, rowProc, parentProc):
            sourceModel=self.sourceModel()      
            indexProc=sourceModel.index(rowProc, 0, parentProc)
            node=sourceModel.data(indexProc, Qt.UserRole).toPyObject()
    
            if self.searchText:
                nodeName=node.getName()
                if nodeName and not str(self.searchText).lower() in nodeName.lower():
                    return False 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多