QSlider和QScrollArea结合很简单,只需要如下绑定其QScrollBar成员就可以实现通过QSlider滑动界面以及指示当前界面位置。
ui->verticalSlider->setSingleStep(ui->scrollArea->verticalScrollBar()->singleStep());
ui->verticalSlider->setMaximum(ui->scrollArea->verticalScrollBar()->maximum());
ui->verticalSlider->setMinimum(ui->scrollArea->verticalScrollBar()->minimum());
connect(ui->scrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)), ui->verticalSlider, SLOT(setValue(int)));
connect(ui->verticalSlider, SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int)));在这里插入代码片
但是QTableView在一些情况下无法使用该方法,因为QTableView在其model变化时,会改变显示的内容。导致其QSrollArea成员是一直在变化的,最后尝试可行的方法是把QSlider的单步步长设为1,发现刚好是每步移动QTableView的一行,然后在每次刷新model后,获取当前QTableView的行数,那么QSlider的最长应该就是总的行数减去一页的行数(能移动的步数)。具体代码如下:
//根据日期查询数据更新表格
void Form_data_mearsure::tabV_refresh(const QDate &date)
{
//更新表格
model_tabV_MeasureData->clear();
App::self()->m_dataAccess->selectMeasureData(date,model_tabV_MeasureData);
model_tabV_MeasureData->sort(0,Qt::DescendingOrder);//倒序显示
ui->verticalSlider->setSingleStep(1);
if(ui->tableView->rowHeight(0) > 0)
ui->verticalSlider->setMaximum(model_tabV_MeasureData->rowCount()-ui->tableView->height()/ui->tableView->rowHeight(0));
}