使用QMenu悬停时QPushButton的背景颜色不正确

时间:2014-05-12 10:09:02

标签: css qt

我有一个QWidgetAction,其中包含三个QPushButtons和一个QMenu,其中包含许多操作,包括带有子菜单的操作。此菜单如下图所示,其中蓝线为分隔符。

所以,当我试图用菜单项中有鼠标的三个按钮中的一个按下子菜单时,我没有从css设置的悬停效果。但是,当我试图从没有任何子菜单的菜单项悬停时,一切正常,我有背景色。

所以,问题是:为什么这种方式有效以及如何解决?

我已经尝试过使用代码了,是的,控制的行为发生了变化,但不是我需要的方式(我的按钮颜色但颜色和形状错误):

bool CutCopyPasteWidget::eventFilter(QObject* object, QEvent* event)
{
if (object == m_cutButton || object == m_copyButton || object == m_pasteButton)
{
    QEvent::Type t = event->type();

    if (t == QEvent::Enter)
    {
        QPushButton* w = qobject_cast<QPushButton*>(object);
        w->setAttribute(Qt::WA_Hover);
        w->setAutoFillBackground(true);
        w->update();
        emit entered();
    }
    else if (t == QEvent::Leave)
    {
        QPushButton* w = qobject_cast<QPushButton*>(object);
        w->setAttribute(Qt::WA_Hover, false);
        w->setAutoFillBackground(false);
        w->update();
    }
}

return QWidget::eventFilter(object, event);
}

风格:

CutCopyPasteWidget QPushButton:hover:enabled
{
background: HOVERED_CONTEXT_BUTTON_GRADIENT;
border-color: HOVERED_ACTIVE_CONTEXT_BUTTON_BORDER;
}

CutCopyPasteWidget QPushButton:!hover:enabled
{
background: none;
border-color: ACTIVE_CONTEXT_BUTTON_BORDER;
}

CutCopyPasteWidget QPushButton:!hover:!enabled
{
background: none;
border-color: INACTIVE_CONTEXT_BUTTON_BORDER;
}

CutCopyPasteWidget QPushButton
{
min-width: 2pt; 
}

example of menu

更新:我创建了一个github repo,并举例说明了这个问题。

1 个答案:

答案 0 :(得分:0)

好吧,我没有找到任何解释或建议,所以我自己找到了解决方案。

要突出显示QWidgetAction中的按钮,我添加了动态属性,就像在下面的代码中构建按钮的地方一样:

m_pasteButton->setProperty("mouseHover", false);

然后,在按钮上安装过滤器并捕获EnterLeave事件,以确定鼠标悬停的时间:

bool CustomWidgetAction::eventFilter(QObject* object, QEvent* event)
{
    if (object == m_cutButton)
    {
        QEvent::Type t = event->type();
        if (t == QEvent::Enter)
        {
            QWidget* w = qobject_cast<QWidget*>(object);
            w->setProperty("mouseHover", true);
            w->polish(w);
        }
        else if (t == QEvent::Leave)
        {
            QWidget* w = qobject_cast<QWidget*>(object);
            w->setProperty("mouseHover", false);
            w->polish(w);
        }
    }
    return QWidget::eventFilter(object, event);
}

然后,在CSS中,我添加了一些规则来设置悬停效果:

CustomWidgetAction QPushButton[mouseHover="true"]:enabled
{
    background: HOVERED_CONTEXT_BUTTON_GRADIENT;
    border-color: HOVERED_ACTIVE_CONTEXT_BUTTON_BORDER;
}

CustomWidgetAction QPushButton[mouseHover="false"]:enabled
{
    background: none;
    border-color: ACTIVE_CONTEXT_BUTTON_BORDER;
}