我实现了一个小部件,它有一个网格(QTableView对象)和两个scollbars,一个是水平的,一个是垂直的。我已经实现了一个函数,用于从数据库中获取要在网格中显示的数据。我想当用户按下滚动条中的箭头以便执行一个步骤时应用程序实际获取数据。相反,当用户使用whell滚动或移动滑块时,应用程序不会立即获取数据。更具体地说,我希望在用户停止滑块一段时间或释放滑块时获取数据。出于这个原因,我使用了sliderReleased()信号。此外,作为该论坛建议的用户,我已经编写了此代码用于垂直滚动操作。
void handleVTableScrollAction(int action)
{
switch(action)
{
case QAbstractSlider::SliderSingleStepAdd:
case QAbstractSlider::SliderSingleStepSub:
drawGrid();
requestSlot();
break;
case QAbstractSlider::SliderMove:
drawGrid();
m_Timer.start(500);
}
定时器连接到一个提取数据的插槽
connect (&m_Timer, SIGNAL(timeout()), this, SLOT (requestSlot()));
所以我的问题是,当我想要一步(按箭头键)时,应用程序不会立即响应。当我按箭头最新的时间似乎没有做任何事情,但当我第二次按下时,网格跟随运动。所有其他动作(滚轮和滑块移动)都能正常工作。
所以我试着像这样使用valueChange()信号:
connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(sliderSigleStep()));
connect(ui->verticalScrollBar, SIGNAL(sliderMoved(int)), this, SLOT(sliderMoveSlot()));
通过这种方式,单步工作正常,但是从不调用sliderMoveSlost,因为valueChanged信号总是首先被emmited。 我的第一期是否有解释? 我可以在两个信号发出的条件下调用函数吗?例如,如果sliderMove(int)和valueChanged(int)使用emmited,则调用sliderMoveSlot,如果只有valueChanged(int)被激活,则调用sliderSingleStep()。