1

ファイル名とファイルのパラメーターで満たされたテーブル (QTableWidget) を表示する Qt 4.8 を使用してプログラムを作成しています。まず、ユーザーがファイルをリストに追加してから、プロセスをクリックします。コード自体は、単純な進行状況の説明でテーブルの内容を更新します。デフォルトでテーブルを自動的にスクロールして、最後に処理されたファイルを表示し、そのコードの準備ができていることを望みます。

手でスクロールしたい場合、何かが変更されてビューポートが最後の要素に移動するとすぐに、ウィジェットが自動的にスクロールされます。ビューを変更したいのがユーザーであることを検出した場合、自動スクロールをオーバーライドできるようにしたいと考えています。

この動作は、多くのターミナル エミュレータ プログラムで見られます。新しい行が追加されると、ビューはスクロールされますが、ユーザーが端末に以前の行を強制的に表示させると、端末は下にスクロールしようとしません。

どうすればそれができますか?

解決:

内部に埋め込まれた QTableWidget と QScrollBar によって処理されるイベントをフィルター処理するオブジェクトを作成しました。自動スクロールをオフにするイベントを見つけたら、フラグを設定し、そのフラグが設定されている場合はスクロール ビューを停止します。

すべてが tableController クラス内に実装されています。ここでは、3 つの重要な方法の一部を紹介します。

bool tableController::eventFilter(QObject* object, QEvent* event)
{
  switch (event->type())
  {
    case QEvent::KeyPress:
    case QEvent::KeyRelease:
    case QEvent::Wheel:
    case QEvent::MouseButtonDblClick:
    case QEvent::MouseButtonPress:
    case QEvent::MouseButtonRelease:
      _autoScrollEnabled = false;
    default:
      break;
  }
  return QObject::eventFilter(object, event);
}

void tableController::changeFile(int idx)
{
  [...]
  if (_autoScrollEnabled)
  {
    QTableWidgetItem* s = _table.item(_engine.getLastProcessed(), 1);
    _table.scrollToItem(s);
  }
  [...]
}

void tableController::tableController()
{
   [...]
   _autoScrollEnabled = true;
   _table.installEventFilter(this);
   _table.verticalTableScrollbar()->installEventFilter(this);
   [...]
}

すべての助けをありがとう。誰かがそれが役に立つことを願っています:)

4

2 に答える 2

0

QTableWidgetそのwheelEventをサブクラス化してオーバーロードします。提供されたQWheelEventオブジェクトのパラメーターを使用して、ユーザーが上下にスクロールしたかどうかを判断できます。

wheelEvent次に、オーバーライドで設定(またはリセット)される単純なブール値フラグを使用します。呼び出しを担当するメソッドscrollToBottom()は、このブール値フラグを考慮する必要があります。

そのフラグをいつ設定またはリセットするかを判断する方法を見つける必要があります。たとえば、ユーザーが上にスクロールしたときに常にフラグを設定し、ユーザーが下にスクロールして現在表示されている領域が下部にあるときにリセットします。

于 2012-08-23T06:37:07.770 に答える