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);
}
相关推荐
apollowing10 小时前
Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃
ui·架构
oioihoii10 小时前
OpenClaw桌面 UI 自动化中的 Token 消耗问题几种可能的优化方向
运维·ui·自动化
qq_4523962311 小时前
第九篇:《处理常见复杂UI组件:下拉框、弹窗、iframe、多窗口》
ui
深蓝海拓12 小时前
Qt:创建一套基于HSL颜色体系的颜色库
笔记·python·qt·学习·ui
for_ever_love__12 小时前
UI学习:反向传值(代理传值)深入学习
学习·ui·objective-c
Cho1yon13 小时前
【AI Agent 第十期:基于 scrcpy + PyTorch 的车载系统多屏自动化测试工具开发】
人工智能·pytorch·ui·车载系统·自动化
我家媳妇儿萌哒哒13 小时前
Element ui el-dialog 在一个有滚动条的页面,打开一个弹框,完了再打开一个弹框后,滚动条可以滚动,怎么限制不能滚动。
前端·vue.js·ui
ZC跨境爬虫13 小时前
Apple官网复刻第二阶段day_3:(还原苹果官网iPhone顶部标准文案区块,一次编写全局复用)
前端·css·ui·html·iphone
ZC跨境爬虫14 小时前
Apple官网复刻第二阶段day_2:(前端模块化还原苹果官网WATCH海报)
前端·ui·重构·html·状态模式
Wild API14 小时前
GPT Image 2测评总结:文本渲染、UI生成、角色一致性与提示词模板
gpt·ui