用下图中我添加了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是指如下图拉动竖线大小改变的那一列

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