文章参考了 复杂表头 的想法
需求如下:
解决了什么样的问题?
1.样式表对QtableWidget表头的颜色等无法准确设置(解决方法:表头颜色,这一点想不明白);
2.QTableWidget表头中表格的分隔线无法取出;
3.表格左上角的cornerbutton进行了剔除;
如何解决?
1.投机取巧:
既然无法对QTableWidget表头的样式进行准确的设置,干脆将表头设置为透明,因为在表格当中表头是不需要随着滚轮的移动而改变颜色的;(这一点是对照着表格内容部分被设置为隔行颜色相同所说的),将表头设置为透明后,在表头所在位置加一块你想要的颜色的QWidget,颜色就被正确显现出来了;
此外这种方法还把表头当中的分隔线隐藏了;
2.张冠李戴
这一部分的想法参考了文章开头的老哥的想法,即用另一个表格(下面称为header)的内容部分当作源表格(下面成为table)的表头,然后固定header即可,这时需要考虑两个表格的联动问题,即table被鼠标滚轮或滚动条改变显示内容后,header也应当跟随移动,这会用到滚动条的信号啦,下文交代;
实现方法及代码?
首先将table表头设置为透明,则将样式表添加如下代码:
QHeaderView::section
{
background-color:transparent;
font:16px '微软雅黑';
color: rgba(255, 255, 255, 0.85);
}
隐藏table竖直方向的表头:
table.verticalHeader()->setHidden(true);
隐藏竖直方向的表头后左上角的cornerbutton也就一起消失了!
然后就是添加header了,其中注意隐藏header的滚动条,禁止header整列被选中;
header.setColumnCount(2);
header.setRowCount(7);
header.setParent(this);
header.verticalHeader()->setHidden(true);//隐藏竖向滚动条
QStringList hheader;
hheader<<"日期"<<"星期";
header.setHorizontalHeaderLabels(hheader);
header.setColumnWidth(0,69);
header.setColumnWidth(1,56);
for(int i = 0; i < 6; i++)
{
header.setRowHeight(i,38);
}
header.setRowHeight(6,44);
QTableWidgetItem *item1 = new QTableWidgetItem("星期一");
item1->setFlags(item1->flags()&~Qt::ItemIsSelectable);
header.setItem(0,1,item1);
item1->setTextAlignment(Qt::AlignCenter);
QTableWidgetItem *item2 = new QTableWidgetItem("星期二");
item2->setFlags(item2->flags()&~Qt::ItemIsSelectable);
header.setItem(1,1,item2);
item2->setTextAlignment(Qt::AlignCenter);
QTableWidgetItem *item3 = new QTableWidgetItem("星期三");
item3->setFlags(item3->flags()&~Qt::ItemIsSelectable);
header.setItem(2,1,item3);
item3->setTextAlignment(Qt::AlignCenter);
QTableWidgetItem *item4 = new QTableWidgetItem("星期四");
item4->setFlags(item4->flags()&~Qt::ItemIsSelectable);
header.setItem(3,1,item4);
item4->setTextAlignment(Qt::AlignCenter);
QTableWidgetItem *item5 = new QTableWidgetItem("星期五");
item5->setFlags(item5->flags()&~Qt::ItemIsSelectable);
header.setItem(4,1,item5);
item5->setTextAlignment(Qt::AlignCenter);
QTableWidgetItem *item6 = new QTableWidgetItem("星期六");
item6->setFlags(item6->flags()&~Qt::ItemIsSelectable);
header.setItem(5,1,item6);
item6->setTextAlignment(Qt::AlignCenter);
QTableWidgetItem *item7 = new QTableWidgetItem("星期日");
item7->setFlags(item7->flags()&~Qt::ItemIsSelectable);
mheader.setItem(6,1,item7);
item7->setTextAlignment(Qt::AlignCenter);
header.verticalScrollBar()->setDisabled(true);
header.setStyleSheet("padding-left: 6px;");
header.setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);//设置竖直方向滚动条按像素滚动,解决滚动过快问题
header.setEditTriggers(QAbstractItemView::NoEditTriggers);//设置单元格不可修改,只需通过clicked修改单元格内容
header.setAlternatingRowColors(true);//设置隔行颜色变化
header.setFocusPolicy(Qt::NoFocus);//去除选中后虚线
header.setShowGrid(false);//去除格子线
header.setFrameShape(QFrame::NoFrame);//去除边框
header.setStyleSheet("background-color:transparent;");
header.resize(125,308);
header.setMinimumSize(125,308);
header.horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
header.verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
header.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//竖直方向滚动条关闭
header.horizontalHeader()->setMinimumHeight(38);
header.horizontalHeader()->setMinimumWidth(56);
这里面要设置表格的最小尺寸,防止被压缩,因为我们要整齐的排列两个表格,需要防止表格被压缩
两个表格的联动用到了table的滚动条的信号
connect(table.verticalScrollBar(),QScrollBar::valueChanged,this, &Table::onSliderMoved);
void Table::onSliderMoved(int pos)
{
header.verticalScrollBar()->setValue(pos);
}
另外还涉及了GridLayout,以后的文章在写吧
最后的一些小想法?
如果有更多的需求的话会考虑将table横向的表头也设置为另一个header,但这里面需要四个QTableWidget,因为左上角的cornerbutton的位置无论横向或竖向滚动都是不动的