ファイル名とファイルのパラメーターで満たされたテーブル (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);
[...]
}
すべての助けをありがとう。誰かがそれが役に立つことを願っています:)