【问题标题】:Incorrect background color of QPushButton on hover with QMenu使用 QMenu 悬停时 QPushButton 的背景颜色不正确
【发布时间】:2014-05-16 22:42:04
【问题描述】:

我有一个 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; 
}

更新:我创建了一个 github repo 并带有示例来演示该问题。

【问题讨论】:

  • 向我们展示您的样式表。

标签: css qt


【解决方案1】:

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

为了突出显示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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2014-04-09
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多