简述背景
最近博主在写一个项目的时候需要在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()不带参数,获取得到的尺寸就是发生尺寸改变后的实时尺寸。