QTreeWidgetItem: Как я могу получить выбранный элемент?

В настоящее время я являюсь студентом-программистом, использующим Qt для создания графического интерфейса на работе, и в настоящее время я сталкиваюсь с проблемой поиска решения в Документация Qt по QTreeWidgetItem. В настоящее время у меня есть интерфейс с кнопками для редактирования, удаления и копирования экземпляров в моем QTree. Вам может быть важно понять, как заселено мое дерево. Таким образом, элементы, отображаемые в QTree, динамически добавляются из вектора.

void InjectionGUI::addInjections_Clicked() //creates a new instance of injections
{
    InjectionDialog newAddInjectionDialog; //where my dialog opens for user input
    InjectionData defaultValues; 
    newAddInjectionDialog.setData(defaultValues);
            if(newAddInjectionDialog.exec() == QDialog::Accepted)//a check data returns either Accepted or rejected 
            {
               qTableInjectionData.append(newAddInjectionDialog.transInjectionData); //this appends the valid data from the injection dialog to the vector qTableInjectionData
                ui->injectionTreeWidget->clear();
                for (int i=0; i < qTableInjectionData.size(); i++) // here I add the data from the vector to the tree widget.
                    {
                    InjectionData temp = qTableInjectionData.at(i);
                        QString injectionType;
                        QString tmpStr;
                        int column = 0;

                        //need sorting solution(still working on this)
                        if(temp.particleInjectionActive == true) // this evaluates the injection types
                        {
                            if(temp.particleInjectionOrLiquidDroplets == true)
                            {
                                injectionType += "(LD)";
                            }
                            else
                            {
                                injectionType += "(P)";
                            }
                        }
                        if(temp.fluidInjectionActive == true)
                        {
                            injectionType += "(F)";
                        }
                        QTreeWidgetItem *qTreeWidgetItemInjectionData = new QTreeWidgetItem(ui->injectionTreeWidget); //Here data is added into rows from each instance of injection dialog found in vector
                        qTreeWidgetItemInjectionData->setText(column++, tmpStr.setNum(i));
                        qTreeWidgetItemInjectionData->setText(column++, temp.lineEditInjectionName);
                        qTreeWidgetItemInjectionData->setText(column++, injectionType);
                        qTreeWidgetItemInjectionData->setText(column++, tmpStr.setNum(temp.lineEditParitcleVelocity));
                        qTreeWidgetItemInjectionData->setText(column++, tmpStr.setNum(temp.lineEditFluidVelocity));
                        qTreeWidgetItemInjectionData->setText(column++, tmpStr.setNum(temp.lineEditParticleMassFlow));
                        qTreeWidgetItemInjectionData->setText(column++, tmpStr.setNum(temp.lineEditFluidMassFlow));
                        qTreeWidgetItemInjectionData->setText(column++, temp.lineEditComment);
                    }
            }
}

Теперь мне действительно нужен способ узнать, какой элемент пользователь выбрал в QTree, чтобы я мог удалить его из вектора. Мой псевдоним заключается в том, чтобы определить, какая строка была выбрана, подтвердить удаление, удалить itemAt (выбранный элемент), переназначить столбец идентификатора; потому что каждому экземпляру присваивается номер в этом столбце. Я просматривал этот пост, опубликованный три года назад; но в основном это просто ссылка на документацию, которую я уже просматривал. Кроме того, выбранный ответ кажется крайне неубедительным, поскольку другой ответ, похоже, находится на правильном пути. Я понимаю, что этот ответ может быть прямо передо мной здесь; но что я могу сказать, нубы будут нубами, и мне трудно понять реализацию. Пожалуйста, оставляйте только продуктивные отзывы, так как я заинтересован только в изучении и выполнении этой задачи. Заранее спасибо.


person Wylie Coyote SG.    schedule 23.01.2012    source источник


Ответы (1)


Вам нужно получить selectionModel, затем выбранные индексы, а затем перебрать их:

treeWidget->selectionModel()->selection();
  auto idx = sel.indexes();
  foreach(auto index, idx) {
    camModel_->removeRow(index.row());
  }
}

selectionModel находится в QAbstractItemModel. Обратите внимание на C++11 auto.

person pmr    schedule 23.01.2012
comment
Я сейчас попробую; может быть, вместо этого мне следует иметь независимый оператор подключения, чтобы вернуть выбранный элемент, чтобы я мог повторно использовать его для других функций? - person Wylie Coyote SG.; 23.01.2012
comment
@WylieCoyoteSG. Пожалуйста, просветите меня. Что такое independent connect statement? - person pmr; 23.01.2012
comment
У меня есть кнопки для каждой функции, которую я хотел бы использовать, удалять, копировать и редактировать. У каждого из них будет оператор подключения, но, возможно, у меня должен быть другой оператор подключения для щелкнутого/выбранного элемента виджета дерева? Что-то больше похожее на подключение Item Selected к функции указателя, которая возвращает указатель на выбранный элемент. затем с помощью операторов подключения из копирования, редактирования и удаления. Возьмите *Item Selected и делайте что-нибудь. - person Wylie Coyote SG.; 23.01.2012
comment
Кроме того, операторы подключения вручную соединяют сигналы и слоты. - person Wylie Coyote SG.; 23.01.2012
comment
@WylieCoyoteSG. Просто подключите некоторый сигнал к функции, которая выполняет вышеуказанное. Замените camModel_->removeRow тем, что ваша модель должна делать с индексами. - person pmr; 23.01.2012
comment
ОК, похоже, это отличное место для запуска моей функции выбора элемента; Спасибо за вашу помощь. - person Wylie Coyote SG.; 23.01.2012
comment
Этот фрагмент кода явно некорректен. Первое выражение treeWidget->selectionModel()->selection(); тривиально сводится к оператору noop, а закрывающие фигурные скобки не имеют соответствия. Однако, даже если бы эти синтаксические и семантические ошибки не имели место, этот фрагмент кода все равно был бы лишним на несколько строк. Почему? Потому что вызов метода QTreeWidget::selectedItems(), который напрямую выдает список выбранных в данный момент элементов дерева, значительно проще, чем просить помощи у бюрократических посредников, таких как QAbstractItemView и QItemSelectionModel. </sigh> - person Cecil Curry; 22.02.2019