<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Glad I could help!</div><div dir="ltr">I've never used HoverEvents, but if it suits your needs, that's ok :-)</div><div dir="ltr"><br></div><div dir="ltr">Yes, another issue with QToolTip is the delay after their event is called.<br>Since Qt5 it can be customized, though, by setting a QProxyStyle that returns the timeout in milliseconds when SH_ToolTip_WakeUpDelay styleHint is requested.</div><div>This is a small example that allows you to set a 0 timeout for specific widgets:</div><div><br></div><div><div><font face="monospace, monospace">class MyStyle(QtWidgets.QProxyStyle):</font></div><div><font face="monospace, monospace">    toolTipTimeouts = {}</font></div><div><font face="monospace, monospace">    def styleHint(self, hint, option, widget, returnData):</font></div><div><font face="monospace, monospace">        if hint == QtWidgets.QStyle.SH_ToolTip_WakeUpDelay:<br></font></div><div><font face="monospace, monospace">            try:</font></div><div><font face="monospace, monospace">                return self.</font><span style="font-family:monospace,monospace">toolTipTimeouts[widget]</span></div><div><span style="font-family:monospace,monospace">            except:</span></div><div><font face="monospace, monospace">                pass</font></div><div><font face="monospace, monospace">        return QtWidgets.QProxyStyle.styleHint(self, hint, option, widget, </font><span style="font-family:monospace,monospace">returnData</span><font face="monospace, monospace">)</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class MyWindow(QtWidgets.QMainWindow):</font></div><div><font face="monospace, monospace">    def __init__(self):</font></div><div><font face="monospace, monospace">        [...]</font></div><div><font face="monospace, monospace">        self.widget = SomeWidget()</font></div><div><font face="monospace, monospace">        self.style()</font><font face="monospace, monospace">.</font><span style="font-family:monospace,monospace">toolTipTimeouts[</span><font face="monospace, monospace">self.widget] = 0</font><br></div><div><font face="monospace, monospace">        #optional, if you need to remove widgets at a certain point, </font></div><div><font face="monospace, monospace">        #allowing the garbage collector to free up memory</font></div><div><font face="monospace, monospace">        self.widget.destroyed.connect(self.style().toolTipTimeouts.pop)</font></div><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace">app = QtWidgets.QApplication(sys.argv)</font></div><div><font face="monospace, monospace">app.setStyle(MyStyle())</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">In this way the QProxyStyle will immediately call the QEvent.ToolTip for the specified widgets.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Maurizio</font></div></div></div></div></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il giorno mar 22 gen 2019 alle ore 16:21 Tong Zhang <<a href="mailto:warriorlance@gmail.com">warriorlance@gmail.com</a>> ha scritto:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Thanks, Maurizio! I've got what I want from your message, BTW, I used <br>
hover event to trig the help message to show on a textedit, since I <br>
found tooltip event responses a little bit slower than I want, maybe <br>
there is someway to speed up.<br>
<br>
Tong<br>
<br>
On 1/21/19 6:40 PM, Maurizio Berti wrote:<br>
> Using standard tooltips might be an issue in some (not so special) <br>
> cases, as QToolTip events are strictly related to the widget events, so <br>
> you'll need to install an eventFilter on every single widget you'll want <br>
> the behavior you ask about.<br>
> A simple implementation would be something like this:<br>
> <br>
>      def __init__(self, *args, **kwargs):<br>
>          [...]<br>
>          self.toolTipWidget = QtWidgets.QLabel()<br>
>          [...]<br>
>          self.someWidget = SomeWidget()<br>
>          self.someWidget.setToolTip('I am a tooltip!')<br>
>          self.someWidget.installEventFilter(self)<br>
>          [...]<br>
> <br>
>      def eventFilter(self, source, event):<br>
>          if event.type() == QtCore.QEvent.ToolTip:<br>
>              self.toolTipWidget.setText(source.toolTip())<br>
>          return QtWidgets.QWidget.eventFilter(self, source, event)<br>
> <br>
> On the other hand, I'd suggest to use the StatusTip instead of the <br>
> ToolTip: it's something I've successfully used for something similar to <br>
> your needs: in this way you can keep the StatusTip for "simple" tooltip <br>
> text and the ToolTips for further customized messages, as they also <br>
> allow rich text content.<br>
> Here's a small example:<br>
> <br>
>      def __init__(self, *args, **kwargs):<br>
>          [...]<br>
>          self.toolTipWidget = QtWidgets.QLabel()<br>
>          [...]<br>
>          self.someWidget = SomeWidget()<br>
>          self.someWidget.setStatusTip('I am a statustip!')<br>
>          [...]<br>
> <br>
>      def event(self, event):<br>
>          if event.type() == QtCore.QEvent.StatusTip and event.tip():<br>
>              self.toolTipWidget.setText(event.tip())<br>
>          return QtWidgets.QWidget.event(self, event)<br>
> <br>
> Note that here I used the setStatusTip() method instead of the <br>
> setToolTip() one.<br>
> Obviously, if you're using Designer you'll set the StatusTip property <br>
> from there, instead of the ToolTip property.<br>
> <br>
> How does it work?<br>
> Usually the StatusTip is only used on a QMainWindow with a QStatusBar <br>
> installed, but, interestingly enough, the event() method of *any* widget <br>
> can be used to catch /any/ StatusTip event called from both that widget <br>
> /and/ its children.<br>
> <br>
> In both cases you'd better think about a way to "clear" the tool/status <br>
> tip, as leaving it there might be confusing.<br>
> If you don't have too many widgets, the eventFilter way might be a good <br>
> solution, as you can also catch the QEvent.Leave event type to hide the <br>
> "tooltip" by clearing the label text, otherwise it's probably <br>
> better using a QTimer on the parent widget or the label, and set it as <br>
> singleShot (don't use the static method, as it could hide a new <br>
> statustip activated in the meantime), then connect it to something like <br>
> lambda: self.toolTipWidget.setText('')whenever you catch the StatusTip <br>
> event.<br>
> <br>
> If for some reason you'll need to stick with ToolTips, there's a <br>
> solution anyway.<br>
> If all widgets already have their tooltips, and the layout is static and <br>
> permanent once the main parent widget is being instantiated, just use <br>
> the children() iterator and check for both isWidgetType() and toolTip() <br>
> contents: if those condition match, install the eventFilter; if the <br>
> layout is dynamic instead, use the childEvent method on the parent and <br>
> check for QEvent.childAdded and QEvent.childRemoved events, then use <br>
> installEventFilter or removeEventFilter respectively.<br>
> <br>
> Regards,<br>
> Maurizio<br>
> <br>
> <br>
> Il giorno lun 21 gen 2019 alle ore 23:22 Tong Zhang <br>
> <<a href="mailto:warriorlance@gmail.com" target="_blank">warriorlance@gmail.com</a> <mailto:<a href="mailto:warriorlance@gmail.com" target="_blank">warriorlance@gmail.com</a>>> ha scritto:<br>
> <br>
>     Hello,<br>
> <br>
>     Can I show the tooltip of some widget onto a QLabel? e.g. Tooltip<br>
>     will show when I move the mouse onto the pushbutton, how about show<br>
>     the tooltip on another widget, say label?<br>
> <br>
>     Thanks,<br>
>     Tong<br>
>     _______________________________________________<br>
>     PyQt mailing list <a href="mailto:PyQt@riverbankcomputing.com" target="_blank">PyQt@riverbankcomputing.com</a><br>
>     <mailto:<a href="mailto:PyQt@riverbankcomputing.com" target="_blank">PyQt@riverbankcomputing.com</a>><br>
>     <a href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt" rel="noreferrer" target="_blank">https://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><br>
> <br>
> <br>
> <br>
> -- <br>
> È difficile avere una convinzione precisa quando si parla delle ragioni <br>
> del cuore. - "Sostiene Pereira", Antonio Tabucchi<br>
> <a href="http://www.jidesk.net" rel="noreferrer" target="_blank">http://www.jidesk.net</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">È difficile avere una convinzione precisa quando si parla delle ragioni del cuore. - "Sostiene Pereira", Antonio Tabucchi<br><a href="http://www.jidesk.net" target="_blank">http://www.jidesk.net</a></div>