QtConcurrent::run操作界面ui的注意事项(2)

前面的"QtConcurrent::run操作界面ui的注意事项(1)",末尾说了跨线程的问题,引出了Qt千好万好,就是跨线程不好。下面是认为的最简单的解决办法:使用QMetaObject::invokeMethod(相比较信号-槽),直接看源程序:

cpp 复制代码
// h 头文件中定义
public:
    Q_INVOKABLE void updateLabel(QString str); //必须添加Q_INVOKABLE
    Q_INVOKABLE void updateProgressBar(int v);


// cpp 实现文件
void Widget::doSomeWork() //子线程函数
{
    int k=0;
    while(1)
    {
        QThread::msleep(100);
        QString str=QString::asprintf("当前%d", k++);
        QMetaObject::invokeMethod(this,"updateLabel",Q_ARG(QString, str)); //在线程里更新label
        QMetaObject::invokeMethod(this,"updateProgressBar",Q_ARG(int, k)); //在线程里更新progressBar
    }
}

//按钮事件里开启一个线程
void Widget::on_pushButton_clicked()
{
    QFuture<void> future = QtConcurrent::run(this,&Widget::doSomeWork);
}


void Widget::updateLabel(QString str) //更新label控件
{
    ui->label->setText(str);
}

void Widget::updateProgressBar(int v) //更新进度条控件
{
    ui->progressBar->setValue(v);
}
相关推荐
xy34531 小时前
Axure 9.0 条形图绘制超详细教程:静态展示
ui·产品经理·axure·条形图
LabVIEW开发5 小时前
LabVIEW图标编辑器文字模糊现象
ui·编辑器·labview·labview知识·labview功能·labview程序
兰亭妙微UI设计公司1 天前
兰亭妙微B端界面设计分享:Vantary海事无人系统任务平台UI/UX设计解析
ui·ux
伊玛目的门徒1 天前
deepseek harness DSH 安装皮肤脚手架(dsh‑client‑ui‑skin‑center)踩坑完整记录
ui·插件·皮肤·harness·dsh
zhchyun20082 天前
【Unity UI 进阶】仿 Element UI 打造企业级 Unity UI 组件库(05)
ui·unity·游戏引擎
tanghonghanhaoli2 天前
【图书翻译】有意义的游戏设计:桌面游戏的方法论与心理学(第1、2章)
前端·游戏·ui
bugcome_com2 天前
Avalonia UI 样式进阶实战:外置样式 + MVVM 主题切换 + 样式优先级全解析
ui
李高钢3 天前
【WPF】高级 UI 与性能优化实战:从卡顿到丝滑
ui·性能优化·wpf
MOONICK3 天前
QT的UI开发框架
qt·ui
界面开发小八哥4 天前
界面控件DevExpress Blazor v26.1新版亮点 - Filter Builder等功能升级
ui·界面控件·blazor·devexpress·ui开发