def widget_popup_geometry(pos, widget): # type: (QPoint, QWidget) -> QRect widget.ensurePolished() if widget.testAttribute(Qt.WA_Resized): size = widget.size() else: size = widget.sizeHint() screen = QApplication.screenAt(pos) if screen is None: screen = QApplication.primaryScreen() screen_geom = screen.availableGeometry() size = size.boundedTo(screen_geom.size()) geom = QRect(pos, size) if geom.top() < screen_geom.top(): geom.moveTop(screen_geom.top()) if geom.left() < screen_geom.left(): geom.moveLeft(screen_geom.left()) bottom_margin = screen_geom.bottom() - geom.bottom() right_margin = screen_geom.right() - geom.right() if bottom_margin < 0: # Falls over the bottom of the screen, move it up. geom.translate(0, bottom_margin) # TODO: right to left locale if right_margin < 0: # Falls over the right screen edge, move the menu to the # other side of pos. geom.translate(-size.width(), 0) return geom
def show_tool_tip(pos: QPoint, text: str, widget: Optional[QWidget] = None, rect=QRect(), elide=Qt.ElideRight): """ Show a plain text tool tip with limited length, eliding if necessary. """ if widget is not None: screen = widget.screen() else: screen = QApplication.screenAt(pos) font = QApplication.font("QTipLabel") fm = QFontMetrics(font) geom = screen.availableSize() etext = fm.elidedText(text, elide, geom.width()) if etext != text: text = f"<span>{etext}</span>" QToolTip.showText(pos, text, widget, rect)