我有一个特殊的问题。我有一个 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
! 但是,从用户体验的角度来看,每次单击某个项目时都让列表移动并不是一种理想的行为(即使该项目现在位于屏幕的中心)。我还有其他选择吗?