2013-10-17 77 views
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_()) 

有沒有辦法更新工具提示而不必移動鼠標?

回答

1

那麼它是不容易的,但在這裏是應該做的代碼,你想要什麼:

!/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_()) 
+0

你覺得有可能,使'MyLabel'表現爲一個普通的'QLabel',而無需瞭解實際的提示什麼顯示?我寧願有一個可重複使用的課程... –

+0

我不是按照你的意思。你總是必須告訴一個小部件它的工具提示是什麼。你的意思是你想使用現有的setToolTip函數而不是更特別的東西? –

0

所以以下@three_pineapples原來的建議,這是我想出了:

  • 重寫setToolTip()函數來調用hideText();showText(),但只有
  • 如果鼠標指針當前懸停在標籤(在event()檢測)

下面的代碼: