1

我已经实现了一个小部件,它有一个网格(QTableView 对象)和两个 scollbars,一个是水平的,一个是垂直的。我已经实现了一个函数,它从数据库中获取要在网格中显示的数据。我想要当用户按下滚动条上的箭头以便应用程序立即获取数据的单个步骤时。相反,当用户滚动或移动滑块时,应用程序不会立即获取数据。更具体地说,我希望在用户停止滑块一段时间或释放滑块时获取数据。出于这个原因,我使用了 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 信号总是首先发出。我的第一个问题有解释吗?我可以在发出两个信号的情况下调用函数吗?例如,仅在发出sliderMove(int) 和valueChanged(int) 信号时调用sliderMoveSlot,如果仅发出valueChanged(int) 则调用sliderSingleStep()。

4

0 回答 0