QHeaderView sectionResized()信号和geometriesChanged()信号的异同

简述背景

最近博主在写一个项目的时候需要在QHeaderView的size改变的时候自己获取QTableView表头各个section的width()来实现,自己自定义的控件。实现思路是在表头的size发生改变的时候获取一下表头各个section的width。一开始楼主使用的是void sectionResized(int logicalIndex, int oldSize, int newSize)这个信号,但是获取到的表头size却是发生该表之前的size(注意楼主是没有使用信号的参数的,而是直接取的QTableView的 columnWidth(int column),也就是表头的width)。最后,楼主觉得该信号可能保留了发生几何尺寸改变之前的size作为表头的当前的尺寸,解决方案当时就想到换个信号试试,结果就改成使用geometriesChanged()信号,这个时候再获取到的表头的width就是实时的。


具体阐述

贴下代码先:
    //连接sectionResized(int,int,int)这个信号获取到的表头几何大小是上次发生变化的几何大小数据
    //connect(tableView->horizontalHeader(),SIGNAL(sectionResized(int,int,int)),
    //        this,SLOT(resizeTableViewBottomWidget()));

    //geometriesChanged()信号发射的时候获取到的是当前表头实时的几何数据
    connect(tableView->horizontalHeader(),SIGNAL(geometriesChanged()),\
            this,SLOT(resizeTableViewBottomWidget()));
关联两个信号到槽函数,槽函数代码大致如下:
    Xs->clear();
    widths->clear();

    int columnCount = mySqlQueryModel->columnCount();

    for(int i=0; i<columnCount+1; ++i)
    {
        if(0==i)
        {
            Xs->append(tableView->verticalHeader()->x());
            widths->append(tableView->verticalHeader()->width());
        }
        else
        {
            Xs->append(tableView->horizontalHeader()->x() + tableView->columnWidth(i-1));
            widths->append(tableView->columnWidth(i-1));
        }
    }
主要就是获取表各个列的宽度用于实现控件的几何尺寸调整。


结论

总结下就是两者的异同就是两者都会在表头发生几何尺寸改变的时候发射信号,但是sectionResized(int logicalIndex, int oldSize, int newSize)信号当前表头的width只能通过参数去获取,也就是你的槽函数要带三个参数来接收来自信号的参数的值,如果你直接去获取表头的width(不管是通过QTableView间接获取,还是通过QHeaderView直接获取)得到的是发生改变之前的尺寸。geometriesChanged()不带参数,获取得到的尺寸就是发生尺寸改变后的实时尺寸。  



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值