Я уже задавал этот вопрос ранее, и замечательный человек привел меня к достойному решению этой проблемы. Тем не менее, я надеюсь увидеть, есть ли лучшее решение. Тот, который фактически предотвращает любое смещение в моем 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);
Как уже упоминалось в комментарии …
Для предотвращения автоматической прокрутки при выборе отключите autoScroll
имущество. Итак, в приведенном примере кода сделать …
myListWidget->setAutoScroll(false);
Обратите внимание, что это свойство также оказывает влияние, когда элементы перетаскиваются через представление списка, поэтому, если вы хотите, чтобы представление списка действовало как перетаскиваемый сайт, вы, возможно, захотите снова включить это свойство, когда получите QDragEnterEvent
,
Других решений пока нет …