QTableWidget如何在标题行的其他列添加下拉菜单等控件

本文介绍了如何在Qt的QTableWidget表头行添加QToolButton控件,并实现点击后弹出QMenu,以及如何处理表头大小改变时控件位置的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:在表格的标题行的每列添加想添加的控件,不用继承重写

用下图中我添加了QToolButton作为示例讲解,视频展示效果如下:

效果如下:

QTableWidget在表头行添加控件示例

QTableWidget的一些创建还有简单的设置可以看这个链接,不懂的可以看下QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法) 

 代码示例:

初始化:
QHeaderView *m_horizontalHeader = twResTaskList->horizontalHeader();//twResTaskList这个是QTableWidget

或者:
m_horizontalHeader = new QHeaderView(Qt::Horizontal,this);
m_horizontalHeader=twResTaskList->horizontalHeader();

然后就可以在表头行添加控件了:

    QAbstractItemModel *itemmode = m_horizontalHeader->model();
    //添加第一列的按钮    
    int iPosX = m_horizontalHeader->sectionPosition(2);//获取第2列的位置,后面移动按钮的时候可以参考
    m_toolBtn  = new QToolButton(m_horizontalHeader);//按钮的父类记得绑定表头哦!
    m_toolBtn->resize(20,25);//调整按钮大小
    m_toolBtn->setPopupMode(QToolButton::InstantPopup);//设置Qmenu在QToolButton上的出现方式
    m_toolBtn->setCursor(Qt::ArrowCursor);
    m_menuResName = new QMenu();
    m_toolBtn->setMenu(m_menuResName);
    m_horizontalHeader->setIndexWidget(itemmode->index(0,1),m_toolBtn);//这句感觉没啥作用,我去掉了效果也是一样的
    m_iBtnIndex= iPosX-25;
    m_toolBtn->move(m_iBtnIndex,2);//重点这句,根据自己想要的效果,把按钮移到对应的位置
    
    //添加第3列的按钮,步骤如上 
    m_toolBtnState  = new QToolButton(m_horizontalHeader);
    mvw=m_horizontalHeader->sectionPosition(3);
    m_toolBtnState->resize(20,25);
    m_toolBtnState->setStyleSheet(sBtnStyle);
    m_toolBtnState->setPopupMode(QToolButton::InstantPopup);
    m_toolBtnState->setCursor(Qt::ArrowCursor);
    m_menuResState = new QMenu();
    //下面这这种方法是QAction快速绑定槽函数的方法,很好用哦
    m_menuResState->addAction("所有类型",this,SLOT(slotStateMenuClick()));
    m_menuResState->addAction("未完成",this,SLOT(slotStateMenuClick()));
    m_menuResState->addAction("已完成",this,SLOT(slotStateMenuClick()));
    m_toolBtnState->setMenu(m_menuResState);
    m_horizontalHeader->setIndexWidget(itemmode->index(0,3),m_toolBtnState);
    m_iCheckBoxIndex= iPosX+115-25;//位置可以根据自己想要的效果调整
    m_toolBtnState->move(m_iCheckBoxIndex,2);

    //记得绑定表头大小改变时发出的信号,方便调整按钮对应的位置,不然看起来很奇怪,移动之后
connect(m_horizontalHeader,SIGNAL(sectionResized(int,int,int)),this,SLOT(slotModelIndexResize(int,int,int)));

槽函数:这样即使表头动来动去的,我们的控件也会跟着移动了(仅供参考)

其中logicalIndex是指如下图拉动竖线大小改变的那一列

 这样就可以实现上面的效果了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼2333号程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值