3

私は Qt を使用して GUI アプリケーションを開発する学生プログラマーです。QTreeWidget を使用して、ベクトルに格納されているいくつかのプロパティを表示しています。同じウィンドウに、編集、コピー、削除のボタンがあります。これまでのところ、ボタンは必要なことを行うために機能します。ただし、何も選択されていないときに問題が発生しています。プログラムが予期せず終了します。私はセグフォルトを推測しています。正しく選択された currentItem を処理しているとは思いません。ただし、これに関する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を使用して何が返されているかを調べてみましたが、QwidgetTreeItemであるため、itemToEditの値を取得するのに問題があると思います。私は挑戦を学び、克服することにのみ興味があるので、生産的なフィードバックのみを残してください. 前もって感謝します!

4

1 に答える 1

5

項目が選択されていない場合は、currentItem()メソッドが NULL ポインターを返すと想定する必要があります。

QString converter = itemToEdit->text(0);

null ポインターからメソッドを呼び出そうとすることは未定義の動作であり、セグメンテーション違反が発生する可能性が高くなります。したがって、次のようなものを追加する必要があります。

if(itemToEdit == NULL) {
  // error handling, most likely a simple return
}
于 2012-01-24T18:25:35.013 に答える