qt tableview更新太快 卡死

qt tableview更新太快 卡死
qt tableview更新太快 卡死
qt tableview更新太快 卡死
qt tableview更新太快 卡死

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7537339
  • 你也可以参考下这篇文章:关于qt中在tableview上数据不能更改的问题
  • 你还可以看下qt参考手册中的 qt QTableView
  • 您还可以看一下 黄强老师的从新手小白入门Qt编程(Windows 10)课程中的 Qt常用小部件之表格视图QTableView小节, 巩固相关知识点
  • 除此之外, 这篇博客: Qt TableView之自定义代理按键中的 Qt TableView之自定义代理按键 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答

    问题原因分析

    TableView更新速度过快导致卡死的原因很可能是更新操作阻塞了主线程,导致界面失去响应。一般情况下,TableView刷新数据的操作会在主线程中执行,当刷新频率过高时,主线程忙于处理更新操作,无法及时响应其他用户操作,导致程序卡死。

    解决思路

    为了解决TableView更新速度过快导致卡死的问题,我们可以将数据更新操作从主线程中分离出来,放到一个独立的线程中进行处理。这样可以避免主线程被阻塞,保持界面的响应性。

    具体的解决方案如下所示:

    1. 创建一个单独的类继承自QRunnable,用于执行TableView数据更新操作。
    class UpdateTask : public QRunnable
    {
    public:
        UpdateTask(QAbstractTableModel* model, const QVector<QVector<QString>>& newData)
            : m_model(model), m_newData(newData)
        {
        }
    
        void run() override
        {
            // 在该函数中执行TableView数据更新操作
            // 具体的更新逻辑根据实际需求编写
            // 示例代码仅供参考
            for (int row = 0; row < m_newData.size(); ++row)
            {
                for (int col = 0; col < m_newData[row].size(); ++col)
                {
                    QModelIndex index = m_model->index(row, col);
                    m_model->setData(index, m_newData[row][col]);
                }
            }
        }
    
    private:
        QAbstractTableModel* m_model;
        QVector<QVector<QString>> m_newData;
    };
    
    1. 在更新数据的地方,将更新操作交给新创建的线程执行。
    // 示例代码,更新数据的地方可能会有所不同
    void updateTableViewData(QAbstractTableModel* model, const QVector<QVector<QString>>& newData)
    {
        // 创建UpdateTask对象,将数据交给线程处理
        UpdateTask* task = new UpdateTask(model, newData);
        QThreadPool::globalInstance()->start(task);
    }
    
    1. 在主线程中创建一个定时器,定时更新数据。
    // 示例代码,定时器设置不同,根据实际需求调整
    QTimer* timer = new QTimer(this);
    
    connect(timer, &QTimer::timeout, this, [=]() {
        // 更新数据
        updateTableViewData(model, newData);
    });
    
    // 设置定时器间隔,根据实际需要调整
    timer->start(1000);
    

    通过上述步骤,我们将TableView的数据更新操作从主线程中分离出来,在独立线程中执行。这样就能够避免频繁更新导致的主线程阻塞,保持界面的响应性。

    希望上述方案能够帮助到您解决问题。如果有任何疑问,请随时询问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

1.信号触发过于频繁:
方案一:添加标志位,信号触发只修改,使用定时器定时检查标志位判断是否需要刷新表格数据,超时时间设置在200ms之内
方案二:使用线程管理信号,信号累积则只触发最后一次
2.数据过大造成主界面阻塞,多线层处理数据,使用指针方式传递数据,处理线程处理好数据存入新的堆内存后,释放旧的堆内存并更新指针存储的堆内存地址。这样加锁过程只占用指针赋值时间,不会占用数据的析构和构造时间

你不是更新快卡死,而是你数据量太大,一次全部加载,导致界面卡死,你可以使用线程,也可以使用代理完成
有篇文件你参考下链接