PyQt5可滚动标签 – 获取标签部分的工具提示时间

  • Post category:Python

题目说明

这个题目是要求讲解如何使用PyQt5实现可滚动标签并且获取标签部分的工具提示时间。这个问题其实可以拆成两个部分:如何实现可滚动标签和如何获取标签部分的工具提示时间。下面将分别讲解这两个部分的实现方法。

实现可滚动标签:

实现可滚动标签大概分下面几个步骤:

  1. 创建带有滚动条的QScrollArea控件
  2. 在QScrollArea中放置一个QWidget控件
  3. 在QWidget控件中放置多个QLabel标签

下面是完整源码及注释:

from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QToolTip
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QScrollArea, QVBoxLayout

class ScrollableLabel(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 设置一个滚动区域
        self.scroll_area = QScrollArea(self)
        self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll_area.setWidgetResizable(True)

        # 设置一个部件
        self.widget = QWidget(self)

        # 设置一个QVBoxLayout布局
        layout = QVBoxLayout(self)

        # 将布局设置为部件的布局
        self.widget.setLayout(layout)

        # 给部件的布局添加多个QLabel标签
        for i in range(50):
            label = QLabel(f'label {i}', self.widget)

            # 给QLabel标签设置工具提示
            label.setToolTip(f'tooltip for label {i}')
            layout.addWidget(label)

        # 将部件添加到滚动区域中
        self.scroll_area.setWidget(self.widget)

        # 最后将滚动区域添加到主窗口中
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.scroll_area)
        self.setLayout(vbox)

    # 重新实现事件处理函数,当有鼠标移动事件时触发
    def eventFilter(self, obj, event):
        if event.type() == QEvent.MouseMove:
            # 获取鼠标当前坐标的QWidget部件
            widget = self.widget.childAt(event.pos())
            if widget and isinstance(widget, QLabel):
                # 显示标签部分的工具提示
                QToolTip.showText(event.globalPos(), widget.toolTip())

        return super().eventFilter(obj, event)

实现获取标签部分的工具提示时间:

上述代码中已经给每个QLabel标签设置了工具提示,这里就是讲解如何获取标签部分的工具提示时间。

# 重新实现事件处理函数,当有鼠标移动事件时触发
def eventFilter(self, obj, event):
    if event.type() == QEvent.MouseMove:
        # 获取鼠标当前坐标的QWidget部件
        widget = self.widget.childAt(event.pos())
        if widget and isinstance(widget, QLabel):
            # 显示标签部分的工具提示
            QToolTip.showText(event.globalPos(), widget.toolTip())

            # 获取标签部分的工具提示时间
            tip_duration = QToolTip.tipDuration()
            print(f'tooltip duration for widget {widget.text()}: {tip_duration}ms')

    return super().eventFilter(obj, event)

完整示例:

from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QToolTip
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QScrollArea, QVBoxLayout

class ScrollableLabel(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 设置一个滚动区域
        self.scroll_area = QScrollArea(self)
        self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.scroll_area.setWidgetResizable(True)

        # 设置一个部件
        self.widget = QWidget(self)

        # 设置一个QVBoxLayout布局
        layout = QVBoxLayout(self)

        # 将布局设置为部件的布局
        self.widget.setLayout(layout)

        # 给部件的布局添加多个QLabel标签
        for i in range(50):
            label = QLabel(f'label {i}', self.widget)

            # 给QLabel标签设置工具提示
            label.setToolTip(f'tooltip for label {i}')
            layout.addWidget(label)

        # 将部件添加到滚动区域中
        self.scroll_area.setWidget(self.widget)

        # 最后将滚动区域添加到主窗口中
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.scroll_area)
        self.setLayout(vbox)

        # 安装事件过滤器,当有鼠标移动事件时,调用eventFilter函数
        self.widget.installEventFilter(self)

    # 重新实现事件处理函数,当有鼠标移动事件时触发
    def eventFilter(self, obj, event):
        if event.type() == QEvent.MouseMove:
            # 获取鼠标当前坐标的QWidget部件
            widget = self.widget.childAt(event.pos())
            if widget and isinstance(widget, QLabel):
                # 显示标签部分的工具提示
                QToolTip.showText(event.globalPos(), widget.toolTip())

                # 获取标签部分的工具提示时间
                tip_duration = QToolTip.tipDuration()
                print(f'tooltip duration for widget {widget.text()}: {tip_duration}ms')

        return super().eventFilter(obj, event)

if __name__ == '__main__':
    app = QApplication([])
    w = ScrollableLabel()
    w.show()
    app.exec_()

通过运行上述程序,我们将会得到一个可以滚动的标签部件,并且当鼠标移动到某个标签上时,会弹出该标签的工具提示,并且在控制台打印出该工具提示的时间。