PyQt5可滚动标签 – 检索工具提示文本

我来为你详细讲解 Python 的 “PyQt5 可滚动标签 - 检索工具提示文本”的完整使用攻略。

前置知识

在学习 PyQT5 可滚动标签 - 检索工具提示文本之前,还需要掌握一些基础知识:

  1. Python 语言基础;
  2. PyQT5 的基本使用方法(如主窗口、布局管理器等);
  3. PyQt5 的信号和槽机制;
  4. Python 的正则表达式。

实现步骤

PyQt5 可滚动标签 - 检索工具提示文本主要是实现了在标签中添加滚动条,并且支持通过关键词搜索标签列表来快速定位到相应的标签。具体实现步骤如下:

  1. 创建一个 PyQT5 应用程序;
  2. 创建一个 QGridLayout 布局管理器,用来放置标签控件和滚动条控件;
  3. 创建滚动条控件,并设置相应的滚动范围和页面大小;
  4. 创建标签控件,并设置相应的工具提示文本;
  5. 通过正则表达式匹配标签控件中的文本内容,如果匹配成功,则设置相应的背景色;
  6. 将标签和滚动条控件放置到布局管理器中;
  7. 将布局管理器设置为主窗口的布局;
  8. 显示主窗口。

下面我们将逐步讲解每一步的详细实现方法。

1. 创建 PyQT5 应用程序

创建 PyQT5 应用程序可以使用以下代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    window.show()
    sys.exit(app.exec_())

这段代码创建了一个 QApplication 对象,并使用 QWidget 创建一个空窗口并显示。当程序退出时,调用 sys.exit() 终止程序。

2. 创建布局管理器

在创建布局管理器前,需要先创建一个包含标签控件的列表。这里我们使用以下代码创建一个包含 100 个标签控件的列表:

from PyQt5.QtWidgets import QLabel

labels = [QLabel(f"标签 {i}") for i in range(100)]

然后我们创建一个 QGridLayout 布局管理器,并设置相应的间距和尺寸:

from PyQt5.QtWidgets import QGridLayout

layout = QGridLayout()
layout.setVerticalSpacing(5)
layout.setHorizontalSpacing(5)
layout.setContentsMargins(0, 0, 0, 0)

3. 创建滚动条控件

创建滚动条控件可以使用 QScrollBar 类。在此之前,我们需要先计算出滚动条的范围和页面大小:

viewport_height = 400
page_step = 4
max_scroll = len(labels) - viewport_height

然后使用 QScrollBar 类创建一个垂直方向的滚动条:

from PyQt5.QtWidgets import QScrollBar

scroll_bar = QScrollBar()
scroll_bar.setOrientation(1)
scroll_bar.setMinimum(0)
scroll_bar.setMaximum(max_scroll)
scroll_bar.setSingleStep(1)
scroll_bar.setPageStep(page_step * viewport_height)

其中,setOrientation 方法用于设置滚动条的方向(0 为水平方向、1 为垂直方向),其他方法的含义可以通过文档进行查找。

4. 创建标签控件

我们已经使用 QLabel 类创建了一些标签,现在我们需要设置这些标签的工具提示文本:

for label in labels:
    label.setToolTip(label.text())

5. 匹配标签文本并设置背景色

我们可以使用 Python 的正则表达式库 re,匹配标签中的文本:

import re

r = re.compile(r"(\d+)")
for label in labels:
    if r.search(label.text()):
        label.setStyleSheet("background-color: #f00")

这段代码会匹配标签文本中的任意数字,如果匹配成功,则设置相应的背景色。

6. 将标签和滚动条控件放置到布局管理器中

我们可以使用 addWidget 方法将标签和滚动条控件放置到布局管理器的相应位置:

for i, label in enumerate(labels):
    layout.addWidget(label, i, 0)
layout.addWidget(scroll_bar, 0, 1, len(labels), 1)

7. 将布局管理器设置为主窗口的布局

window.setLayout(layout)

8. 显示主窗口

最后将创建的主窗口显示出来:

window.show()

至此,我们就实现了 PyQT5 可滚动标签 - 检索工具提示文本功能的所有步骤。

示例说明

下面我们来介绍两个示例,分别是实现一个具有可搜索性和滚动条的列表和一个伪造的表。

示例1:可搜索性和滚动条的列表

该示例使用 QListView 和 QSortFilterProxyModel 在 QTableView 中创建具有可搜索性和可滚动性的列表,可以快速地定位到特定的行和节省时间。

以下是完整的 Python 代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class SortFilterProxyModel(QSortFilterProxyModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.filter_pattern = ""

    def setFilterPattern(self, pattern):
        self.filter_pattern = pattern
        self.invalidateFilter()

    def filterAcceptsRow(self, source_row, source_parent):
        if not self.filter_pattern:
            return True
        index = self.sourceModel().index(source_row, 0, source_parent)
        if len(self.filter_pattern) > 1:
            group = self.filter_pattern[0]
            pattern = self.filter_pattern[1:]
            if group == "r":
                return self.sourceModel().data(index).lower().startswith(pattern.lower())
            elif group == "w":
                return pattern in self.sourceModel().data(index).lower().split()
        else:
            return self.sourceModel().data(index).lower().startswith(self.filter_pattern.lower())

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setWindowTitle("PyQt5 ListView with Filter and ScrollBar")

        self.list_model = QStringListModel([str(i) for i in range(1000)])
        self.sort_filter_model = SortFilterProxyModel(self)
        self.sort_filter_model.setSourceModel(self.list_model)

        self.list_view = QListView()
        self.list_view.setModel(self.sort_filter_model)

        self.search_line_edit = QLineEdit()
        self.search_line_edit.textChanged.connect(self.on_filter_changed)

        self.scroll_bar = QScrollBar()
        self.scroll_bar.setMaximum(1000)
        self.scroll_bar.valueChanged.connect(self.list_view.scrollTo)

        layout = QVBoxLayout()
        layout.addWidget(self.search_line_edit)
        layout.addWidget(self.list_view)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

        self.setGeometry(100, 100, 600, 400)

    def on_filter_changed(self, text):
        self.sort_filter_model.setFilterPattern(text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在这个示例中,我们通过 QStringListModel 创建了一个包含 1000 个数字字符串的模型,并将其作为原始模型传递给 SortFilterProxyModel,然后在 QListView 中显示 SortFilterProxyModel

SortFilterProxyModel 中,我们重写了 setFilterPatternfilterAcceptsRow 两个方法,实现了根据文本过滤包含或开始的行和单词的功能。这里,r 表示开始,w 表示单词。然后,在主窗口类中,我们在 QLineEdit 中创建文本修改信号,并在 sort_filter_model 中调用 setFilterPattern 方法。

最后,我们创建了一个滚动条控件,并在其值更改时将 list_view 滚动到指定的位置。

示例 2:伪造的表

这个示例是一个伪造的表。我们使用 QTreeView 的可滚动性和大量虚拟行/列的优势来模拟一个大型表。

以下是完整的 Python代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Model(QAbstractItemModel):
    def __init__(self, rows=50000, cols=10, headers=[]):
        QAbstractItemModel.__init__(self)
        self._rows = rows
        self._cols = cols
        self._headers = headers

    def columnCount(self, parent=QModelIndex()):
        return self._cols

    def rowCount(self, parent=QModelIndex()):
        return self._rows

    def index(self, row, column, parent=QModelIndex()):
        return self.createIndex(row, column, parent)

    def parent(self, index):
        return QModelIndex()

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            return str(index.row() + 1) + "," + str(index.column() + 1)
        else:
            return None

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            if section < len(self._headers):
                return self._headers[section]
            else:
                return "Header " + str(section + 1)
        else:
            return None

    def flags(self, index):
        return Qt.ItemIsEnabled | Qt.ItemIsSelectable

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        self.setWindowTitle("PyQt5 Virtual Table with ScrollBar")

        self.model = Model(rows=50000, cols=50, headers=["Header " + str(h) for h in range(50)])
        self.view = QTreeView(self)
        self.view.setModel(self.model)
        self.view.setUniformRowHeights(True)
        self.view.verticalScrollBar().setSingleStep(1)

        self.h_scroll_bar = QScrollBar(Qt.Horizontal)
        self.h_scroll_bar.setMaximum(self.model.columnCount(None) - 1)
        self.h_scroll_bar.sliderMoved.connect(self.view.scrollTo)
        self.h_scroll_bar.valueChanged.connect(self.view.scrollTo)
        self.h_scroll_bar.sliderReleased.connect(self.view.scrollTo)

        self.v_scroll_bar = QScrollBar(self)
        self.v_scroll_bar.setMaximum(self.model.rowCount(None) - 1)
        self.v_scroll_bar.sliderMoved.connect(self.view.scrollTo)
        self.v_scroll_bar.sliderReleased.connect(self.view.scrollTo)
        self.v_scroll_bar.valueChanged.connect(self.update_h_scroll_max)

        splitter = QSplitter(Qt.Horizontal, self)
        splitter.addWidget(self.view)
        splitter.addWidget(self.v_scroll_bar)
        splitter.setHandleWidth(2)
        splitter.addWidget(self.h_scroll_bar)

        self.setCentralWidget(splitter)

    def update_h_scroll_max(self, value):
        v_scroll_max = self.v_scroll_bar.maximum()
        visible_height = self.view.viewport().height()
        row_height = self.view.rowHeight(0)
        if row_height > 0:
            viewable_rows = visible_height / row_height
            total_cols = self.model.columnCount(None)
            max_cols = int(total_cols - (visible_height - (v_scroll_max - value) * row_height) // (row_height * viewable_rows)) - 1
            self.h_scroll_bar.setMaximum(max_cols)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在这个示例中,我们定义了一个 Model 类来伪造具有 50000 行和 50 列的表。在 Model 类的 data 方法中,我们使用行和列编号生成模拟的单元格文本。

然后,在主窗口类中,我们创建了一个 QTreeView 并将其设置为 Model 类的模型。

我们还创建了一个垂直和水平方向的滚动条,以及一个分隔符。在视图中使用垂直滚动条时,我们在 h_scroll_bars 中设置最大值。最后,我们将分隔符设置为主窗口的中心小部件。

在这两个示例中,都用到了可滚动标签,可以通过上述的代码进行查看和参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5可滚动标签 – 检索工具提示文本 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • PyQt5 – 如何为复选框的不确定指标设置皮肤

    PyQt5是一个强大的Python GUI框架,可以创建各种窗体、控件等,支持不同的主题和皮肤来自定义应用程序的界面。本次教程将讲解如何为复选框的不确定指标设置皮肤。 设置复选框的不确定状态 复选框的不确定状态在PyQt5中也被称为“半选中状态”,通常在复选框表示多个选项时使用。在PyQt5中设置复选框的不确定状态很简单,只需设置其状态为Qt.Partial…

    python 2023年5月10日
    00
  • PyQt5 QDateTimeEdit – 在给定的索引中查找部分内容

    当我们用 PyQt5 为界面设计时,PyQt5 的 QDateTimeEdit 组件可用于显示日期和时间,同时也可以进行编辑。为了方便用户使用,我们可以为该组件添加一些增强功能,使得用户可以在一些特定的条件下,更容易地操作内容。 其中之一的增强功能是:在给定的索引范围内查找部分内容,例如日历视图或时间选择器。下面是一个完整的使用攻略: 1. 创建 QDate…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget 设置边框

    首先,在PyQt5中使用QCalendarWidget类为用户提供了一个日历优美的控件,并且该控件还允许用户选择日期并与其他组件进行交互。以下是PyQt5 QCalendarWidget设置边框的完整使用攻略: 设置QCalendarWidget边框的方法 使用QSS(Qt样式表)设置边框样式 通过设置QCalendarWidget的样式表,您可以轻松地设置…

    python 2023年5月12日
    00
  • PyQt5 – 单选按钮中内容的字体和大小

    下面是关于Python的PyQt5 – 单选按钮中内容的字体和大小的完整使用攻略: 1. 简介 单选按钮是常见的用户控件,常用于交互性质较强的应用中。在PyQt5中,可以通过设置样式表来实现单选按钮内容的字体和大小的修改。 2. 基本语法 单选按钮的字体和大小可以通过设置样式表的方式来修改,在样式表中通过设置font-family和font-size属性来控…

    python 2023年5月10日
    00
  • PyQt5 QCommandLinkButton – 切换可检查按钮

    PyQt5是Python中常用的GUI开发工具包,其中QCommandLinkButton是PyQt5中常用的一个按钮控件之一。本文将详细讲解如何使用PyQt5编写QCommandLinkButton控件,以及如何实现切换可检查按钮的功能。 QCommandLinkButton简介 QCommandLinkButton是PyQt5中的一个按钮控件,它提供了一…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 添加动作

    PyQt5 QSpinBox是一个数字输入框控件,它可以让用户输入整数。本文将详细讲解如何在PyQt5 QSpinBox中添加动作。 1. 添加动作 使用PyQt5 QSpinBox中的setButtonSymbols()和setSuffix()方法可以轻松地在SpinBox中添加动作,例如: from PyQt5.QtWidgets import QApp…

    python 2023年5月12日
    00
  • PyQt5 拖放

    PyQt5是一个流行的Python GUI编程框架,它可以用于创建漂亮的桌面程序。其中拖放功能也是PyQt5中一个非常有用和常见的功能,可以方便用户操作和实现页面交互等效果。下面我们来详细讲解如何在PyQt5中实现拖放功能。 一、准备工作 在使用PyQt5拖放功能之前,需要安装PyQt5框架和Qt Designer工具。 安装PyQt5框架: !pip in…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 设置可访问的名称

    PyQt5是一个Python的GUI库,其中QSpinBox是PyQt5中的一个控件,其可以设置可访问的名称,用于供有特殊需求的用户使用。 设置可访问的名称的方法是通过setAccessibleName()函数实现,该函数可以设置控件的可访问名称(accessibility is a measure of ease of use for those who …

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部