C++ QTreeWidgetItem:如何获取所选项目?

C++ QTreeWidgetItem:如何获取所选项目?,c++,qt,vector,qt4,qtreewidget,C++,Qt,Vector,Qt4,Qtreewidget,我目前是一名学生程序员,在工作中使用Qt构建GUI接口,目前在寻找解决方案时遇到了一个问题。我目前有一个界面,该界面上有编辑、删除和复制我的QTree中实例的按钮。了解我的树的填充方式可能对您很重要。QTree中显示的项目以这种方式从向量中动态追加 void InjectionGUI::addInjections_Clicked() //creates a new instance of injections { InjectionDialog newAddInjectionDialog

我目前是一名学生程序员,在工作中使用Qt构建GUI接口,目前在寻找解决方案时遇到了一个问题。我目前有一个界面,该界面上有编辑、删除和复制我的
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);
                    }
            }
}
void InjectionGUI::addInjections\u Clicked()//创建注入的新实例
{
InjectionDialog NewAddInjectDialog;//我的对话框打开供用户输入的位置
InjectionData默认值;
newAddInjectDialog.setData(默认值);
if(newAddInjectDialog.exec()==QDialog::Accepted)//检查数据返回Accepted或rejected
{
qTableInjectionData.append(newAddInjectionDialog.transInjectionData);//这会将注入对话框中的有效数据追加到向量qTableInjectionData
ui->injectionTreeWidget->clear();
对于(int i=0;iinjectionTreeWidget);//此处数据从vector中找到的注入对话框的每个实例添加到行中
qTreeWidgetItemInjectionData->setText(列++,tmpStr.setNum(i));
qTreeWidgetItemInjectionData->setText(列++,临时lineEditInjectionName);
qTreeWidgetItemInjectionData->setText(列++,injectionType);
qTreeWidgetItemInjectionData->setText(列++,tmpStr.setNum(临时LineEditParitLevel));
qTreeWidgetItemInjectionData->setText(列++,tmpStr.setNum(temp.lineEditFluidVelocity));
qTreeWidgetItemInjectionData->setText(列++,tmpStr.setNum(临时lineEditParticleMassFlow));
qTreeWidgetItemInjectionData->setText(列++,tmpStr.setNum(temp.lineEditFluidMassFlow));
qTreeWidgetItemInjectionData->setText(列++,临时lineEditComment);
}
}
}

现在我真的需要一种方法来找出用户在
QTree
中选择了哪个项目,这样我就可以将它从向量中删除。我的psuedo是识别已选定的行、确认删除、删除项目(项目已选定)、重新分配ID列;因为在此列中为每个实例分配了一个编号。我在看这张三年前贴的照片;但它主要是指我已经回顾过的文档。另外,选择的答案似乎非常不确定,因为另一个答案似乎在正确的轨道上。我知道这个答案可能就在我面前;但是我能说什么呢,noob就是noob,我很难理解它的实现。请只留下富有成效的反馈,因为我只对学习和完成这项任务感兴趣。提前谢谢

您需要获取
selectionModel
,然后获取所选索引,然后对其进行迭代:

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

selectionModel
位于
qabstractemmodel
中。注意C++11
auto

我现在就尝试一下;也许我应该使用一个独立的connect语句来返回所选的项,这样我就可以重用其他函数了?@wyletchoyotesg。请开导我。什么是
独立的connect语句
?我想使用、删除、复制和编辑的每个功能都有按钮。其中每一个都有connect语句,但也许我应该为树小部件项单击/选择另一个connect语句?类似于将选定项连接到指针函数,该函数返回指向选定项的指针。然后使用copy、edit和delete中的connect语句。选择*项并执行操作。此外,connect语句手动连接信号和插槽。@WYLECTOYOTESG。只需将一些信号连接到执行上述操作的函数。将
camModel\uu->removeRow
替换为您的模型应该对索引执行的任何操作。