QTableWidget表头样式无法设置的解决方案

1 篇文章 0 订阅

文章参考了 复杂表头 的想法

需求如下:

解决了什么样的问题?

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的位置无论横向或竖向滚动都是不动的

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值