如何为 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()