QT C++实现表头添加组件
QTableWidget在表头添加组件#
QTableWidget的表头有一个类QHeaderView是专门处理表头的类,要在表头添加一个类似QCheckBox的组件需要重写一个类并继承QHeaderView。
QTableWidget中添加复选框并实现全选居中:
- 自定义类MyHeaderView并继承QHeaderView
- 自定义类MyTableWidget并继承QTableWidget
myheaderview.h
#ifndef MYHEADERVIEW_H
#define MYHEADERVIEW_H
#include <QHeaderView>
#include <Qt>
class MyHeaderView : public QHeaderView
{
//Q_OBJECT:使用信号和槽函数必备的宏
public:
struct Margins
{
int left;
int right;
int top;
int buttom;
Margins(int left = 2, int right = 2, int top = 2, int buttom = 2); //通过构造函数设置默认参数
};
explicit MyHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr);
~MyHeaderView();
void SetItemWidget(int index, QWidget * widget); //表头添加组件,比如checkbox、pushbutton
void SetItemMargins(int index, Margins margins); //设置边距
private:
struct Item
{
QWidget * item; //组件
Margins margins; //边缘
Item(); //默认构造函数
};
QMap<int, Item> mItems; //<key, data>
};
#endif // MYHEADERVIEW_H
myheaderview.cpp
#include "myheaderview.h"
MyHeaderView::MyHeaderView(Qt::Orientation orientation, QWidget * parent)
: QHeaderView(orientation, parent)
{
}
MyHeaderView::~MyHeaderView()
{
}
void MyHeaderView::SetItemWidget(int index, QWidget *widget)
{
widget->setParent(this);
mItems[index].item = widget;
}
void MyHeaderView::SetItemMargins(int index, Margins margins)
{
mItems[index].margins = margins;
}
MyHeaderView::Item::Item() : item(nullptr)
{
}
MyHeaderView::Margins::Margins(int left, int right, int top, int buttom) :
left(left),
right(right),
top(top),
buttom(buttom)
{
}
mytablewidget.h
#ifndef MYTABLEWIDGET_H
#define MYTABLEWIDGET_H
#include <QTableWidget>
#include "myheaderview.h"
class MyTableWidget : public QTableWidget
{
//Q_OBJECT
public:
MyTableWidget(QWidget * parent = nullptr);
~MyTableWidget();
void SetHorizontalHeaderItemWidget(int column, QWidget * widget); //表头添加组件
void SetHorizontalHeaderItemMargins(int column, MyHeaderView::Margins margins); //修改表头组件的边距
private:
MyHeaderView *myheadview;
};
#endif // MYTABLEWIDGET_H
mytablewidget.cpp
#include "mytablewidget.h"
MyTableWidget::MyTableWidget(QWidget * parent)
: QTableWidget(parent)
{
myheadview = new MyHeaderView(Qt::Orientation::Horizontal, this);
setHorizontalHeader(myheadview); //这里有upcasting
}
MyTableWidget::~MyTableWidget()
{
delete myheadview;
}
void MyTableWidget::SetHorizontalHeaderItemWidget(int column, QWidget *widget)
{
myheadview->SetItemWidget(column, widget);
}
void MyTableWidget::SetHorizontalHeaderItemMargins(int column, MyHeaderView::Margins margins)
{
myheadview->SetItemMargins(column, margins);
}
使用方法:
table->setColumnCount(5);
QCheckBox all_check = new QCheckBox("全选");
table->SetHorizontalHeaderItemWidget(0, all_check); //在第0列添加一个QCheckBox
效果预览:
参考:https://stackoverflow.com/questions/27000484/add-custom-widgets-as-qtablewidget-horizontalheader
作者:qianxiaohan
出处:https://www.cnblogs.com/qianxiaohan/p/18220392
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2023-05-29 FPGA流水灯