我有一个继承自
Qlabel
的自定义小部件,它有一个 painEvent
成员,可以绘制一堆点,我需要为每个点设置不同的工具提示。
这是我所拥有的一个简化的独立示例:
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtWidgets import QLabel, QSizePolicy
from PyQt5.QtGui import QPixmap, QPainter, QPen
class MyWidget(QLabel):
def __init__(self):
super().__init__()
self._pixmap = QPixmap()
canvas = QPixmap(1020, 100)
canvas.fill(Qt.white)
self.setPixmap(canvas)
self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.point_data = []
def paintEvent(self, event):
painter = QPainter(self)
pen = QPen(Qt.black, 3)
painter.setPen(pen)
painter.drawLine(10, 50, 1000, 50)
pen.setWidth(15)
painter.setPen(pen)
for p in self.point_data:
point = QPoint(p['pos'], 50)
point.setTooltip(p['info_str'])
painter.drawPoint(point)
painter.end()
app = QApplication([])
window = MyWidget()
window.point_data = [
{'pos': 50, 'info_str': 'hello'},
{'pos': 200, 'info_str': 'goodbye'}
]
window.show()
app.exec()
这不会绘制任何点并打印错误
'QPoint' object has no attribute 'setTooltip'
。如果我删除 point.setTooltip(p['info_str'])
行,它就可以工作。
那么如何添加工具提示?
QPoint 是一个存储位置但不与任何图形元素关联的对象。如果你想使用多个工具提示,那么你必须检测你想要的位置是否被单击并显示 QToolTip。比如:
def mousePressEvent(self, event):
pos = event.pos()
for p in self.point_data:
if p['pos'] == pos:
QToolTip.showText(pos, p['info_str'], self)
return