私には独特の問題があります。私は 1000 個の QListWidgetItem の QListWidget を持っています。誰かが入力を開始するたびに次のコードをトリガーする検索テキストボックスがあります。
QRegExp regExSearch(searchText, Qt::CaseInsensitive, QRegExp::RegExp);
for (QListWidgetItem * currIt : allItems)
{
currIt->setHidden( !(currIt->text().contains(regExSearch)) );
}
最終的には、検索が実行されると、600 個のアイテムが非表示になり、400 個のアイテムが表示される QListWidget が作成されます。アイテムをクリックするたびに、リスト全体が数行下にジャンプするだけなので、選択したアイテムが画面に表示されません。
原因と思われるのは setHidden であることを確認しました。アイテムを非表示/表示せずに、見つかった行を強調表示するだけでは、選択によってリストがスクロールダウンすることはありません。
そのため、私は何が欠けているのだろうかと思っています。アイテムを選択するたびに QListWidget がシフトしないようにするには、どの関数を呼び出す必要がありますか?
以下の作業例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QListWidget>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QListWidget * myListWidget = new QListWidget();
for (int i = 0; i <= 1000; ++i)
{
QListWidgetItem * myItem = new QListWidgetItem(myListWidget);
QString text("");
for (int i = 0; i <= 100; ++i)
{
text.append("W");
}
myItem->setText(text + QString::number(i));
}
for (int i = 0; i <= 1000; ++i)
{
if (i%2)
myListWidget->item(i)->setHidden(true);
}
setCentralWidget(myListWidget);
}
MainWindow::~MainWindow()
{
delete ui;
}
私は基本的に、問題を水平スクロールバーに複製して分離しました。私の元のアプリケーションとこの mcve では、項目 (たとえば、インデックス 314) を選択すると、リストが下にジャンプします。ただし、水平スクロールバーがないようにリストのサイズを変更すると、移動しません。
問題が水平スクロールバーにあることがわかったので、ジャンプが発生しないようにする方法はまだわかりません。
アップデート:
SIGNAL-SLOT をそのまま使用しようとしました:
connect(myListWidget, SIGNAL(itemClicked(QListWidgetItem*)), myListWidget,
SLOT(scrollToItem(const QListWidgetItem*,QAbstractItemView::ScrollHint)));
また、アイテムが表示されるように明示的に指定する独自のスロットを作成しようとしました。
void MainWindow::scrollToItem(QListWidgetItem * item)
{
std::cout << "Scrolling to item." << std::endl;
myListWidget->scrollToItem(item, QAbstractItemView::EnsureVisible);
}
しかし、それでも飛び降りて見えなくなります!ScrollHint をPositionAtCenter
!に設定すると機能します。ただし、ユーザー エクスペリエンスの観点からすると、項目をクリックするたびにリストがシフトするのは望ましい動作ではありません (その項目が画面の中央にある場合でも)。他に選択肢はありますか?