PyQt QToolTip
最后修改于 2023 年 8 月 24 日
在本文中,我们将展示如何在 PyQt 中使用工具提示 (tooltips)。
访问 PyQt6 教程,或列出所有 PyQt 教程。
,阅读QToolTip
QToolTip
为任何组件提供工具提示(气泡帮助)。它是一段简短的文本,用于提醒用户组件的功能。工具提示可以包含富文本。
工具提示可以通过 QWidget.setToolTip
或 QToolTip.showText
成员函数来设置。
PyQt QToolTip 示例
下面是一个使用 QToolTip
的简单示例。
#!/usr/bin/python import sys from PyQt6.QtWidgets import QWidget, QToolTip, QPushButton, QApplication from PyQt6.QtGui import QFont class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Tooltips') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
在此示例中,我们为两个 PyQt5 组件显示了工具提示。
QToolTip.setFont(QFont('SansSerif', 10))
这个静态方法设置了用于渲染工具提示的字体。我们使用 10pt 的 SansSerif 字体。
self.setToolTip('This is a <b>QWidget</b> widget')
要创建工具提示,我们调用 setTooltip
函数。我们可以使用富文本格式。
btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
我们创建了一个按钮组件,并为其设置了工具提示。

带样式的 QToolTip
在下面的示例中,我们使用样式表来为工具提示设置样式。
#!/usr/bin/python import sys from PyQt6.QtWidgets import QWidget, QToolTip, QApplication from PyQt6.QtGui import QFont, QPalette, QColor class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setStyleSheet('''QToolTip { background-color: #8ad4ff; color: black; border: #8ad4ff solid 1px }''') QToolTip.setFont(QFont('Georgia', 11)) pal = QPalette() pal.setColor(QPalette.ColorRole.Window, QColor('#348ceb')) self.setPalette(pal) self.setToolTip('This is QWidget') self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Styled QToolTip') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
我们使用样式表来改变工具提示的外观。此外,我们还使用 QPalette
来更改 QWidget
的背景颜色。
self.setStyleSheet('''QToolTip { background-color: #8ad4ff; color: black; border: #8ad4ff solid 1px }''')
我们更改了工具提示的背景颜色、前景颜色和边框。
pal = QPalette() pal.setColor(QPalette.ColorRole.Window, QColor('#348ceb')) self.setPalette(pal)
我们使用 QPalette
更改了主组件的背景颜色。

QToolTip 鼠标位置
下面的示例在工具提示中显示鼠标位置。
#!/usr/bin/python import sys from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QWidget, QApplication, QGridLayout, QToolTip class MyWidget(QWidget): def __init__(self): super().__init__() self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) self.setStyleSheet( 'QWidget { background: #007AA5; border-radius: 3px;}') self.setMouseTracking(True) def mouseMoveEvent(self, e): self.x = e.pos().x() self.y = e.pos().y() p = self.mapToGlobal(e.pos()) QToolTip.showText(p, f'{self.x}:{self.y}') class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() r = c = 0 for _ in range(9): grid.addWidget(MyWidget(), r, c) c += 1 if c % 3 == 0: c = 0 r += 1 self.setLayout(grid) self.setGeometry(400, 300, 500, 350) self.setWindowTitle('Mouse positions') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
我们在主组件中放置了九个组件。当我们将光标放在其中一个组件上时,会显示一个工具提示,其中包含相对于该组件的鼠标位置。
self.setMouseTracking(True)
为了捕获鼠标移动事件,我们需要调用 setMouseTracking
。
def mouseMoveEvent(self, e): self.x = e.pos().x() self.y = e.pos().y() p = self.mapToGlobal(e.pos()) QToolTip.showText(p, f'{self.x}:{self.y}')
在重写的 mouseMoveEvent
函数中,我们确定鼠标坐标,并使用 showText
将其显示在工具提示中。

在绘制的图形上的 QToolTip
下面的示例展示了在绘制的图形上显示工具提示。
#!/usr/bin/python import sys from PyQt6.QtCore import QEvent, QPointF, Qt from PyQt6.QtGui import QColor, QPainter, QPainterPath, QPolygonF from PyQt6.QtWidgets import QApplication, QToolTip, QWidget class Shape(object): def __init__(self): self.mypath = QPainterPath() self.col = QColor() self.toottip = '' def path(self): return self.mypath def color(self): return self.col def toolTip(self): return self.toottip def setPath(self, path): self.mypath = path def setToolTip(self, tooltip): self.toottip = tooltip def setPosition(self, position): self.pos = position def setColor(self, color): self.col = color class Example(QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): self.circlePath = QPainterPath() self.squarePath = QPainterPath() self.trianglePath = QPainterPath() self.pentagonPath = QPainterPath() self.shapes = [] self.circlePath.addEllipse(30, 50, 100, 100) self.squarePath.addRect(180, 50, 100, 100) x = self.trianglePath.currentPosition().x() y = self.trianglePath.currentPosition().y() self.trianglePath.moveTo(320, 150) self.trianglePath.lineTo(450, 150) self.trianglePath.lineTo(415, 50) self.trianglePath.lineTo(320, 150) polygon = QPolygonF() polygon.append(QPointF(130, 240)) polygon.append(QPointF(100, 280)) polygon.append(QPointF(50, 280)) polygon.append(QPointF(20, 240)) polygon.append(QPointF(75, 200)) self.pentagonPath.addPolygon(polygon) self.createShape(self.circlePath, 'Circle', QColor('#c72602')) self.createShape(self.squarePath, 'Square', QColor('#32a852')) self.createShape(self.trianglePath, 'Triangle', QColor('#205f6e')) self.createShape(self.pentagonPath, 'Pentagon', QColor('#e0b107')) self.setWindowTitle('Shapes') self.resize(480, 300) self.show() def event(self, e): if e.type() == QEvent.Type.ToolTip: index = self.itemIndexAt(e.pos()) if index != -1: QToolTip.showText(e.globalPos(), self.shapes[index].toolTip()) else: QToolTip.hideText() e.ignore() return True return super(Example, self).event(e) def paintEvent(self, e): painter = QPainter(self) painter.setRenderHint(QPainter.RenderHint.Antialiasing) painter.setPen(Qt.PenStyle.NoPen) for shape in self.shapes: painter.setBrush(shape.color()) painter.drawPath(shape.path()) def itemIndexAt(self, pos): for i in range(len(self.shapes)): item = self.shapes[i] if item.path().contains(QPointF(pos)): return i return -1 def createShape(self, path, toolTip, color): shape = Shape() shape.setPath(path) shape.setToolTip(toolTip) shape.setColor(color) self.shapes.append(shape) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
在此示例中,我们绘制了四种图形:圆形、正方形、五边形和三角形。将鼠标悬停在每个图形上都会触发一个显示图形类型的工具提示。
def event(self, e): if e.type() == QEvent.Type.ToolTip: ...
没有专门的工具提示事件处理器。要捕获工具提示事件,我们需要重写 event
处理器,它是主事件处理器,接收所有组件的事件。
index = self.itemIndexAt(e.pos())
所有四个图形都存储在 shapes
变量中。自定义函数 itemIndexAt
用于确定我们的鼠标指针是否悬停在某个图形上。如果悬停,它会返回该图形在 shapes
集合中的索引,否则返回 -1。
if index != -1: QToolTip.showText(e.globalPos(), self.shapes[index].toolTip()) else: QToolTip.hideText() e.ignore() return True
对于有效的索引,我们使用 showText
显示一个工具提示。如果我们在图形之外,则忽略工具提示。
return super(Example, self).event(e)
由于我们正在重写接收所有类型事件的 event
函数,我们需要将所有非工具提示的事件冒泡出去以进行处理。
def itemIndexAt(self, pos): for i in range(len(self.shapes)): item = self.shapes[i] if item.path().contains(QPointF(pos)): return i return -1
itemIndexAt
确定当前鼠标光标点下方的图形索引(如果有的话)。QPainterPath
的 contains
函数在给定点位于路径内部时返回 True
。

在本文中,我们学习了如何使用 PyQt 的 QToolTip
。
作者
列出所有 PyQt 教程。