1

グリッド (QTableView オブジェクト) と 2 つのスコルバー (水平方向と垂直方向) を持つウィジェットを実装しました。データベースからグリッドに表示されるデータをフェッチする関数を実装しました。ユーザーがスクロールバーから矢印を押して、アプリケーションが即座にデータをフェッチする単一のステップを作成したいのです。逆に、ユーザーがホイールでスクロールしたり、スライダーを動かしたりすると、アプリはデータを即座に取得しません。より具体的には、ユーザーがスライダーをしばらく停止するか、スライダーを離したときにデータを取得したいと考えています。このため、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()));

したがって、私の問題は、(矢印キーを押して) 1 つのステップを実行しようとすると、アプリが即座に応答しないことです。最初に矢印を押すと、何も行われていないように見えますが、2 回目に押すと、グリッドが動きに従います。他のすべての動き (ホイールとスライダーの動き) は正常に機能します。

だから私は valueChange() シグナルを次のように使用しようとしました:

  connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(sliderSigleStep()));
  connect(ui->verticalScrollBar, SIGNAL(sliderMoved(int)), this, SLOT(sliderMoveSlot()));

このようにして、単一のステップは正常に機能しますが、valueChanged シグナルが常に最初に発行されるため、sliderMoveSlost は決して呼び出されません。私の最初の問題の説明はありますか?2 つのシグナルが発せられた状態で関数を呼び出すことはできますか? たとえば、sliderMove(int) および valueChanged(int) シグナルが発行された場合にのみ、sliderMoveSlot を呼び出し、valueChanged(int) のみが発行された場合に、sliderSingleStep() を呼び出します。

4

0 に答える 0