滚动条一步到位

滚动条一步到位

滚动条的设置,不停留在中间,只在两个端点停留

BUG !!!

这一节QT 多级表头的多级表头经过测试有个bug。如果有的列占据了两列的表头,那么在左右移动的过程中就会出现串列的现象。
输入图片说明
这种情况!!!
把占据两列的改为一列,看这一列就很不方便。
但是我发现在两端的时候数据是正确的,也没有串列,那么就让滚动条只能停留在左右两端。

步骤1:修改步长

首先想到的就是修改步长,设置的足够大就可以一步到位。

1
2
3
horizontalScrollBar->setRange(1,100);  //设置范围为0-100
horizontalScrollBar->setPageStep(50); //设置鼠标点击滑块以外的地方,滑块每次运动50,既滑块只能跑2次就到头了
horizontalScrollBar->setSingleStep(50); //这个确保点击向上/向下按钮,滑块跑2次也到头了

具体代码是这样的:

1
2
3
4
5
6
7
8
9
10
11
//滚动条
verticalScrollBar = new QScrollBar(Qt::Vertical, this); //垂直
ui.table_content->setVerticalScrollBar(verticalScrollBar);
horizontalScrollBar = new QScrollBar(Qt::Horizontal, this); //水平
ui.table_content->setHorizontalScrollBar(horizontalScrollBar);
ui.table_header->setHorizontalScrollBar(horizontalScrollBar);
horizontalScrollBar->setRange(1,100); //设置范围为0-100
horizontalScrollBar->setPageStep(50); //设置鼠标点击滑块以外的地方,滑块每次运动50,既滑块只能跑2次就到头了
horizontalScrollBar->setSingleStep(50); //这个确保点击向上/向下按钮,滑块跑2次也到头了
ui.horizontalLayout->addWidget(verticalScrollBar);
ui.verticalLayout->addWidget(horizontalScrollBar);

但是我发现怎么搞都不行。
原因就出在这两条:

1
2
ui.table_content->setHorizontalScrollBar(horizontalScrollBar);
ui.table_header->setHorizontalScrollBar(horizontalScrollBar);

再给两个表格设置上之后,就这么修改不起作用。

修改

1
2
3
4
5
6
7
8
9
10
11
//滚动条
verticalScrollBar = new QScrollBar(Qt::Vertical, this); //垂直
ui.table_content->setVerticalScrollBar(verticalScrollBar);
horizontalScrollBar = new QScrollBar(Qt::Horizontal, this); //水平
horizontalScrollBar->setRange(minValue,maxValue); //设置范围为0-100
horizontalScrollBar->setPageStep(1000); //设置鼠标点击滑块以外的地方,滑块每次运动20,既滑块只能跑5次就到头了
horizontalScrollBar->setSingleStep(99); //这个确保点击向上/向下按钮,滑块跑5次也到头了
ui.horizontalLayout->addWidget(verticalScrollBar);
ui.verticalLayout->addWidget(horizontalScrollBar);
connect(horizontalScrollBar, SIGNAL(valueChanged(int)), ui.table_header->horizontalScrollBar(), SLOT(setValue(int)));
connect(horizontalScrollBar, SIGNAL(valueChanged(int)), ui.table_content->horizontalScrollBar(), SLOT(setValue(int)));

这样确实是可以了。

拖动不可以

只要setPageStep设置的足够大,这样点击左右的箭头确实一步到位,但是在鼠标拖动的时候还是不行。

1
2
3
4
5
6
7
8
9
10
//滚动条
verticalScrollBar = new QScrollBar(Qt::Vertical, this); //垂直
ui.table_content->setVerticalScrollBar(verticalScrollBar);
horizontalScrollBar = new QScrollBar(Qt::Horizontal, this); //水平
horizontalScrollBar->setPageStep(1000);
ui.horizontalLayout->addWidget(verticalScrollBar);
ui.verticalLayout->addWidget(horizontalScrollBar);
connect(horizontalScrollBar, SIGNAL(valueChanged(int)), ui.table_header->horizontalScrollBar(), SLOT(setValue(int)));
connect(horizontalScrollBar, SIGNAL(valueChanged(int)), ui.table_content->horizontalScrollBar(), SLOT(setValue(int)));
connect(horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(onScrollBarValueChanged(int)));

步长不需要设置了。
槽函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//滚动条两端停靠
void AAAA::onScrollBarValueChanged(int value)
{
// 如果滚动条的值不等于最小值且不等于最大值,则将其设置为最小值或最大值
if (value != horizontalScrollBar->minimum() && value != horizontalScrollBar->maximum()) {
if (value < (horizontalScrollBar->maximum() - horizontalScrollBar->minimum()) / 2) {
// 设置为最小值
horizontalScrollBar->setValue(horizontalScrollBar->minimum());
} else {
// 设置为最大值
horizontalScrollBar->setValue(horizontalScrollBar->maximum());
}
}
}

如果是某个值就让他成为最小或最大。
让滚动条只能停靠在左右两端。
这样拖动的时候只会跳到两端,setPageStep大一点显得更加稳定。


滚动条一步到位
http://zanderchan666.github.io/2023/11/28/滚动条一步到位/
作者
Zander
发布于
2023年11月28日
许可协议