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

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

用下图中我添加了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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在QTableWidget添加件,需要自定义QHeaderView并将其设置为QTableWidget的水平表头。下面是完整的代码示例: ```python from PyQt5 import QtWidgets, QtGui, QtCore class MyHeader(QtWidgets.QHeaderView): def __init__(self, parent): super().__init__(QtCore.Qt.Horizontal, parent) self.setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self._widget = QtWidgets.QComboBox(self) self._widget.addItems(['Option 1', 'Option 2', 'Option 3']) self.sectionResized.connect(self.adjust_widget) def setModel(self, model): super().setModel(model) self.adjust_widget() def adjust_widget(self, index=0): rect = self.sectionViewportPosition(index) height = self.height() - rect self._widget.setGeometry(rect, 0, self.sectionSize(index), height) class MyTableWidget(QtWidgets.QTableWidget): def __init__(self, parent=None): super().__init__(parent) self.setHorizontalHeader(MyHeader(self)) self.setColumnCount(3) self.setRowCount(5) for row in range(5): for col in range(3): item = QtWidgets.QTableWidgetItem(f"Item {row+1}-{col+1}") self.setItem(row, col, item) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = MyTableWidget() window.show() sys.exit(app.exec_()) ``` 这个例子创建一个35的表格,并在第一的表头添加了一个下件。在MyHeader类中,我们创建了一个QComboBox件并在构造函数中将其添加到自定义的表头件中。我们还在setModel和adjust_widget方法中处理了件的大小和位置。在MyTableWidget类中,我们将自定义的表头设置为QTableWidget的水平表头。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

咸鱼2333号程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值