Python 我的实时搜索实现是否误用了PyQt5方法?

Python 我的实时搜索实现是否误用了PyQt5方法?,python,python-3.x,pyqt5,Python,Python 3.x,Pyqt5,我一直在从事一个管理大型数据集的项目,利用PyQt5的QAbstractTableModel、QTableView和QSortFilterProxyModel类来显示、过滤和修改数据。我将需要扩大这个项目在未来,所以我正在尽我最大的努力,以避免不良做法。我目前还不太确定是否继续前进,因为我刚刚实现了一个实时搜索栏(键入时的表过滤器),它似乎可以很好地处理测试数据,但我担心每次输入一个键时运行函数可能会导致更大的数据集/更复杂的搜索条件出现问题 我用一个简单的示例复制了下面的实时搜索功能,该示例通

我一直在从事一个管理大型数据集的项目,利用PyQt5的QAbstractTableModel、QTableView和QSortFilterProxyModel类来显示、过滤和修改数据。我将需要扩大这个项目在未来,所以我正在尽我最大的努力,以避免不良做法。我目前还不太确定是否继续前进,因为我刚刚实现了一个实时搜索栏(键入时的表过滤器),它似乎可以很好地处理测试数据,但我担心每次输入一个键时运行函数可能会导致更大的数据集/更复杂的搜索条件出现问题

我用一个简单的示例复制了下面的实时搜索功能,该示例通过连接QLineEdit.textChanged信号,在每次将字符输入搜索栏时更新代理模型的过滤器字符串,在键入时过滤表模型中的“name”列

如果这里没有真正的问题,我深表歉意,但我找不到任何PyQt示例。我只想知道使用textChanged信号更新每个按键的过滤条件是否安全,或者是否有更好/更有效的方法来实现这一点

我在更大的数据集和稍微复杂的过滤条件下尝试过这个功能,它似乎运行得很顺利,但我对PyQt不够精通,无法猜测以后可能会出现什么类型的问题

从PyQt5导入QtCore、QtGui、qtwidget
进口大熊猫
导入系统
类TableModel(QtCore.QAbstractTableModel):
def uuu init uuu(self,data,parent=None):
super()。\uuuu init\uuuu(父级)
self.headers=[“姓名”、“地址”、“编号”]
self.dataset=数据
def行数(自身、父级):
返回self.dataset.shape[0]
def列数(自身、父项):
返回self.dataset.shape[0]
def数据(自身、索引、角色):
如果角色==QtCore.Qt.DisplayRole:
返回self.dataset.iloc[index.row()][index.column()]
返回QtCore.QVariant()
def headerData(自身、部门、方向、角色):
如果角色==QtCore.Qt.display角色和方向==QtCore.Qt.Horizontal:
返回自我。标题[部分]
返回QtCore.QVariant()
类ProxyTableModel(QtCore.QSortFilterProxyModel):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.filter_str=''
def设置过滤器TR(自身,val):
self.filter_str=val.lower()
def filterAcceptsRow(自身、源行、源父级):
index=self.sourceModel().index(sourceRow,0,sourceParent)
data=self.sourceModel().data(索引,QtCore.Qt.DisplayRole)
返回data.lower()中的self.filter_str
类MainWindow(QtWidgets.QMainWindow):
定义初始化(自身,数据):
super()。\uuuu init\uuuuu()
self.setupUi(数据)
self.show()
def设置UI(自身、数据):
self.setObjectName(“主窗口”)
自我调整大小(500500)
#创建中央显示小部件
self.centralWidget=qtwidts.QWidget(self)
self.centralWidget.setObjectName(“中心窗口小部件”)
#创建表视图
self.tableView=qtwidts.QTableView(self.centralWidget)
self.tableView.setGeometry(QtCore.QRect(0,50500450))
self.tableView.setObjectName(“电子邮件属性”)
#创建模型并将代理模型设置为视图
self.mainModel=TableModel(数据)
self.proxyModel=ProxyTableModel()
self.proxyModel.setSourceModel(self.mainModel)
self.tableView.setModel(self.proxyModel)
#创建列筛选器搜索栏
self.searchBar=qtwidts.QLineEdit(self.centralWidget)
self.searchBar.setGeometry(QtCore.QRect(0,050050))
self.searchBar.textChanged[str].connect(self.filternames)
#设置中心窗口小部件和连接插槽
self.setCentralWidget(self.centralWidget)
QtCore.QMetaObject.connectSlotsByName(self)
def过滤器名称(自身、文本):
#设置代理模型筛选器字符串
self.proxyModel.setFilterStr(文本)
#将filterFixedString()设置为“”以刷新视图
self.proxyModel.setFilterFixedString(“”)
#表模型的基础数据集
df={
“姓名”:[“约翰·史密斯”、“拉里·大卫”、“乔治·华盛顿”],
“地址”:[“10森林博士”,“东大街15号”,“迈阿密12号”],
“电话号码”:[“000-111-2222”、“222-000-1111”、“111-222-0000”]
}
数据=熊猫。数据帧(df)
如果名称=“\uuuuu main\uuuuuuuu”:
app=qtwidts.QApplication(sys.argv)
ui=主窗口(数据)
sys.exit(app.exec_())

您应该扩展QLineEdit类和keyPressedEvent函数来处理各种按键事件,如下所示

from PyQt5.QtWidgets import (QLineEdit)
from PyQt5.QtCore import (Qt, QRegExp)
class LineEdit(QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)
        self.initialize_component()

    def initialize_component(self):
        self.setClearButtonEnabled(True)

    def keyPressEvent(self, event):
        key = event.key()
        if key == Qt.Key_Tab:
            self.parent().focusNextChild()
        elif key == Qt.Key_Backtab:
            self.parent().focusPrevChild()
        else:
            return QLineEdit.keyPressEvent(self, event)

您应该扩展QLineEdit类和keyPressedEvent函数来处理各种按键事件,如下所示

from PyQt5.QtWidgets import (QLineEdit)
from PyQt5.QtCore import (Qt, QRegExp)
class LineEdit(QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)
        self.initialize_component()

    def initialize_component(self):
        self.setClearButtonEnabled(True)

    def keyPressEvent(self, event):
        key = event.key()
        if key == Qt.Key_Tab:
            self.parent().focusNextChild()
        elif key == Qt.Key_Backtab:
            self.parent().focusPrevChild()
        else:
            return QLineEdit.keyPressEvent(self, event)

这很有意义,这样我可以将过滤行为映射到按下的键的类型。您是否知道,如果像我上面所做的那样在每个按键上运行函数,是资源过于密集,还是我低估了PyQt?您需要为您的用例自定义keyPressEvent+您可以添加QApplication().setAttribute(Qt.AA_CompressHighFrequencyEvents)这很有意义,这样我就可以将过滤行为映射到按下的键的类型。您是否知道,如果像我上面所做的那样在每个按键上运行函数,是资源过于密集,还是我低估了PyQt?您需要为您的用例自定义keyPressEvent+您可以添加QApplication().setAttribute(Qt.AA_CompressHighFrequencyEvents)