2012-06-25 80 views
1

我有一個QLabel的widget類'BlockWidget',我設置qss qss_1的ctor,我想要動畫效果,當鼠標移動它時,它會改變它的背景 - 顏色,所以我把它的QSS qss_2,但似乎不工作...我這樣的代碼:qt mousemoveEvent(涉及到qss)

BlockWidget::BlockWidget(const QString &objname) 
{ 
    this->setObjectName(objname); 
    setAlignment(Qt::AlignCenter); 
    setStyleSheet(tr("BlockWidget#%1{color:white; background-color: gray; font-size:18px;" 
       "font-family:'Consolas';}").arg(objectName())); 
} 

void BlockWidget::mouseMoveEvent(QMouseEvent *ev) 
{ 
    setStyleSheet(tr("BlockWidget#%1{color:white; background-color: blue; font-size:18px;" 
       "font-family:'Consolas';}").arg(objectName())); 
    repaint(); 
} 

而且我有一個主窗口,我實例化BlockWidget的81個實例。當我的鼠標移動到其中一個時,什麼都沒有發生。但如果我點擊它一些時間,它不改變它的QSS風格(其背景變爲藍色)

enter image description here

enter image description here

回答

1

如前所述通過文檔,鼠標移動事件只在您點擊,拖動或釋放按鈕時纔會發送,如果沒有爲小部件啓用鼠標跟蹤。

您可以通過在BlockWidget類中重新定義QWidget::enterEventQWidget::leaveEvent來檢測鼠標進入和離開標籤。

或者你可以簡單地使用:hover QSS僞狀態,而無需重新定義任何鼠標相關的功能:

setStyleSheet("BlockWidget {" 
       " color:white;" 
       " background-color: gray;" 
       " font-size:18px;" 
       " font-family:'Consolas';" 
       "}" 
       "BlockWidget:hover {" 
       " background-color: blue;" 
       "}"); 

PS:

  • 根據Qt的樣式表文件,QLabel不支持:hover僞狀態,但更改背景或邊框似乎工作正常。

  • 由於您的BlockWidget小部件沒有自己的BlockWidget子項,並且因爲您將樣式表單獨設置爲全部,所以應該可以安全地從QSS選擇器中省略對象名稱。

+0

您的enterEvent和leaveEvent解決方案實際上解決了從未有過簡單答案的「檢測懸停事件」問題。我的帽子給你! –