QTreeWidget :: currentItem Что возвращает, когда ничего не выбрано? - PullRequest
2 голосов
/ 24 января 2012

Я студент-программист, использующий Qt для разработки приложения с графическим интерфейсом.Я использую QTreeWidget для отображения некоторых свойств, хранящихся в векторе.В том же окне у меня есть кнопки редактирования, копирования и удаления.Пока что кнопки работают, чтобы делать то, что им нужно;Однако у меня возникла проблема, когда ничего не выбрано.Моя программа неожиданно заканчивается;Я угадываю ошибку сегмента.Я не думаю, что я обрабатываю текущий элемент выбран правильно.Однако Документация Qt об этом не говорит, что возвращается, если ничего не выбрано.Так что я надеялся, что кто-то с большим опытом поможет мне в этом.Если есть что-то, что вы хотели бы увидеть вне кода, просто спросите.Вот мой (соответствующий) код:

#include "injectiongui.h"
#include "ui_injectiongui.h"
#include "injectiondialog.h"
#include "ui_injectiondialog.h"
#include "injectiondata.h"
#include <QMessageBox>

InjectionGUI::InjectionGUI(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::InjectionGUI)
{
    ui->setupUi(this);
    ui->groupBoxGlobalParticlesPerCell->hide();
    connect(ui->pushButtonEdit, SIGNAL(clicked()), this, SLOT(slotInjectionEdit()));
}

void InjectionGUI::buildTreeWidget() 
{   
   //Build or Refresh Tree Widget with info from the vector
}

void InjectionGUI::editInjection_Clicked(QTreeWidgetItem *itemToEdit) //Creates an Injection Dialog to edit an Item from the Vector
{
    QString converter = itemToEdit->text(0);
    int id = converter.toInt();
    InjectionDialog editInjectionDialog;
    InjectionData presetValues;
    if(itemToEdit == 0) // this was my attempt to handle nothing selected
    {
        QMessageBox invalidSelection;
        invalidSelection.setText("Error: No row selected to edit");
        return;
    }
    presetValues = qTreeInjectionData.at(id);
    editInjectionDialog.setData(presetValues);
    presetValues = editInjectionDialog.getData();
    editInjectionDialog.exec();
    qTreeInjectionData.replace(id, editInjectionDialog.transInjectionData);
    buildTreeWidget();
}

void InjectionGUI::slotInjectionEdit()
{
    editInjection_Clicked(ui->treeWidgetInjections->currentItem());
}

Я пытался использовать qDebug, чтобы выяснить, что возвращается, но я думаю, что у него возникают проблемы с получением значения itemToEdit, потому что это QwidgetTreeItem.Пожалуйста, оставляйте только продуктивные отзывы, так как меня интересует только изучение и преодоление проблемы.Заранее спасибо!

1 Ответ

5 голосов
/ 24 января 2012

Если элемент не выбран, вы должны предположить, что метод currentItem() возвращает указатель NULL:

QString converter = itemToEdit->text(0);

Попытка вызова метода из нулевого указателя - неопределенное поведение, и оно, скорее всего, будетвызвать ошибку сегментации.Поэтому вы должны добавить что-то вроде:

if(itemToEdit == NULL) {
  // error handling, most likely a simple return
}
...