Я бы даже сделал так:
C++ (Qt)
void QListWidget::itemChanged(QListWidgetItem * item) {
    int count = ui->listWidget->count(); // вычисляем количество вес строк в листвиджете
 
    // перебираем все айтемы кроме самого верхнего
    for (int i = 1; i < count; i++) {
        QListWidgetItem * child = ui->listWidget->item(i); // берем айтем на каждой строке
        child->setCheckState(Qt::Unchecked); // сбрасываем крестик
    }
    item->setCheckState(Qt::Checked)
}
А зацикливания не произойдёт? Состояния айтема меняем, соответственно снова же должен это слот вызваться? не надо это всё в 
ui->listWidget->blockSignals(..) обернуть?