2012-01-24 72 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

尽管感谢您的帮助! –

相关问题