QListWidget水平滚动条导致选择超出视图

时间:2017-06-19 14:19:30

标签: c++ qt qlistwidget qlistwidgetitem

我之前已经问过这个问题了,一个很棒的人带领我找到了解决这个问题的好方法。但是,我希望看看是否有更好的解决方案。一个实际上完全阻止我的QListWidget中的任何移动。

工作演示示例

ListDemo zipfile http://nexrem.com/test/ListDemo.zip

ListDemo cpp代码

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    myListWidget = new QListWidget();

    /*
     * The signal-slot below is a temporary workaround for the shifting issue.
     * This will ensure that the item selected remains in view,
     * This is achieved by forcing the item to be in the center of the window;
     * however, this has an undesired side-effect of visible 'jumping' as the list
     * scrolls to center the item.
     */
    //connect (myListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this,
    //         SLOT(scrollToItem(QListWidgetItem*)));

    for (int i = 0; i <= 1000; ++i)
    {
        QListWidgetItem * myItem = new QListWidgetItem(myListWidget);
        QString text("");
        for (int i = 0; i <= 40; ++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);
    }
    auto selected = myListWidget->selectedItems();
    if (selected.size() == 1)
    {
        myListWidget->scrollToItem(selected.front());
    }
    setCentralWidget(myListWidget);
}


void MainWindow::scrollToItem(QListWidgetItem * item)
{
    std::cout << "Scrolling to the item." << std::endl;
    myListWidget->scrollToItem(item, QAbstractItemView::PositionAtCenter);
}

问题: 每当我有一个带有水平滚动条和隐藏行的QListWidget时,我就会产生一种不良行为,无论何时用户点击某个项目,它都会从视图中消失,整个列表会向下移动。 在上面的示例中,我隐藏了所有其他行,以演示此行为。

解决方法: 解决方法是使用信号插槽连接,强制将所选项目滚动回视图并定位在中心。 请注意,我必须使用PositionAtCenter作为EnsureVisible不起作用。它认为该项目在视野之外是可见的。 这种解决方法是可以接受的但是,当您的选择被强制定位在中心时,会出现明显的“跳跃”。这是一种不良副作用。

此时我不确定这是否是一个QT错误(我不认为水平滚动条应该强制您的选择不在视图中)或者我的代码缺少一些重要的东西。

修复: 根据@ G.M.的评论,所有缺失的都是myListWidget->setAutoScroll(false);

1 个答案:

答案 0 :(得分:1)

如评论中所述......

要防止选择时自动滚动,请禁用autoScroll property。所以,在提供的示例代码中做...

myListWidget->setAutoScroll(false);

请注意,当项目在列表视图上拖动时,此属性也会生效,因此如果您希望列表视图充当放置站点,那么当您获得{{1}时,您可能希望重新启用此属性}}