Qt 解决界面频繁刷新卡顿的问题

这篇具有很好参考价值的文章主要介绍了Qt 解决界面频繁刷新卡顿的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有时候当我们需要频繁刷新界面的时,界面就会出现卡顿,或者卡死的情况,这个时候需要这样做。

本例使用QTableView为例子为大家讲解解决方法。

猜想一:缓存+定时器

当有数据的时候调用setShowText()方法,将数据缓存到队列中,然后通过定时器QTimer,每隔一段时间调用slotShowTextByTimer()添加到界面上,但是效果不理想。

    ui->tableView->horizontalHeader()->hide();
    ui->tableView->horizontalHeader()->setStretchLastSection(true);

    QStandardItemModel m_model = new QStandardItemModel();
    m_model->setColumnCount(1);
    ui->tableView->setModel(m_model);

    QTimer m_timer = new QTimer(this);
    connect(m_timer,&QTimer::timeout,this,&ArcticNebulaShowWidget::slotShowTextByTimer);
    m_timer->start(100);

    QQueue<QString> m_text;//缓存队列


    //=================================================以下为实现方法
    //当数据来的时候缓存到队列中
    void setShowText(const QString &text)
    {
        m_text.enqueue(text);
    }

    //定时器实现方法
    void slotShowTextByTimer()
    {
        addItem(m_text.dequeue());
    }

    //tableView中添加项
    void addItem(const QString &text)
    {
        m_model->setRowCount(m_model->rowCount()+1);

        m_model->setItem(m_model->rowCount()-1,0,new QStandardItem(text));
        ui->tableView->resizeRowToContents(m_model->rowCount()-1);
    }

猜想二:丢数据(最大数据50个)+限制界面显示行数(比如最大50行)

因为数据量巨大,所以界面刷新很快,肉眼很难观察到,我们需要丢一些数据不显示,改进方法,效果也不好。

    #define MAX_LIST_LENGTH 50

    void setShowText(const QString &text)
    {
        //当大于50个数量时,删除开头的数据
        if(m_text.count() > MAX_LIST_LENGTH)
        {
            m_text.dequeue();
        }

        m_text.enqueue(text);
    }    

    void addItem(const QString &text)
    {
        if(m_model->rowCount() >= MAX_LIST_LENGTH )
        {
           m_model->removeRow(0);
        }

        m_model->setRowCount(m_model->rowCount()+1);

        m_model->setItem(m_model->rowCount()-1,0,new QStandardItem(text));
        ui->tableView->resizeRowToContents(m_model->rowCount()-1);
    }

猜想三:多线程

将model放在多线程中运行

    QThread m_thread;
    m_model->moveToThread(&m_thread);    
    connect(&m_thread, &QThread::finished, &m_thread,&QObject::deleteLater);
    connect(&m_thread, &QThread::finished, m_model, &QObject::deleteLater);
    m_thread.start();

综上所述,界面就不会卡顿了。文章来源地址https://www.toymoban.com/news/detail-547727.html

到了这里,关于Qt 解决界面频繁刷新卡顿的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity如何解决协程开启频繁导致的程序卡顿

    协程并不会在Unity中开辟新的线程来执行,其执行仍然发生在主线程中。当我们有较为耗时的操作时,可以将该操作分散到几帧或者几秒内完成,而不用在一帧内等这个操作完成后再执行其他操作。 unity中协程在start前需要判断其是否开启了,否则协程会不断叠加 解决方式一

    2024年02月09日
    浏览(54)
  • QT界面开发杂记(五)

    QString转char* c_str()没有‘\\0’结尾可能导致一些错误可以使用以下方法解决: QString xmlPath = \\\"path\\\"; const char cXmlName[1024] = {0}; memcpy((void*)cXmlName,xmlPath.toStdString().c_str(),xmlPath.size()); char*转QString  

    2024年02月04日
    浏览(61)
  • 使用Qt开发一个登录界面

    在许多应用程序中,我们需要提供一个登录界面来让用户输入用户名和密码,并验证其身份。在本文中,我们将介绍如何使用Qt创建一个简单的登录界面,并演示如何获取用户输入和执行身份验证操作。 首先,我们需要创建一个QWidget部件,并设置其布局为垂直布局。然后,我

    2024年02月13日
    浏览(38)
  • 【Qt设计开发】GUI界面设计开发

      本文是我在学习QT的GUI界面设计过程当中的心得和学习笔记,在学习时已经有C, C++,Python的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。此外,博主还有另外几篇文章,分别关于 Python基础知识 、 Python的具体应用 、 C语言指针结构体

    2024年02月02日
    浏览(49)
  • 解决小新13pro2020连接4k60hz显示器后,出现卡顿,查看刷新率只有30hz的问题

    我买了一台4k60hz的屏幕,手上的笔记本为轻薄本小新13pro2020 独显MX350版本,笔记本连上屏幕后,发现鼠标移动有拖影,打开和浏览网页出现卡顿情况。 通过分析,我意识到可能是显卡带不动导致的降低刷新率,于是在显示设置里查看,发现刷新率果然只有30hz。 但是原因并不

    2024年02月09日
    浏览(280)
  • qt图形化界面开发DAY4

    2024年01月23日
    浏览(33)
  • 解决Python Socket UDP端口侦听线程内更新UI界面卡顿、奔溃的问题

     网络读卡器介绍:WIFI无线网络RFID云读卡器远程网络开关物流网NB-IoT4G刷卡阅读器-淘宝网 (taobao.com)    Python使用PyQt5做UI界面,开启线程侦听UDP端口,端口接收到网络读卡器的读卡数据后刷新UI界面显示接收数据,解析数据包信息并向读卡器发送显示文字、驱动读卡器播报语

    2024年02月03日
    浏览(49)
  • Qt音视频开发33-vlc和mpv打开后鼠标打圈圈问题的解决

    如果采用的vlc句柄模式,如果鼠标停留在句柄控件中会发现在打开后鼠标打圈圈,mpv句柄模式是在关闭后鼠标打圈圈,这两者真是一前一后,这种给人的体验其实很不友好的,播放开始后或者播放完成后鼠标指针居然变成了繁忙,但是当你将鼠标位置从句柄控件中移到外面的

    2023年04月08日
    浏览(35)
  • 界面开发框架Qt - 组合小部件映射器示例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 Combo Widget Mapper(组合小部件映射器)示例展示了如何

    2023年04月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包