我使用计时器发出信号并调用槽函数,该函数根据新数据更新 UI。
我计算出运行该功能的时间很短。当计时器设置为 1000 毫秒时,UI 响应很慢。
我试图将该功能移动到一个线程,但我发现它很困难,因为很多功能需要访问 UI 类的受保护值。
我将尝试将计时器移动到另一个线程并将更新功能保留在 UI 类(主窗口)中,但我不知道它是否会有所帮助。
为什么计时器会导致 UI 变慢且无响应?线程会更轻,消耗更少的 CPU 时间吗?我怎样才能解决这个问题?
initTimer()
{
refreshTimer = new QTimer(this);
connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshDisplay));
refreshTimer->start(1000);
}
每 1000 毫秒调用一次刷新槽函数:
void refreshDisplay()
{
ui->tableWidget->setUpdatesEnabled(false);
for(int queue_i = size_1, index = 0; queue_i >= 0; queue_i--, index++)
{
LogInfoItem* logItem = (LogInfoItem*)logDisplayQueue.at(queue_i);
QString BITS_str = bits2Hexs(logItem->BITS);
ui->tableWidget->item(index, 0)->setText(logItem->time);//time
ui->tableWidget->item(index, 1)->setText(logItem->name);//name
ui->tableWidget->item(index, 2)->setText(BITS_str);//BITS
if(queue_i == oldRowItemNo)ui->tableWidget->selectRow(index);
}
ui->tableWidget->setUpdatesEnabled(true);
Q_FOREACH(Page* p, PageInfoList)
{
p->refresh();
}
Q_FOREACH(IconLabel* icl, iconLabelList)
{
icl->refresh();
}
}
'refresh()' 所做的只是根据里面的数据改变 ui 中的图标和文本。此外,我已将数据设为静态,但仍无法修复它。(我已经测试过功能,几乎不费时间......)