Короче это из-за гонки евентов, там когда удаляется единственный item из списка, текущий индекс как бы становится -1, но где-то он еще не успевает внутри поменяться пока полностью не отработает слот currentRowChanged, так как до этого прилетает событие фокуса от кнопки при setEnabled, и внутренней модели повторно прилетает опять индекс -1, а внутри все еще 0 индекс, по этому повторно и шлет сигнал.
Если setEnabled у кнопки в очередь событий поставить, через emit или invokeMethod, то магия исчезает )
#bug #QListWidget
Благодарю! Помогло это
QMetaObject::invokeMethod(this, "antiBugMagicChangeRow", Qt::QueuedConnection, Q_ARG(int, row));
С удовольствием бы сделал инвок с лямбдой без слота, но он поддерживается с 5.10, а у меня 5.7...