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);
}
相关推荐
传奇开心果编程1 小时前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
海盗12342 小时前
微软技术日报 2026-10-04:26H2 三个已知问题确认,Blazor 补上智能体 UI
人工智能·microsoft·ui·机器人·aigc
java1234_小锋3 小时前
shadcn/ui 开源项目,专业打造专业UI
ui·开源
传奇开心果编程3 小时前
【ArkUI进阶练中学】第13课:元服务与卡片开发
学习·ui·华为·harmonyos
传奇开心果编程4 小时前
【ArkUI进阶练中学】第19课:AI安全与隐私治理
学习·ui·华为·harmonyos
传奇开心果编程5 小时前
【ArkUI进阶练中学】第18课:Agent亲和架构与应用智能化改造
学习·ui·华为·harmonyos
传奇开心果编程1 天前
【ArkUI进阶练中学】第9课:分布式能力与多设备协同
学习·ui·华为·harmonyos
笨笨饿1 天前
#141_ Codex 本地 AI 代理工具链工作流重构:Headroom、Scrapling、Archify 统一接入
开发语言·人工智能·stm32·单片机·嵌入式硬件·ui·重构
特立独行的猫a2 天前
用仓颉写一个 Tauri:IPC 的每次往返实现原理(web层到仓颉层的触发过程)
前端·ui·harmonyos·tauri·鸿蒙·仓颉
传奇开心果编程2 天前
【现代声明式UI学与练】第1课 从命令式UI到声明式UI
学习·flutter·ui·swiftui·react·android jetpack