最近,做了一个小程序,使用到了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);
}