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 QDateTimeEdit – 只获取QTime

    下面是Python PyQt5中QDateTimeEdit这个控件的只获取QTime的完整使用攻略。 1. PyQt5 QDateTimeEdit QDateTimeEdit是PyQt5中的一个时间日期编辑控件,它能够同时显示时间和日期,并且支持多种不同格式的展示方式。它常用于需要用户选择或者编辑时间日期的场合。 2. 只获取QTime 如果我们只需要获取Q…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget – 上个月按钮的背景颜色

    下面是详细的Python PyQt5 QCalendarWidget-上个月按钮的背景颜色使用攻略。 1. PyQt5 QCalendarWidget 1.1 介绍 QCalendarWidget是Qt库中用于显示日历的小部件,可以方便的选择日期和时间,并提供丰富的信号和槽函数,便于与其他小部件交互。 1.2 使用方法 创建QCalendarWidget对象…

    python 2023年5月12日
    00
  • PyQt5 QDial 获取包装属性

    下面将详细讲解Python的“PyQt5 QDial获取包装属性”的完整使用攻略。 什么是PyQt5 QDial获取包装属性 PyQt5是一种GUI框架,QDial则是PyQt5中的一个旋转式(也称为“圆盘式”)控件,可以用来选择一个数值,通常用于模拟仪器或音量控件。 在PyQt5中,用户可以包装QDial来实现一些常见的功能,如获取QDial的当前值,设置…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 获取最宽字符的宽度

    PyQt5 QSpinBox-获取最宽字符的宽度 QSpinBox 是 PyQt5 中的一个小部件,它允许用户输入一个整数值并将其作为一个数值进行处理。本文将介绍如何获取 QSpinBox 中最宽字符的宽度。 1. 导入模块 首先,需要导入 PyQt5 的相关模块: from PyQt5.QtWidgets import QApplication, QSpi…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 获取当前几何图形

    PyQt5是Python中主流的GUI开发框架之一,提供了众多的UI控件,在实际开发中使用非常方便。其中,QSpinBox是一种用于输入数字的UI控件,它可以根据需求调整自己的大小、范围等属性。本文将分享如何在PyQt5应用程序中获取QSpinBox的当前几何图形,并给出两个示例说明。 获取QSpinBox当前几何图形的方法 在PyQt5中,可以利用QSpi…

    python 2023年5月12日
    00
  • PyQt5 – 在反悬停状态下改变标签的背景颜色

    PyQt5 是一种 Python 解释器的 GUI 工具包。它允许程序员在 python 上创建桌面应用程序。此外,PyQt5 还包含了一个 Qt Designer,可以用来创建 Qt 应用程序的图形用户界面。在 PyQt5 中通过 QSS(Qt样式表) 可以很方便的设置 GUI 界面的样式。本文将介绍如何通过 PyQt5 在反悬停状态下改变标签的背景颜色。…

    python 2023年5月10日
    00
  • PyQt5 QCalendarWidget 获取掩码

    当我们在使用 PyQt5 开发界面时,可能需要使用一些常见的控件,如日历选择控件 QCalendarWidget。在其中,我们可能会需要对 QCalendarWidget 进行限制,让其仅能选择某些特定日期。这时,我们就可以使用 QCalendarWidget 的掩码特性,以筛选可选日期。本文将详细讲解 Python 的 PyQt5 QCalendarWid…

    python 2023年5月12日
    00
  • PyQt5 QListWidget – 获取调整大小模式属性

    PyQt5是一个基于QT框架的python GUI编程库,可以用于创建各种用户界面应用程序。QListWidget是PyQt5提供的一种控件类型,类似于列表、表格等数据视图控件,可以用于展示和编辑一系列条目。 获取QListWidget的调整大小模式属性是一种常见需求,可以通过以下步骤来实现: 创建QListWidget对象 使用PyQt5的QListWid…

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