QT QTableWidget空值检测问题

在上篇文章结尾我说我们重写的那个 accept() 函数代码里还有另一个要注意的点,就是获取tableWidget条目值的问题,这篇来总结一下我遇到的坑.

一、写在前面的废话(无情跳过)
程序猿们应该都有遇到过这个问题–这段代码怎么可能有问题?我在那个界面里就是这么写的啊,完全一个套路啊?或者,谁谁谁就是这么写的啊,为什么他的不错?为什么到我写就出错?这种一般都是我们小白照葫芦画瓢画出来的错,不知道为什么这么写,只知道别人这么写就是对的啊,毕竟才开始接触的时候不知道怎么用,也不管三七二十一,看别人怎么用我就怎么用,结果就悲剧了,今天就分享我遇到的这个坑.

二、问题描述
这个问题跟上篇文章也算是兄弟问题了,两个问题都是要解决空值检测这个大问题,这篇文章遇到的问题是:获取表格控件值失败.

检查别的控件是否为空的时候都直接用的

if(ui->buttonName->text() == ""){...}

这个判断条件,也一直很顺畅,没有遇到什么坎,但这次在qtablewidget这栽了跟头,只要执行到 ui->tablewidget->item(0,0)->text() 就崩,崩就崩吧,让人疑惑的是在好几个界面用了表格控件,还有的崩有的不崩,这就头大了.

项目具体情况
这里说一下我在这个项目中是怎么用 qtablewidget 控件的–双击原页面中的qtablewidget条目,跳出一个模态框,模态框里是一个仅有一行的qtablewidget控件,用来增加或者修改原有值,如果是增加的话,那一行就是空的,如果是修改的话,那一行就会填上原值.这样的话,就会有以下三种情况出现:

  • (1) 仅支持修改(本身有值)
  • (2) 仅支持增加(本身为空)
  • (3) 既支持修改也支持增加(本身不一定,修改就有值,增加就空)

qtablewidget的实现方法
对应上面的三种情况,实现方法如下:

  • (1) 仅修改:每个单元格都用下面的方法进行设置
QTableWidgetItem *item = new QTableWidgetItem(oldValue);
ui->tableWidget->setItem(0,0,item);
  • (2) 仅增加:未对qtablewidget的item进行任何设置
  • (3) 既支持修改又支持增加:参考上面两条,有修改就设置,没有就不动

三、解决方法

  • (1) 首先,仅支持修改的
    因为原来就已经对每个item进行了设置,直接用
 if(ui->tablewidget->item(0,0)->text() == ""){...}

进行判断即可;

  • (2) 其次,仅支持增加的
    之前没有进行过任何设置,此时qtablewidget的单元格里并没有item,所以如果我们用上面的方法进行判断他就会崩,因为此时 ui->tablewidget->item(0,0) 是个空指针,空指针又怎么会有text() 呢,但如果用户输入了值,系统会自动为他加上item,所以,我们只需要判断此时的item是否为空即可:
if(ui->tablewidget->item(0,0) == NULL){...}
  • (3) 最后,既支持修改,又支持增加的
    ①这种情况下我们并不知道检查的时候到底应该查修改还是应该查增加,所以上面两种方法的任何一种单独使用都会有问题,所以我们可以把他们结合起来使用(先检查指针再检查值):
if(ui->tablewidget->item(0,0) == NULL ||
   (ui->tablewidget->item(0,0) && ui->tablewidget->item(0,0)->text() == "")){...}

按理说这样不应该有问题,但是我在这么用的时候也一直崩,我就用了另一种方法–
②干脆不管是增加还是修改都在构造函数里照着仅修改的方式对item进行设置,后面再修改item的值,如果是修改的话,setText为调用界面传递过来的值,如果是增加的话,setText为空值,然后就可以用用仅修改的方式进行判断是否为空了.

好啦,总结完了,希望可以帮到你~~~

发布了44 篇原创文章 · 获赞 82 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/wenyun_kang/article/details/64443452