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);
}
相关推荐
玛艾露贝8 小时前
Browser-Use在UI自动化测试中的应用
ui
brave_zhao8 小时前
Axure RP 9模板的使用
ui·axure·photoshop
骊城英雄10 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
兰亭妙微UI设计公司12 小时前
兰亭妙微UI设计公司拆解:设计目标、原则、策略、方法、指标的区别与落地逻辑
ui
天天进步201520 小时前
UI-TARS 源码解析 #16:点击、双击、右键、悬停源码解析:GUI Agent 如何控制鼠标?
ui
小当家.1052 天前
Taste Skill:88KB 提示词如何让 AI 写的 UI 不再像流水线罐头
前端·人工智能·ui·skill
码云数智-大飞2 天前
iOS 卡顿排查指南:主线程阻塞与 UI 渲染优化实战
ui·ios
for_ever_love__2 天前
iOS:天气预报仿写总结
macos·ui·ios·objective-c·cocoa
天天进步20152 天前
UI-TARS 源码解析 #15:pyautogui 代码生成:模型动作如何变成真实鼠标键盘操作?
ui