前言:在表格的标题行的每列添加想添加的控件,不用继承重写
用下图中我添加了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是指如下图拉动竖线大小改变的那一列
这样就可以实现上面的效果了