当用户选择项

时间:2017-06-06 15:09:27

标签: c++ qt qlistwidget qlistwidgetitem

我有一个特殊的问题。我有一个1000 QListWidgetItem的QListWidget。 我有一个搜索文本框,只要有人开始输入它就会触发以下代码。

QRegExp regExSearch(searchText, Qt::CaseInsensitive, QRegExp::RegExp);
for (QListWidgetItem * currIt : allItems)
{
    currIt->setHidden( !(currIt->text().contains(regExSearch)) );
}

最终存在的是,一旦我的搜索被执行,我将有一个隐藏600个项目的QListWidget,并显示400个。每当我点击一个项目时,整个列表就会向下跳几行,这样我的选择就不会在屏幕上显示。

我已经确认它似乎是导致它的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,它确实有效!但是,从用户体验的角度来看,每次单击某个项目时,列表都会移动(即使该项目现在位于屏幕的中心),这也不是一种理想的行为。我还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

使用QListWidget::scrollToItem,您可以重新滚动列表,以便显示所选项目。

shared_ptr也需要scrollToItem,您可以指定ScrollHint滚动到的位置(默认为QListWidget

  
      
  • EnsureVisible:滚动以确保该项目可见。
  •   
  • EnsureVisible:滚动以将项目置于视口顶部。
  •   
  • PositionAtTop:滚动以将项目定位在视口的底部。
  •   
  • PositionAtBottom:滚动以将项目定位在视口的中心。
  •   

以下完整的工作示例:

PositionAtCenter