2012-01-24 14 views
1

私はQtを使ってGUIアプリケーションを開発する学生プログラマーです。私はベクトルに格納されているいくつかのプロパティを表示するためにQTreeWidgetを使用しています。同じウィンドウに、編集、コピー、および削除ボタンがあります。今のところボタンは必要なことをするために働いています。しかし、私は何も選択されていないときに問題を抱えています。私のプログラムは予期せず終了する。私はseg faultを推測しています。私は正しく選択されたcurrentItemを処理しているとは思わない。しかし、これにはQt's Documentationは、何も選択されていない場合に何が返されるかを示していません。だから私はこの事を助けたり啓発したりするより多くの経験を持つ人がいることを願っていました。コードの側面を見たいと思っているものがあれば、尋ねるだけです。ここに私の(関連)のコードは次のとおりです。QTreeWidget :: currentItem何も選択されていないときに何を返しますか?

#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の値を取得すると思います。私は挑戦を学んで克服することに興味があるので、生産的なフィードバックを残してください。前もって感謝します!

+1

解決策はありますが、*選択した*項目に関連する機能の存在に注意してください。それらは、現在のアイテムが必ずしも選択に対応しないことを意味する。特に、選択された複数のアイテムが選択モデルによって異なる場合がありますが、現在のものは1つだけと考えられます。 –

答えて

4

項目が選択されていない場合、あなたはcurrentItem()メソッドはNULLポインタを返すことを想定する必要がありますNULLポインタからメソッドを呼び出そうと

QString converter = itemToEdit->text(0); 

は未定義の動作ですが、それが最も可能性の高いセグメンテーションを引き起こします失敗。だからあなたのようなものを追加する必要があります:

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

私は実際にこれを解決しました!値0は機能します。それはちょうど私が現在のアイテムをスロット関数からアクション関数(slotInjectionEditは現在のItemを編集Injection_Clicked(* itemtoEdit)に渡していた)を渡す方法でした。関数:ボイドInjectionGUI :: slotInjectionEdit() {IF(UI-> treeWidgetInjections->のCurrentItem()== 0){ QMessageBox invalidSelection;他 } {editInjection_Clicked(UI-> treeWidgetInjections->のCurrentItem()); } } –

+0

ご協力ありがとうございます! –

関連する問題