QListWidget水平滚动条导致选择超出视野
QListWidget horizontal scrollbar causes selection to go out of view
我之前问过这个问题,一个很棒的人引导我找到了解决这个问题的合适方法。但是,我希望看看是否有更好的解决方案。一个实际上完全阻止了我的 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
不起作用。它认为该项目在不可见时是可见的。
这种解决方法是可以接受的;但是,当您的选择被强制定位在中心时,可以看到 'jump'。这是一种不良的副作用。
目前我不确定这是否是一个 QT 错误(我不认为水平滚动条会迫使您的选择不可见)或者我的代码缺少一些重要的东西。
修复:
根据@G.M.的评论,所缺少的只是myListWidget->setAutoScroll(false);
如评论中所述...
要防止选择时自动滚动,请禁用 autoScroll
property。因此,在提供的示例代码中执行...
myListWidget->setAutoScroll(false);
请注意,此 属性 在将项目拖动到列表视图上时也会产生影响,因此如果您希望列表视图充当放置站点,那么您可能需要重新启用此 属性 当你得到 QDragEnterEvent
.
我之前问过这个问题,一个很棒的人引导我找到了解决这个问题的合适方法。但是,我希望看看是否有更好的解决方案。一个实际上完全阻止了我的 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
不起作用。它认为该项目在不可见时是可见的。
这种解决方法是可以接受的;但是,当您的选择被强制定位在中心时,可以看到 'jump'。这是一种不良的副作用。
目前我不确定这是否是一个 QT 错误(我不认为水平滚动条会迫使您的选择不可见)或者我的代码缺少一些重要的东西。
修复:
根据@G.M.的评论,所缺少的只是myListWidget->setAutoScroll(false);
如评论中所述...
要防止选择时自动滚动,请禁用 autoScroll
property。因此,在提供的示例代码中执行...
myListWidget->setAutoScroll(false);
请注意,此 属性 在将项目拖动到列表视图上时也会产生影响,因此如果您希望列表视图充当放置站点,那么您可能需要重新启用此 属性 当你得到 QDragEnterEvent
.