1

QLabel (または何でも) のツールチップを継続的に更新する方法はありますか?

たとえば、次のコードでは、ラベルとそのツールチップを継続的に更新するタイマーを使用しています。ラベルの変更を見ることができますが、QLabel にカーソルを合わせると、最後の現在の値を含むツールチップが表示されます。ツールチップは、マウスを動かしてツールチップを新しい値に更新するまで「固定」のままです。

!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PySide import QtGui, QtCore

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.value=0
        self.initUI()
    def initUI(self):      
        hbox = QtGui.QHBoxLayout(self)
        self.lbl = QtGui.QLabel(self)
        self.lbl.setText("foo")
        self.lbl.setToolTip("bar")
        self.timer = QtCore.QBasicTimer()
        self.timer.start(100, self)
        hbox.addWidget(self.lbl)
        self.setLayout(hbox)
        self.show()
    def timerEvent(self, x):
        self.value=self.value+1
        self.lbl.setText("foo: %03d" % self.value)
        self.lbl.setToolTip("bar: %03d" % self.value)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

マウスを動かさずにツールチップを更新する方法はありますか?

4

2 に答える 2

2

簡単ではありませんでしたが、必要なことを行うコードを次に示します。

!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PySide import QtGui, QtCore

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()
    def initUI(self):      
        hbox = QtGui.QHBoxLayout(self)
        self.lbl = MyLabel(self)
        self.lbl.setText("foo")
        self.lbl.setToolTip("bar")
        hbox.addWidget(self.lbl)
        label2 = QtGui.QLabel('another label')
        hbox.addWidget(label2)
        label2.setToolTip('a normal tooltip')
        self.setLayout(hbox)
        self.show()


class MyLabel(QtGui.QLabel):
    def __init__(self,*args,**kwargs):
        QtGui.QLabel.__init__(self,*args,**kwargs)
        self._timer = QtCore.QBasicTimer()
        self._timer.start(100, self)
        self._value = 0
        self._last_event_pos = None

    def event(self,event):
        if event.type() == QtCore.QEvent.ToolTip:
            self._last_event_pos = event.globalPos()
            return True
        elif event.type() == QtCore.QEvent.Leave:
            self._last_event_pos = None
            QtGui.QToolTip.hideText()
        return QtGui.QLabel.event(self,event)

    def timerEvent(self, x):
        self._value += 1
        if self._last_event_pos:
            QtGui.QToolTip.hideText()
            QtGui.QToolTip.showText(self._last_event_pos, "bar: %03d" % self._value)
        self.setText("foo: %03d" % self._value)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
于 2013-10-19T04:10:03.890 に答える
0

@three_pineapples の元の提案に従って、これが私が思いついたものです。

  • setToolTip()呼び出す関数をオーバーライドしますhideText();showText()が、
  • マウス ポインタが現在ラベルの上にある場合 ( で検出event())

コードは次のとおりです。

class MyLabel(QtGui.QLabel):
    def __init__(self,*args,**kwargs):
        QtGui.QLabel.__init__(self,*args,**kwargs)
        self._setToolTip=QtGui.QLabel.setToolTip
        self._last_event_pos = None
        self._tooltip=QtGui.QLabel.toolTip(self)
    def event(self,event):
        if event.type() == QtCore.QEvent.ToolTip:
            self._last_event_pos = event.globalPos()
            return True
        elif event.type() == QtCore.QEvent.Leave:
            self._last_event_pos = None
            QtGui.QToolTip.hideText()
        return QtGui.QLabel.event(self,event)
    def setToolTip(self, tt):
        self._setToolTip(self, tt)
        if self._last_event_pos:
            QtGui.QToolTip.hideText()
            QtGui.QToolTip.showText(self._last_event_pos,
                                    QtGui.QLabel.toolTip(self))
于 2014-09-24T17:11:55.963 に答える