2012-01-24 150 views
1

我是一名使用Qt開發GUI應用程序的學生程序員。我正在使用QTreeWidget來顯示存儲在向量中的一些屬性。在同一個窗口中,我有按鈕編輯,複製和刪除。到目前爲止,這些按鈕可以滿足他們的需求。但是我沒有選擇任何東西時遇到問題。我的程序意外地完成;我在猜測一個seg故障。我不認爲我正在處理正確選擇的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找出正在返回什麼,但我認爲它有問題獲取itemToEdit,因爲它的一個QwidgetTreeItem的價值。請僅留下有用的反饋,因爲我只對學習和克服挑戰感興趣。提前致謝!

+1

看來你有你的解決方案,但要注意與* selected *項目相關的函數的存在。他們暗示目前的項目並不總是對應於選擇。特別是,可能(取決於您的選擇模型)選擇多個項目,但我相信只有一個當前。 –

回答

4

如果沒有選擇項目時,你應該假設currentItem()方法返回NULL指針:

QString converter = itemToEdit->text(0); 

試圖從一個空指針調用一個方法是不確定的行爲,這將很可能導致分割故障。所以你應該添加如下內容:

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

我其實剛剛解決了這個問題!值0確實有效。它只是將當前項目從slot函數傳遞給動作函數的方式(slotInjectionEdit將當前項目傳遞給Edit Injection_Clicked(* itemtoEdit)。我將if語句移動到了插槽函數中,現在它工作得很好。函數:void InjectionGUI :: slotInjectionEdit() {如果(UI-> treeWidgetInjections-> CURRENTITEM()== 0){ QMessageBox提示invalidSelection; } 別的 {editInjection_Clicked(UI-> treeWidgetInjections-> CURRENTITEM()); } } –

+0

儘管感謝您的幫助! –

相關問題