QListWidget 水平滚动条导致选择消失

Posted

技术标签:

【中文标题】QListWidget 水平滚动条导致选择消失【英文标题】:QListWidget horizontal scrollbar causes selection to go out of view 【发布时间】:2017-06-19 14:19:30 【问题描述】:

我之前已经问过这个问题,一位出色的人引导我找到了解决该问题的体面的解决方法。但是,我希望看看是否有更好的解决方案。一个实际上完全防止我的 QListWidget 发生任何变化的工具。

工作演示示例

ListDemo 压缩文件 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-&gt;setAutoScroll(false);

【问题讨论】:

看起来像一个 QT 错误。通过 Qt 5.9.0、MSVC2015_x64 确认。如果没有隐藏项目,则不会发生...您应该向 QT 报告 myListWidget-&gt;setAutoScroll(false) 解决问题了吗? @G.M.我不敢相信这是这么简单的事情……但确实如此。请将其发布为答案。 您的代码不完整;特别是,它似乎缺少一个main() 函数和至少一个#include。请edit你的代码,所以这是你的问题的minimal reproducible example,然后我们可以尝试重现并解决它。您还应该阅读How to Ask。 【参考方案1】:

正如评论中提到的......

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

myListWidget->setAutoScroll(false);

请注意,当项目被拖动到列表视图上时,此属性也会产生影响,因此如果您希望列表视图充当放置站点,那么您可能希望在收到 QDragEnterEvent 时重新启用此属性.

【讨论】:

以上是关于QListWidget 水平滚动条导致选择消失的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 的 Interface Builder 中没有水平滚动条

多个modal重叠,导致modal滚动条消失

垂直滚动条导致水平滚动条

在单击+拖动时禁用 QListWidget 中的自动选择项目

Facebook Like 按钮导致水平滚动条

隐藏 mfc 水平滚动条