有时候当我们需要频繁刷新界面的时,界面就会出现卡顿,或者卡死的情况,这个时候需要这样做。
本例使用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放在多线程中运行文章来源:https://www.toymoban.com/news/detail-547727.html
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模板网!