XLEdoo 2024-11-07 22:07 采纳率: 50%
浏览 5
问题最晚将于11月15日00:00点结题

QTableWidget重绘程序崩溃

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

img

追加补充:
目前已经通过index.isValid()判断QModelIndex的有效性了,问题依旧存在,现在不卡index.data(Qt::ForegroundRole).value();了,现在是到QStyledItemDelegate::paint(painter, itemOption, index);重绘的时候出问题的。

  • 写回答

12条回答 默认 最新

  • 阿里嘎多学长 2024-11-07 22:14
    关注

    阿里嘎多学长整理、AIGC生成:

    QTableWidget 重绘程序崩溃

    遇到 QTableWidget 崩溃的问题时,我们需要分析可能的原因和解决方案。

    可能的原因和解决方案:

    1. 数据更新方式不正确

    不要使用 QTableWidget::setItemQTableWidget::insertRow 等方法更新数据,而是使用 QTableWidget::setHorizontalHeaderItemQTableWidget::setVerticalHeaderItem 等方法。

    QTableWidgetItem* item = new QTableWidgetItem("数据");
    ui->tableWidget->setItem(row, column, item);
    
    1. 选择行无边框

    如果你想要在选中行时无边框,可以使用 QTableWidget::setItemSelectionAppearance 方法设置项的选择样式。

    ui->tableWidget->setSelectionMode(QAbstractItemView::MultiSelection);
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->tableWidget->setItemSelectionAppearance(QTableWidget::NoSelection);
    
    1. 优化重绘工作

    更新数据时,避免对整个 QTableWidget 进行更新,可以使用 QTableWidget::viewport 方法将更新数据的操作局限在视图中。

    QTableWidgetItem* item = ui->tableWidget->item(row, column);
    if (item) {
        ui->tableWidget->viewport()->update();
        ui->tableWidget->verticalHeader()->update();
    }
    
    1. 崩溃处理

    如果你的程序崩溃,可以使用 QException::catch 方法捕捉崩溃的信号,并执行相应的错误处理逻辑。

    catch (const QException& e) {
        QString msg = QString("崩溃 occurred:%1").arg(e.what());
        //处理错误
    }
    

    总之,如果你的程序崩溃,请查看日志,了解崩溃的原因,然后根据实际情况选择合适的解决方案。如果你需要更多的帮助,可以提供更多的代码和详细的错误信息。

    评论

报告相同问题?

问题事件

  • 修改了问题 今天
  • 修改了问题 今天
  • 创建了问题 11月7日

悬赏问题

  • ¥15 平板录音机录音问题解决
  • ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
  • ¥15 (SQL语句|查询结果翻了4倍)
  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用
  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启