如何为 TableWidget 创建视觉辅助
How create a visual aid for TableWidget
我有一个包含 1000 行数据的 table 小部件。并且为 table 自动实现了这个很好的功能,每当我们按下字母键时,它就会搜索匹配的数据。我想通过视觉辅助让它更直观一些。
我想创建一个标签来显示用户在过去 2 秒内输入的字母。它应该继续连接并显示新字母。如果用户停止输入新字母超过 2 秒,则标签应该消失。
我想我需要创建一种“管理器”功能,它可以接收按键并创建此标签并在 2 秒过去后终止它。问题是我不知道如何让这个函数“等待”新的击键。
我想这个视觉辅助不是什么新东西,之前可能有人实现过它,但我不知道它叫什么 Google 所以我很抱歉为它创建了一个 post .
您可以在子类中重新实现 tablewidget 的 keyboardSearch()
功能,然后创建一个子 widget,它将根据搜索进行自我更新。
请注意,搜索会根据 QApplication.keyboardInputInterval
自动重置,这使得搜索小部件出现的时间很短(直到视图可以接受新搜索作为当前搜索的一部分)。
from PyQt5 import QtCore, QtWidgets
from random import choice
from string import ascii_lowercase
class TableSearch(QtWidgets.QTableWidget):
def __init__(self):
super().__init__(0, 3)
self.setEditTriggers(self.NoEditTriggers)
for row in range(500):
self.insertRow(row)
for col in range(3):
text = ''.join(choice(ascii_lowercase) for i in range(5))
self.setItem(row, col, QtWidgets.QTableWidgetItem(text))
self.searchWidget = QtWidgets.QLabel(self)
self.searchWidget.setStyleSheet('''
QLabel {
border: 1px inset darkGray;
border-radius: 2px;
background: palette(window);
}
''')
self.searchWidget.hide()
self.searchTimer = QtCore.QTimer(
singleShot=True,
timeout=self.resetSearch,
interval=QtWidgets.QApplication.instance().keyboardInputInterval())
def resetSearch(self):
self.searchWidget.setText('')
self.searchWidget.hide()
def updateSearchWidget(self):
if not self.searchWidget.text():
self.searchWidget.hide()
return
self.searchWidget.show()
self.searchWidget.adjustSize()
geo = self.searchWidget.geometry()
geo.moveBottomRight(
self.viewport().geometry().bottomRight() - QtCore.QPoint(2, 2))
self.searchWidget.setGeometry(geo)
def keyboardSearch(self, search):
super().keyboardSearch(search)
if not search:
self.searchWidget.setText('')
else:
text = self.searchWidget.text()
if not text:
text = 'Searching: '
text += search
self.searchWidget.setText(text)
self.updateSearchWidget()
self.searchTimer.start()
def resizeEvent(self, event):
super().resizeEvent(event)
self.updateSearchWidget()
我有一个包含 1000 行数据的 table 小部件。并且为 table 自动实现了这个很好的功能,每当我们按下字母键时,它就会搜索匹配的数据。我想通过视觉辅助让它更直观一些。
我想创建一个标签来显示用户在过去 2 秒内输入的字母。它应该继续连接并显示新字母。如果用户停止输入新字母超过 2 秒,则标签应该消失。
我想我需要创建一种“管理器”功能,它可以接收按键并创建此标签并在 2 秒过去后终止它。问题是我不知道如何让这个函数“等待”新的击键。
我想这个视觉辅助不是什么新东西,之前可能有人实现过它,但我不知道它叫什么 Google 所以我很抱歉为它创建了一个 post .
您可以在子类中重新实现 tablewidget 的 keyboardSearch()
功能,然后创建一个子 widget,它将根据搜索进行自我更新。
请注意,搜索会根据 QApplication.keyboardInputInterval
自动重置,这使得搜索小部件出现的时间很短(直到视图可以接受新搜索作为当前搜索的一部分)。
from PyQt5 import QtCore, QtWidgets
from random import choice
from string import ascii_lowercase
class TableSearch(QtWidgets.QTableWidget):
def __init__(self):
super().__init__(0, 3)
self.setEditTriggers(self.NoEditTriggers)
for row in range(500):
self.insertRow(row)
for col in range(3):
text = ''.join(choice(ascii_lowercase) for i in range(5))
self.setItem(row, col, QtWidgets.QTableWidgetItem(text))
self.searchWidget = QtWidgets.QLabel(self)
self.searchWidget.setStyleSheet('''
QLabel {
border: 1px inset darkGray;
border-radius: 2px;
background: palette(window);
}
''')
self.searchWidget.hide()
self.searchTimer = QtCore.QTimer(
singleShot=True,
timeout=self.resetSearch,
interval=QtWidgets.QApplication.instance().keyboardInputInterval())
def resetSearch(self):
self.searchWidget.setText('')
self.searchWidget.hide()
def updateSearchWidget(self):
if not self.searchWidget.text():
self.searchWidget.hide()
return
self.searchWidget.show()
self.searchWidget.adjustSize()
geo = self.searchWidget.geometry()
geo.moveBottomRight(
self.viewport().geometry().bottomRight() - QtCore.QPoint(2, 2))
self.searchWidget.setGeometry(geo)
def keyboardSearch(self, search):
super().keyboardSearch(search)
if not search:
self.searchWidget.setText('')
else:
text = self.searchWidget.text()
if not text:
text = 'Searching: '
text += search
self.searchWidget.setText(text)
self.updateSearchWidget()
self.searchTimer.start()
def resizeEvent(self, event):
super().resizeEvent(event)
self.updateSearchWidget()