QTableWidget 更新导致程序偶尔崩溃
项目里用到了QTableWidget,由于需要频繁更新行情数据,类似自选股列表的功能。
由于需要QTableWidget“选中无边框”和“选中不改变选中行文字颜色”,所以按照下面的方法进行了重绘:
void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
QStyleOptionViewItem itemOption(option);
// 去掉选中时的虚线框
if (itemOption.state & QStyle::State_HasFocus)
{
itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
}
//// 设置选中的item,字体颜色和选中前的颜色一样
// 程序崩溃的时候有时候卡在这里,显示读取异常,0xFFFFFFFFFFF,应该是内存的问题。
QColor ItemForegroundColor = index.data(Qt::ForegroundRole).value<QColor>();
if (ItemForegroundColor.isValid())
{
if (ItemForegroundColor != itemOption.palette.color(QPalette::WindowText))
{
itemOption.palette.setColor(QPalette::HighlightedText, ItemForegroundColor);
}
}
// 程序崩溃的时候有时候卡在这里,显示读取异常,0xFFFFFFFFFFF,应该是内存的问题。
QStyledItemDelegate::paint(painter, itemOption, index);
}
好的,问题来了,长时间运行时,偶尔会出现程序崩溃的情况,不是很频繁,但是确实会崩溃的。
这里我已经对更新的数据进行了校验,不是传入数据引起的。
由于程序需要长时间运行,必须要知道到底是啥引起的,然后避免崩溃的发生。
解决问题,不再崩溃我就采用。
读取异常,0xFFFFFFFFFFF
追加补充:
目前已经通过index.isValid()判断QModelIndex的有效性了,问题依旧存在,现在不卡index.data(Qt::ForegroundRole).value();了,现在是到QStyledItemDelegate::paint(painter, itemOption, index);重绘的时候出问题的。