不同的默认按钮设计行为

时间:2015-02-25 13:23:22

标签: c++ qt

问题如下:我想重新定义(摆脱按钮的悬停效果)默认的Qt按钮样式的行为。我只需要1和3,如下图所示。当按钮聚焦时,第二个外观就出现了。

悬停效果:悬停按钮时出现;按下按钮并将光标移动到按钮空间之外时仍然会被绘制。

normal, hover, armed

我尝试了什么:

  1. 重新定义事件:

    How do I implement QHoverEvent in Qt?

    在这里,我只是重新定义了一些事件,如Move,Hover等,并使它们无法正常运行。

    示例代码:

    class TestButton : public QToolButton
    {
        Q_OBJECT
    
    public:
        TestButton (QWidget *parent = 0) :
        QToolButton(parent)
        {}
    
    bool event(QEvent * e)
        {
            this->clearFocus();
            this->clearMask();
    
            switch (e->type())
            {
            case QEvent::GraphicsSceneHoverEnter:
            case QEvent::GraphicsSceneHoverLeave:
            case QEvent::GraphicsSceneHoverMove:
            case QEvent::HoverEnter:
            case QEvent::HoverLeave:
            case QEvent::HoverMove:
                return true;
            default:
                return QWidget::event(e);
            }
        }
    };
    
  2. 一些小黑客:

    btn->setFocusPolicy(Qt::NoFocus);
    

1 个答案:

答案 0 :(得分:1)

如果您只接受HoverEnter个事件,那么在释放按钮后,只要您将鼠标移开,鼠标悬停效果就会消失。因此,您需要通过发送相应的事件来假装移动鼠标。

bool event(QEvent * e)
{
    switch (e->type()) {
    case QEvent::HoverEnter:
        return true;
    case QEvent::MouseButtonRelease: {
        QEvent event(QEvent::Leave);
        QApplication::sendEvent(this, &event);
    }
    default:
        return QWidget::event(e);
    }
}