一、背景
最近再做一个图片预览的小工具,其中需要再QListWidget中更新图片,并把进展刷新再QProgressBar上。一般避免界面卡顿,都会选择使用线程的方式,但是又不想通过继承QThread的方式去实现,因为这么太麻烦。所以使用QtConcurrent::run+Lambda表达式的方式。
二、注意事项
① 之前参考网上的信息说,不建议再子线程去刷新UI界面的控件,使用信号和槽的方式,比如下面的代码,通过这种方式发送信号,在UI代码里执行槽函数,还是会出现界面卡顿,比如拖动进度条不顺畅。
QtConcurrent::run([this,imagePath, Imagecount]() {
int index = 0;
for each (QString var in imagePath)
{
if (bImageLoad == false)
{
break;
}
if (Imagecount > 1)
{
emit sendUpdateProgress(index, var, Imagecount);
}
}
});
建议操作如下,可以直接在lambda里面 对listWidget创建并添加Itme,同时使用QMetaObject::invokeMethod去刷新进度条,注意:不能直接在里面使用调用myProgressBar刷新进度,否则会异常报错
QtConcurrent::run([this,imagePath, Imagecount]() {
QListWidgetItem* item;
int index = 0;
for each (QString var in imagePath)
{
if (bImageLoad == false)
{
break;
}
++index;
item = new QListWidgetItem(QIcon(var), QString::number(index));
item->setSizeHint(QSize(100, 100));
item->setData(Qt::UserRole, var);
ui->listWidget->addItem(item);
if (Imagecount > 1)
{
//emit sendUpdateProgress(index, var, Imagecount);
QMetaObject::invokeMethod(myProgressBar, "setProgressValue", Qt::QueuedConnection, Q_ARG(int, index));
QMetaObject::invokeMethod(myProgressBar, "setTip", Qt::QueuedConnection, Q_ARG(QString, QString("图片加载数量:%1//%2").arg(index).arg(Imagecount)));
}
}
});