Я разрабатываю приложение Qt с QTreeWidget в форме Qt Designer. Пользователь может нажать кнопку добавления нового элемента, и новый элемент появится с именем по умолчанию, после чего пользователь должен ввести имя элемента.
Итак, это мой код:
void MyFormClass::on_addNewItemButton_clicked()
{
auto newItem = new QTreeWidgetItem({ _defaultName });
newItem->setFlags(newItem->flags() | Qt::ItemIsEditable);
ui->tree->addTopLevelItem(newItem);
ui->tree->editItem(newItem);
}
В MyFormClass я также ловлю сигнал itemChanged для выполнения некоторых операций с вновь созданным элементом и его именем:
void MyFormClass::on_tree_itemChanged(QTreeWidgetItem *item, int column)
{
if (item->text(0).isEmpty()) {
...
} else {
...
}
}
И все работает нормально, за исключением случая, когда пользователь ничего не меняет и просто где-то нажимает Enter/щелкает левой кнопкой мыши. В этом случае QTreeWidget [вероятно] проверяет, что элемент не был фактически изменен, и не выдает правильный сигнал.
Итак, есть идеи, как я могу создать новый элемент, затем разрешить пользователю немедленно его редактировать и, наконец, получить любой результат редактирования (то есть то же самое, что и по умолчанию)? Может быть, использование QTreeView поможет?
Qt 5.4.2, C++11, платформы Linux/Windows
Бонусные вопросы: почему Qt разработан таким образом? Я имею в виду, разве не мое дело проверить, изменился предмет или нет? Хорошо, сигнал называется itemChanged, но почему нет сигнала editFinished или что-то в этом роде?