如何为 TableWidget 创建视觉辅助工具

Posted

技术标签:

【中文标题】如何为 TableWidget 创建视觉辅助工具【英文标题】:How create a visual aid for TableWidget 【发布时间】:2020-11-26 13:03:14 【问题描述】:

我有一个包含 1000 多行数据的表格小部件。并且有一个为表格自动实现的不错的功能,只要我们按下字母键,它就会搜索匹配的数据。我想通过视觉辅助使它更直观一点。

我想创建一个标签来显示用户在过去 2 秒内输入的字母。它应该继续连接并显示新字母。如果用户停止输入新字母超过 2 秒,那么标签应该会消失。

我认为我需要创建一种“管理器”功能,它会接收按键并创建此标签并在 2 秒后终止它。问题是我不知道如何让这个函数“等待”新的击键。

我想这个视觉辅助工具不是什么新东西,可能以前有人实施过,但我不知道它对 Google 的称呼,所以很抱歉为它创建了一个帖子。

【问题讨论】:

【参考方案1】:

您可以在子类中重新实现 tablewidget 的keyboardSearch() 函数,然后创建一个将根据搜索自行更新的子小部件。

请注意,搜索会根据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()

【讨论】:

以上是关于如何为 TableWidget 创建视觉辅助工具的主要内容,如果未能解决你的问题,请参考以下文章

如何为一个qt widget做一个滚动条

PyQt:如何为单个标题设置不同的标题大小?

ASP.NET:如何为 GridView 创建自定义分页器?

如何为 WPF 中的工具栏按钮创建热键?

d3:如何为堆积面积图聚焦单独的工具提示?

如何为智能目录应用程序设计数据库