qmenu从有下级选项的选项切换到没有下级选项的选项后,会丢失选中状态,如何解决?(标签-List)

qmenu从有下级选项的选项切换到没有下级选项的选项后,会丢失选中状态

代码如下

void MainWindow::handleUpKeyPressShort()///上键短按
{
    if(sideMenuState == true)///当菜单显示时
    {
        QList<QAction*> actions = sideMenuNow->actions();///获取当前菜单下的所有选项
        {

            if (actions.count() > 1)///当前菜单下选项>1
            {

                /// 取消当前选项的活动状态
                sideMenuNow->setActiveAction(nullptr);

                if((sideActionNowNumLv[sideMenuNowLv] - 1) < 0)
                {
                    sideActionNowNumLv[sideMenuNowLv] = actions.count() - 1;
                }
                else
                {
                    sideActionNowNumLv[sideMenuNowLv] -= 1;
                }

                sideMenuNow->setActiveAction(actions[sideActionNowNumLv[sideMenuNowLv]]);



            }
        }
    }
    else///当菜单未显示时
    {



    }
}

img

如这个图片,当活动选项由222(有下级选项)切换到它上下的选项时,它上下的选项111和555都只会显示一下被选中时的样式并不能保持,在下面几个555之间切换都是可知正常保持选中的样式的,请问各位这个是什么原因?该怎么解决

【以下回答由 GPT 生成】

这个问题出现的原因是QMenusetActiveAction函数只会改变当前活动的QAction的样式,而不会改变之前活动的QAction的样式。所以当从有下级选项的选项切换到没有下级选项的选项时,之前的活动选项的样式不会被保持。

解决这个问题的方法是,在切换到新的选项时,手动设置之前的活动选项的样式为空,同时设置新选项为活动选项。

这里是修改后的代码示例:

void MainWindow::handleUpKeyPressShort()
{
    if (sideMenuState == true)
    {
        QList<QAction*> actions = sideMenuNow->actions();
        if (actions.count() > 1)
        {
            QAction* prevActive = sideMenuNow->activeAction(); // 获取之前的活动选项
            sideMenuNow->setActiveAction(nullptr); // 取消当前选项的活动状态

            if ((sideActionNowNumLv[sideMenuNowLv] - 1) < 0)
            {
                sideActionNowNumLv[sideMenuNowLv] = actions.count() - 1;
            }
            else
            {
                sideActionNowNumLv[sideMenuNowLv] -= 1;
            }

            QAction* newActive = actions[sideActionNowNumLv[sideMenuNowLv]]; // 获取新选项
            sideMenuNow->setActiveAction(newActive); // 设置新选项为活动选项

            if (prevActive != nullptr) {
                prevActive->setIcon(QIcon()); // 清空之前活动选项的图标
                prevActive->setCheckable(false); // 取消之前活动选项的可选状态
            }

            newActive->setIcon(QIcon(":/icons/active.png")); // 设置新选项的图标
            newActive->setCheckable(true); // 设置新选项为可选状态
        }
    }
    else
    {
        // 处理菜单未显示的情况
    }
}

以上代码示例中,我假设之前的活动选项有一个图标,并且将该图标设置为空来清空之前的活动选项的样式。然后为新选项设置一个活动图标,并将其设置为可选状态,以保持选中状态的样式。

请注意,根据你的具体需求,你可能需要相应调整图标以及其他样式属性的设置。

希望这个解决方案对你有帮助。如果你有任何问题或者需要进一步的帮助,请告诉我。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可能是对List控件的理解不同,通常activate的解释是当前条目,或者激活显示,与选择无关。选择项通常使用类似于check或者selected这样的标记,而且有参数控制单选和多重选择。