| 15 | |
| 16 | |
| 17 | class ToolTip(QWidget): |
| 18 | |
| 19 | _instance = None |
| 20 | TimeOut = 2000 |
| 21 | |
| 22 | def __init__(self, *args, **kwargs): |
| 23 | super(ToolTip, self).__init__(*args, **kwargs) |
| 24 | self.setWindowFlags(self.windowFlags() | Qt.ToolTip | |
| 25 | Qt.FramelessWindowHint) |
| 26 | self.setAttribute(Qt.WA_TranslucentBackground, True) |
| 27 | self.setVisible(False) |
| 28 | layout = QVBoxLayout(self, spacing=0) |
| 29 | layout.setContentsMargins(0, 0, 0, 0) |
| 30 | self.label = QLabel(self) |
| 31 | self.label.setAlignment(Qt.AlignCenter) |
| 32 | self.label.setContentsMargins(0, 0, 0, 0) |
| 33 | layout.addWidget(self.label) |
| 34 | # 定时隐藏 |
| 35 | self._hideTimer = QTimer(self, timeout=self.hide) |
| 36 | |
| 37 | @classmethod |
| 38 | def bind(cls, widget): |
| 39 | if not cls._instance: |
| 40 | cls._instance = cls() |
| 41 | widget.installEventFilter(cls._instance) |
| 42 | |
| 43 | def setText(self, text): |
| 44 | self.label.setText(text) |
| 45 | |
| 46 | def eventFilter(self, widget, event): |
| 47 | if isinstance(event, QHelpEvent): |
| 48 | return True |
| 49 | # self.hide() |
| 50 | # self._hideTimer.stop() |
| 51 | # self.setText(widget.toolTip()) |
| 52 | # if not widget.toolTip(): |
| 53 | # return True |
| 54 | # self.show() |
| 55 | # # 自动隐藏 |
| 56 | # self._hideTimer.start(self.TimeOut) |
| 57 | # pos = widget.mapToGlobal(QPoint(0, 0)) |
| 58 | # self.move(pos.x() + widget.width() + 30, |
| 59 | # pos.y() + int((widget.height() - self.height()) / 2)) |
| 60 | # return True |
| 61 | t = event.type() |
| 62 | if t == QEvent.Enter: # 鼠标进入 |
| 63 | self.hide() |
| 64 | self._hideTimer.stop() |
| 65 | self.setText(widget.toolTip()) |
| 66 | if widget.toolTip(): |
| 67 | self.show() |
| 68 | # 自动隐藏 |
| 69 | self._hideTimer.start(self.TimeOut) |
| 70 | pos = widget.mapToGlobal(QPoint(0, 0)) |
| 71 | self.move(pos.x() + widget.width() + 30, |
| 72 | pos.y() + int((widget.height() - self.height()) / 2)) |
| 73 | elif t == QEvent.Leave: # 鼠标离开 |
| 74 | self._hideTimer.stop() |
no outgoing calls