1

我有一个QLabel的小部件类'BlockWidget'子类,在ctor中我设置了它的qss qss_1,我想要动画效果,当鼠标移动它时,它会改变它的背景颜色,所以我设置它的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 样式(它的背景变成蓝色)

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

1

如文档所述,鼠标移动事件仅在您单击、拖动或释放按钮时发送,如果未为小部件启用鼠标跟踪。

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

或者您可以简单地使用:hoverQSS 伪状态,而无需重新定义任何与鼠标相关的功能:

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 选择器中省略对象名称应该是安全的。

于 2012-06-25T10:34:48.423 回答
1

您必须为您的小部件启用鼠标跟踪http://qt-project.org/doc/qt-4.8/qwidget.html#mouseTracking-prop

于 2012-06-25T10:05:05.753 回答