【问题标题】:QTreeWidget::currentItem What returns when there is nothing selected?QTreeWidget::currentItem 什么都没有选择时返回什么?
【发布时间】:2012-01-24 17:58:00
【问题描述】:

我是一名学生程序员,使用 Qt 开发 GUI 应用程序。我正在使用 QTreeWidget 来显示存储在向量中的一些属性。在同一个窗口中,我有编辑、复制和删除按钮。到目前为止,按钮可以完成他们需要做的事情;但是,当没有选择任何内容时,我遇到了问题。我的程序意外结束;我猜是段错误。我不认为我正在处理正确选择的 currentItem。但是,Qt's Documentation 并没有说明如果没有选择任何内容会返回什么。所以我希望有更多经验的人来帮助/启发我。如果您想在包含的代码之外看到某些内容,请询问。这是我的(相关)代码:

#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。请只留下富有成效的反馈,因为我只对学习和克服挑战感兴趣。提前致谢!

【问题讨论】:

  • 您似乎有自己的解决方案,但请注意与 选定 项相关的函数的存在。它们暗示当前项目并不总是与选择相对应。特别是,可能(取决于您的选择模型)选择了多个项目,但我相信只有一个当前。

标签: c++ qt user-input qtreewidget qtreewidgetitem


【解决方案1】:

如果没有选择任何项目,你应该假设currentItem()方法返回一个NULL指针:

QString converter = itemToEdit->text(0);

试图从空指针调用方法是未定义的行为,它很可能会导致分段错误。所以你应该添加类似的东西:

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

【讨论】:

  • 我实际上刚刚解决了这个问题!值 0 确实有效。这只是我将当前项目从插槽函数传递给动作函数的方式(slotInjectionEdit 将当前项目传递给 Edit Injection_Clicked(*itemtoEdit)。我将 if 语句移动到插槽函数,现在它工作得很好。新插槽函数:void InjectionGUI::slotInjectionEdit() { if(ui->treeWidgetInjections->currentItem() == 0) {QMessageBox invalidSelection; } else {editInjection_Clicked(ui->treeWidgetInjections->currentItem());} }
  • 感谢您的帮助!!
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多