2014-01-28 84 views
1

我目前正在嘗試顯示widget的focusOutEvent工具提示。這個工具提示基本上驗證了Widget中的數據(QLineEdit)。現在的問題是我想使用工具提示來顯示錯誤或問題。這是我在做什麼QTooltip不依賴於鼠標

void MyLineEdit::focusOutEvent(QFocusEvent *e) 
{ 
    QLineEdit::focusOutEvent(e); 
    QToolTip::showText(this->mapToGlobal(QPoint(0, 0)), "Something got it"); 
    emit(focussed(false)); 
} 

現在的問題是QTooltip沒有顯示,這可能是因爲鼠標在移動。我的問題是,如何讓QTooltip顯示並保持在那裏,直到我想關閉它?

+1

也許你可以編寫自己的「tooltip」類嗎?例如,它可以包含一個可以在所需位置顯示的無框「QLabel」。 – vahancho

回答

1

只有當QHelpEvent被攔截時,工具提示纔會顯示。雖然你可以從focusOutEvent使用QCoreApplication::PostEvent發送一個和子QWidget::event這樣

bool MyLineEdit::event (QEvent *event) 
{ 
    if (event->type() == QEvent::ToolTip) { 
     QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); 
     QToolTip::showText(helpEvent->globalPos(), "Something got it"); 

     return false; 
    } 
    return QWidget::event(event); 
} 

,這樣做有兩個不良後果。

1)只要正常顯示工具提示(即鼠標指針停留在小部件上幾秒鐘),就會觸發該事件。你將不得不實施某種識別機制來區分你自己的幫助事件和其他事件。

2)工具提示只在各個小工具集中時纔有效。因此,在焦點丟失時顯示工具提示只會顯示幾秒鐘,直到處理下一個事件循環。

對於後者可能有一個解決方法,但是在這一點上,留下工具提示以達到其預期目的並實現您自己直接控制的僞工具提示可能會更好。

+0

+1:我同意 - 「最好留下工具提示以達到其預期目的」。有一點是變通辦法讓代碼變得如此複雜,以至於它可以節省代碼重用的節省。工具提示作爲樣式標籤實現起來相當簡單。 –