2012-06-25 37 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解决方案实际上解决了从未有过简单答案的“检测悬停事件”问题。我的帽子给你! –