C++ 在Qt/C++;

C++ 在Qt/C++;,c++,qt,stylesheet,C++,Qt,Stylesheet,我在使用QWidgetAction类自定义菜单项时遇到问题。我创建自己的QWidget并将其设置为QWidgetAction的默认小部件。然后,我将QWidgetAction添加到菜单: QMenu menu = new QMenu(this); QCustomWidget* widget = new QCustomWdiget(this); // inherits from QWidget QCustomAction* action = new QCustomAction(this); /

我在使用QWidgetAction类自定义菜单项时遇到问题。我创建自己的QWidget并将其设置为QWidgetAction的默认小部件。然后,我将QWidgetAction添加到菜单:

QMenu menu = new QMenu(this);
QCustomWidget* widget = new QCustomWdiget(this);  // inherits from QWidget
QCustomAction* action = new QCustomAction(this);  // Inherits from QWidgetAction
action->setDefaultWidget(widget);
menu->addAction(action);

自定义操作已添加到菜单中,但常规功能(如使用箭头导航、将元素聚焦在悬停上等)不可用。我只是得到一个小部件,它不继承普通菜单项的行为。我试图设置customwidget的sytlesheet。但是设置与正常操作相同的颜色、背景渐变、边框、字体类型、字体大小等都是太多的工作和不协调的。有没有办法继承标准动作项的风格和/或行为?

这是一个让悬停有效的解决方案:

void QCustomWidget::enterEvent(QEvent* e)
{
  emit entered();
}

void QCustomAction::onWidgetEntered()
{
    if (QMenu* menu = qobject_cast<QMenu*>(sender()->parent()))
    {
        menu->setActiveAction(this);
    }
}

// when you created both:

connect(customWidget, SIGNAL(entered()), customAction, SLOT(onWidgetEntered()));
void QCustomWidget::enterEvent(QEvent*e)
{
发射输入();
}
void QCustomAction::OnWidgetEnterted()
{
如果(QMenu*menu=qobject\u cast(sender()->parent())
{
菜单->设置活动操作(此);
}
}
//当您创建这两个时:
连接(customWidget、信号(entered())、customAction、插槽(onWidgetEntered());
@Ezee 我试过你的方法,但没有奏效。 我使用enterEvent和leaveEvent来实现悬停效果; 当鼠标移动到动作时,代码将运行到enterEvent中,但样式表没有生效

但是我找到了实现我的功能的另一种方法。我想做的就是在鼠标悬停动作时更改图标,我可以使用QIcon::addIcon(QIcon::hover,XXXXX)。这样,我可以轻松更改悬停图标