自己用QTableWidget来记录实时数据时,出现该问题,百度之后发现是因为在最初设置行数处(setRowCount()),设置的行宽不够,在对数据测试时,数据超出了设置行数,在调用相关setText()时,出现空指针导致程序崩掉。网上现存的解决方案中,是对该指针以及后续text进行空指判断,个人觉得这种实现方式治标不治本,所以本文会给出两种该bug的解决方式,以供参考。

空值判断

// 判断指向该item的指针是否为空 || 判断该item的text是否为空
if(ui->tableWidget_bsdl->item(i,j)==nullptr || ui->tableWidget_bsdl->item(i,j)->text().isEmpty())
{
}

该操作原理,可以参考这位博主的文章,讲得十分详细。

解释:
(1)因为C++逻辑或和逻辑与采用短路求值策略:对于逻辑或运算,当且仅当左侧运算对象为假时,才对右侧运算对象求值。
(2)当ui->tableWidget->item(i,j)==nullptr为真时,是空指针,此时左侧运算对象为真,不会对右侧运算对象求值,即,不会用空指针去访问->text(),不会判断ui->tableWidget->item(i,j)->text()是否为空,是安全的。
(3)当ui->tableWidget->item(i,j)==nullptr为假时,不是空指针,此时才对||的右侧运算对象求值,又因为它不是空指针,所以用它访问->text()是安全的。

动态设置最大行宽

static int ROW_COUNT = 20;//设置行宽if(temp.count() > ROW_COUNT) //此处temp为vector,该vector存放了需要显示的数据
{ROW_COUNT = temp.count();this->setRowCount(ROW_COUNT);
}//do else

获取到需要设置的行宽数据,每次保证ROW_COUNT为最大,并设置最大行宽,就不会出现空指针问题了。

利用QTableView实现

#ifndef LISTWIDGET_H
#define LISTWIDGET_H
#include <QTableWidget>
#include <QTimer>
#include <DataStructure.h>class QStandardItemModel;
class TableView : public QTableView
{Q_OBJECT
public:TableView(QAbstractItemModel *model);
protected:virtual void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) Q_DECL_OVERRIDE;void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible) Q_DECL_OVERRIDE;
};class ListWidget: public QWidget
{Q_OBJECT
public:ListWidget(QTableWidget * parent = nullptr);~ListWidget();private:TableView *m_table_view;QStandardItemModel *m_model;QStringList headers;};#endif // LISTWIDGET_H
#include "ListWidget.h"
#include <QStringList>
#include <QTableWidgetItem>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QFont>
#include <QDebug>
#include <QStandardItemModel>
#include <QVBoxLayout>
#include <QScrollBar>TableView::TableView(QAbstractItemModel *model)
{setModel(model);setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);setHorizontalScrollMode(ScrollPerPixel);setVerticalScrollMode(ScrollPerPixel);//    verticalHeader()->setDefaultSectionSize(25); //配置行宽horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents);//配置大小模式horizontalHeader()->setSectionResizeMode(1,QHeaderView::Stretch);horizontalHeader()->setSectionResizeMode(2,QHeaderView::Stretch);setEditTriggers(QAbstractItemView::NoEditTriggers);setStyleSheet("QTableView { border: none;""selection-background-color: #999}");
}void TableView::resizeEvent(QResizeEvent *event)
{QTableView::resizeEvent(event);
}QModelIndex TableView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{QModelIndex current = QTableView::moveCursor(cursorAction, modifiers);if (cursorAction == MoveLeft && current.column() > 0&& visualRect(current).topLeft().x() < columnWidth(3) ){const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x()- columnWidth(0);horizontalScrollBar()->setValue(newValue);}if (cursorAction == MoveLeft){const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x();horizontalScrollBar()->setValue(newValue);}return current;
}
void TableView::scrollTo(const QModelIndex &index, QAbstractItemView::ScrollHint hint)
{if (index.column() >= 0)QTableView::scrollTo(index, hint);
}ListWidget::ListWidget(QTableWidget *parent) :QWidget(parent)
{m_model=new QStandardItemModel();headers << "ID" <<"距离"<<"角度";m_model->setHorizontalHeaderLabels(headers);QVBoxLayout *main_layout = new QVBoxLayout();m_table_view = new TableView(m_model);main_layout->addWidget(m_table_view);this->setLayout(main_layout);//    this->horizontalHeader()->setStyleSheet("QHeaderView::section{font: 15}");//设置表头背景和字体颜色this->setFont(QFont("黑体",8));m_timer = new QTimer(this);m_timer->start(500);//msconnect(this->m_timer,SIGNAL(timeout()),this,SLOT(clearListitem()));
}ListWidget::~ListWidget()
{}//添加item代码m_model->setItem(0,0,new QStandardItem(QString::number(it.key())));
m_model->item(0,0)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);

利用qt本身的view-model结构来进行实现,这种实现方式,可以避免空指针的问题。

Qt QTableWidget类方法setItem()bug问题解决相关推荐

  1. Qt QTableWidget表格控件的用法(非常详细)

    Qt QTableWidget表格控件的用法(非常详细) QTableWidget 是 Qt 提供的一种表格控件(如图 1 所示),类似于我们经常使用的 Excel 表格,可以将数据以表格的方式展示给 ...

  2. qt -- QTableWidget的使用

    目录 1.设置表头 2.函数对单元格属性使用 3.信号 4.插入.删除.添加 5.自动调整行高和列宽 6.其他属性 QTableWidget是Qt中的表格组件类.在窗体上放置一个QTableWidge ...

  3. android开发 bug问题解决:Only the original thread that created a view hierarchy can touch its views

    android开发 bug问题解决:Only the original thread that created a view hierarchy can touch its views. 翻译:只有创 ...

  4. QT的中文显示乱码问题解决

    QT的中文显示乱码问题解决 QT的中文显示乱码问题解决: 1.查看源文件的编码格式,有必要的话转换源文件的编码格式再重新编译运行尝试汉字能否正常显示. 2.在代码里面解决: 3.用法: QT的中文显示 ...

  5. 生化奇兵无限服务器过于繁忙,生化奇兵无限BUG问题解决 | 手游网游页游攻略大全...

    发布时间:2016-08-19 NBA2K14全明星周末后没比赛BUG问题解决攻略: 最近有玩家在玩NBA2K14的时候发现全明星周末打完之后,后面的赛程就全都没有了,这样游戏进程就没有办法进入下去了 ...

  6. QT:QTableWidget设置行高可能导致表格显示不全

    ** QT:QTableWidget设置行高可能导致表格显示不全 ** 今天遇到了一个特别奇怪的问题,在填充QTableWidget表格数据的时候,只能显示前三行的数据,第四行开始就不去显示数据,写个 ...

  7. 星界边境服务器显示错误,星界边境BUG问题解决 | 手游网游页游攻略大全

    发布时间:2016-08-19 NBA2K14全明星周末后没比赛BUG问题解决攻略: 最近有玩家在玩NBA2K14的时候发现全明星周末打完之后,后面的赛程就全都没有了,这样游戏进程就没有办法进入下去了 ...

  8. QT QTableWidget的用法

    简述: 表格类是Qt中常用的控件,如QTableWidget,QTableView.QTableWidget是QTableView的子类,主要区别是QTableView可以使用自定义的数据模型来显示内 ...

  9. QT QTableWidget 用法总结

    QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到QTableWidget,就必须讲一下它跟QTabelView的区别了.QTableWidge ...

最新文章

  1. 国内首本Android开发图书之双剑
  2. 在reader中勾选pdf复选框_绝对可勾选的在WORD 2003中加入复选框的方法
  3. laravel --- composer install之后,项目没有vender目录
  4. 组件分页_如何创建分页组件
  5. 高性能Web框架FastAPI v0.62.0
  6. TensorFlow---(1)开源软件库TensorFlow最全教程和项目列表
  7. 解决Cannot dlopen some GPU libraries.问题
  8. Introduction to Chinese natural language processing
  9. php是属于什么软件,.php是什么软件?
  10. JavaSE学习--正则表达式
  11. C# 让应用程序只运行一个实例
  12. Java语言实现会议安排问题,利用贪心法思想解决问题
  13. hashcat工具的使用----再也不用担心自己的word等文件的密码忘记啦!
  14. 学计算机的人掉头发吗,学计算机真的会秃顶吗?为什么?
  15. 音频格式处理--SOX
  16. java 随机姓名_随机组合生成好听的名字(java)
  17. 苹果部分机型被禁销售 股价下跌2% 苹果高通专利大战究竟为何?
  18. Linux中mysql的重启
  19. D - Denouncing Mafia DFS
  20. 【NVM】node多个版本管理工具安装步骤以及使用

热门文章

  1. java 学习 输出一个整数的二进制数、八进制数、十六进制数。
  2. 地表最强系列之Sqoop安装以及使用
  3. 鸟欲高飞先振翅,人求上进先读书
  4. gcc:内存问题检查选项 -fsanitize; asan
  5. rundeck用户权限管理
  6. UPX对Android上ELF加壳使用过程中的若干问题总结
  7. C语言递归/非递归方法实现斐波那契数列
  8. Android直播推流学习
  9. 位运算符之---按位与运算符(简单易懂)
  10. 基于springboot vue elementui的物品租赁系统源码