- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在开发一个管理大型数据集的项目,利用 PyQt5 的 QAbstractTableModel、QTableView 和 QSortFilterProxyModel 类来显示、过滤和修改数据。我将来需要扩展这个项目,所以我会尽力避免不良做法。我目前正在犹豫是否继续前进,因为我刚刚实现了一个实时搜索栏(您键入的表格过滤器),它似乎在测试数据上运行良好,但我担心每次输入按键时运行函数可能会导致更大的问题数据集/更复杂的搜索条件。
我通过一个简单的示例复制了下面的实时搜索功能,该示例在您键入时通过连接 QLineEdit.textChanged 信号来过滤表模型中的“名称”列,以在每次将字符输入到代理模型中时更新代理模型的过滤字符串。搜索栏。
如果这里没有真正的问题,我深表歉意,但我找不到此功能的任何 PyQt 示例。我只是想知道使用 textChanged 信号来更新每个按下的键上的过滤条件是否安全,或者是否有更好/更有效的方法来完成此操作。
我已经在更大的数据集和稍微复杂的过滤条件上尝试过这个功能,它似乎运行顺利,但我对 PyQt 不够熟练,无法猜测稍后可能会出现什么类型的问题。
from PyQt5 import QtCore, QtGui, QtWidgets
import pandas
import sys
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, data, parent=None):
super().__init__(parent)
self.headings = ["name", "address", "number"]
self.dataset = data
def rowCount(self, parent):
return self.dataset.shape[0]
def columnCount(self, parent):
return self.dataset.shape[0]
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
return self.dataset.iloc[index.row()][index.column()]
return QtCore.QVariant()
def headerData(self, section, orientation, role):
if role == QtCore.Qt.DisplayRole and orientation == QtCore.Qt.Horizontal:
return self.headings[section]
return QtCore.QVariant()
class ProxyTableModel(QtCore.QSortFilterProxyModel):
def __init__(self):
super().__init__()
self.filter_str = ''
def setFilterStr(self, val):
self.filter_str = val.lower()
def filterAcceptsRow(self, sourceRow, sourceParent):
index = self.sourceModel().index(sourceRow, 0, sourceParent)
data = self.sourceModel().data(index, QtCore.Qt.DisplayRole)
return self.filter_str in data.lower()
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, data):
super().__init__()
self.setupUi(data)
self.show()
def setupUi(self, data):
self.setObjectName("MainWindow")
self.resize(500, 500)
# create central display widget
self.centralWidget = QtWidgets.QWidget(self)
self.centralWidget.setObjectName("central_widget")
# create table view
self.tableView = QtWidgets.QTableView(self.centralWidget)
self.tableView.setGeometry(QtCore.QRect(0, 50, 500, 450))
self.tableView.setObjectName("email_attributes")
# create models & set proxy model to view
self.mainModel = TableModel(data)
self.proxyModel = ProxyTableModel()
self.proxyModel.setSourceModel(self.mainModel)
self.tableView.setModel(self.proxyModel)
# create column filter search bar
self.searchBar = QtWidgets.QLineEdit(self.centralWidget)
self.searchBar.setGeometry(QtCore.QRect(0, 0, 500, 50))
self.searchBar.textChanged[str].connect(self.filternames)
# set central widget & connect slots
self.setCentralWidget(self.centralWidget)
QtCore.QMetaObject.connectSlotsByName(self)
def filternames(self, text):
# set proxy model filter string
self.proxyModel.setFilterStr(text)
# set filterFixedString() to '' to refresh view
self.proxyModel.setFilterFixedString('')
# underlying dataset for table model
df = {
"name": ["John Smith", "Larry David", "George Washington"],
"address": ["10 Forest Dr", "15 East St", "12 Miami Ln"],
"phone_number": ["000-111-2222", "222-000-1111", "111-222-0000"]
}
data = pandas.DataFrame(df)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ui = MainWindow(data)
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)
关于python - 我的实时搜索实现是否滥用 PyQt5 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563066/
NSNotificationCenter 真的很酷,我们可以用它构建非常可扩展的应用程序。我的问题是:我们是否可以在应用程序中滥用 NSNotificationCenter,即密集使用它,还是它不是一
据我了解,标签是“ anchor ”标签,它有三个用途: 1) 描述并命名页面上的项目 2) 单击时将用户转到另一个页面 Yahoo! 3) 单击时将用户发送到同一页面中的另一个位置 Foo! 有人
我有一个使用 OpenMP 并行化 for 循环的程序。在循环内部,线程将写入共享变量,因此我需要同步它们。但是,我有时会遇到段错误或双重释放或损坏错误。任何人都知道会发生什么?感谢致敬!这是代码:
我很确定过去曾有开发人员严重滥用了我们可怜的 ASP.NET session 状态。 Session 很想帮助跟踪请求之间的事情,但只能做这么多!请帮我减轻它的痛苦,让它和我们一起快乐地工作。 有谁知
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 4年前关闭。 Improve this
Git 本质上是事件存储的实现,其中存储的数据是目录结构中的文件。已知可以可靠地解决问题: 存储更改历史记录 向客户端传输最少的数据以获取最新数据 可以回滚到之前的状态 可以通过在 Git 上编写包装
我有两项服务-Lincr和LinkBunch。 Lincr是简单的简捷URL缩短服务,而LinkBunch可让您将多个链接缩短为一个链接。我在服务中张贴了太多垃圾邮件,因此不得不关闭Lincr。现在,
我必须接管一个包含多个层、服务和组件的巨型整体。 当我浏览代码时,我首先意识到的是 MDC 的使用. 一些例子: public void setContextOrderId(String orderI
我正在尝试制作一种从外部文件中提取电子邮件信息并将其存储在字符串中的方法。我正在使用 .get 来提取字符,但我的调试器说:没有重载函数的实例与参数列表匹配。它还说它不能将第三个参数从 const c
我的 UI 中需要一个标签来容纳最多 32 个字符而不变形,因此我启用了自动收缩并将行数更改为 0: 这是我在 IB 上的标签: 现在,当我运行应用程序时,它会在屏幕外运行: 我怎样才能使它相应地适应
我有一个整数列表(当前),我想检查这个列表是否包含预期列表中的所有元素,甚至不包含列表 notExpected 中的一个元素,所以代码如下: List expected= new ArrayL
目前正在阅读 Bloch 的Effective Java(第 2 版),他以粗体字指出,在 Web 应用程序中过度使用 POST 本质上是不好的。不幸的是,他没有具体说明原因。 这让我大吃一惊,因为当
提前为第一个可能很愚蠢的帖子道歉。虽然有很多关于这个主题的 Material ,但其中很少有是确定的和/或对我来说可以理解的。 我有一个 AlignedArray 模板类,可以在堆上以任意对齐方式动态
MSDN 建议 RegisterWindowMessage() 函数仅用于注册要在进程之间发送的消息。如果需要在一个进程内发送消息,可以从 WM_APP 到 0xBFFF 范围内安全地选择它。 但是在
我已经阅读了很多关于在每个 SELECT 上使用许多 JOIN 语句的关系数据库。但是,我一直想知道滥用这种方法从长远来看是否会出现任何性能问题。 例如,假设我们有一个users 表。我通常会添加“最
所以我有一些使用保留字 property 的遗留代码,嗯,错了。在继承的基类中,它们基本上已实现。 class TestClass(object): def __init__(self, pr
出于方便和安全的原因,我想使用 using 语句从池中分配和释放对象 public class Resource : IDisposable { public void Dispose()
您很可能已经知道,在 JQuery 中选择文档中具有特定 CSS 类的所有元素,然后使用链接将公共(public)事件处理程序分配给所选元素很简单: $(".toolWindow").click(to
我需要解析一个 xml 文件,它实际上是一个非常大的树结构的图像,所以我使用 XmlReader 类来“动态”填充树。每个节点仅通过 ReadSubtree() 函数传递它期望从其父节点获得的 xml
我想知道这些指南的用途: 1 - 我多久可以读取 NSUserDefaults 2 - 我可以在 NSUserDefaults 中合理存储多少数据 显然,NSUserDefaults 的使用量是有限制
我是一名优秀的程序员,十分优秀!