qt mousemoveEvent(与qss有关)

时间:2012-06-25 06:13:11

标签: qt qt4 onmousemove

我有一个QLabel的widget类'BlockWidget'子类,在我设置它的qss qss_1的ctor中,我想要动画效果,当鼠标移动它时,它会改变它的背景颜色,所以我设置了它的qss qss_2,但它似乎不起作用......我的代码是这样的:

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();
}

我有一个主窗口,我实例化了81个BlockWidget实例。当我的鼠标移动到其中一个时,没有任何反应。但是如果我点击一下它会改变它的qss样式(它的背景变成蓝色)

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

如文档所述,只有在您点击,拖动或释放按钮时才会发送鼠标移动事件,如果未为窗口小部件启用鼠标跟踪。

您可以通过重新定义QWidget::enterEvent课程中的QWidget::leaveEventBlockWidget来检测鼠标是否进入和离开标签。

或者您可以简单地使用: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选择器。