QToolBox中QToolBoxButton的右键增加菜单方式

    最近,做了一个小程序,使用到了QToolBox这个控件,在使用过程中需要在QToolBox的分组项上增加右键菜单,

但是查了一下QToolBox的说明,只有左键单击的时候,有void  currentChanged(int index)这个信号发出当前选中组的索引,

没有右键点击发出选中组的索引信号。那我们如何才能找到这个点击右键时,获取到当前组的索引呢?

1、在QToolBox的基类QWidget中,有一个虚函数contextMenuEvent(QContextMenuEvent *e),通过测试发现,在右键点击组按钮的时候,能够收到这个消息,恩,有希望了!接下来我们就要看,能否通过这个消息来获取到这个组的相关信息呢?

2、在这个虚函数contextMenuEvent(QContextMenuEvent *e)中增加测试代码:    

QWidget *pWidget = childAt(e->x(), e->y());
qDebug() <<  pWidget;

 输出的结果为QToolBoxButton(0x29cc560, name="qt_toolbox_toolboxbutton")

 哦,原来这个按钮是类QToolBoxButton的对象。

3、在QT的说明里搜索QToolBoxButton,结果一无所有,什么也没查到。看样子这个类应该是QT内部使用的了。

4、不让直接使用这个类,那该咋办啊? 既然你是Button,应该与QAbstractButton有关系吧,那就强转一下试试:

QAbstractButton *pBt = dynamic_cast<QAbstractButton*>(pWidget);

 呵呵,pBt不为空。

5、现在我们只知道选中的是QToolBoxButton,还不知道选中的QToolBoxButton是属于第几个组的。

6、QToolBox在增加分组时使用的代码是:

QToolBox::addItem(QWidget *item, const QString &text)

其中text就是在QToolBoxButton上显示的文字。说到这里,咱们就有办法获取到当前选中的是哪个QToolBoxButton了。对了,就是通过这个文字来判断当前选中的是哪个QToolBoxButton。

当然,这个需要有个前提,就是在增加分组的时候,组的名字不能有重复。


int GetContextIndex(QString title)
{
    int index = -1;
    int num = count();
    for(int i = 0; i < num; i++)
    {
        QString s = itemText(i);
        if(title == s)
        {
            index = i;
            break;
        }
    }
    return index;
}
void contextMenuEvent(QContextMenuEvent *e)
{
    do
    {
        QWidget *pWidget = childAt(e->x(), e->y());
        if(nullptr == pWidget)
        {
            break;
        }

        QAbstractButton *pBt = dynamic_cast<QAbstractButton*>(pWidget);
        if(nullptr == pBt)
        {
            break;
        }

        int index = GetContextIndex(pBt->text());
        if(-1 == index)
        {
            break;
        }
        
        //通过index进行相应的菜单显示及操作

    }while(false);

}





     


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值