第一章 :自定义信号

自定义信号、信号emit、信号参数

跨ui发送信号

img
img

  • 首先添加新文件创建一个dialog的窗口

  • 在主窗口中设置槽函数,开启dialog窗口

private slots:
    void on_btnOpen_clicked();


  void Widget:: on_btnOpen_clicked()
{
    SetDialog dlg;
    dlg.exec();//事件循环,会阻塞UI
 }   

  • 先设置dialog的按钮槽函数
private slots:
    void on_btnAdd_clicked();
  • 通过dialog的槽函数去发送之前定义的信号
signals:
    void sig_addOne(int value);

void SetDialog::on_btnAdd_clicked(){
    emit sig_addOne(100);
}

  • 在主窗口建立连接
    void Widget:: on_btnOpen_clicked()
{
   SetDialog dlg;
   connect(&dlg,&SetDialog::sig_addOne,[=](int value){
       ui->lineEdit->setText(QString::number(value));
   } );
   dlg.exec();//事件循环,会阻塞UI
}

img

跨线程发送信号

img

  • 先添加c++的类
    img
  • 添加宏,重写run函数
    img
  • 这里根据上课的视频创建一个结构体传递信息,可以不参考
void ChildThread::run(){
    while(1){
        Score s;
        s.name = "hhh";
        s.id=1001;
        s.age=13;
      emit sig_SendToUI(s);
    }

}

  • 建立一个槽函数,点击主窗口按钮就创建一个子线程,子线程运行run函数发送信号(注意这里connect以后这个线程的id是和子线程一样的)
  void Widget::on_btnUpdate_clicked(){
    ChildThread *ch = new ChildThread();
    
    connect(ch,&ChildThread::sig_SendToUI,[=](Score s){
        string info = s.name+"id="+to_string(s.id);
        ui->lineEdit->setText(QString::fromStdString(info));
   });//其实是在子线程里面

ch->start();
}

使用槽函数去做就不一样了

void Widget::on_btnUpdate_clicked(){
    ChildThread *ch = new ChildThread();
    
//    connect(ch,&ChildThread::sig_SendToUI,[=](Score s){
//        string info = s.name+"id="+to_string(s.id);
//        ui->lineEdit->setText(QString::fromStdString(info));
//    });//其实是在子线程里面
//怎么区分这个线程在哪里,获取线程id,通过获取两个线程id判断这两个线程是否在同一边
    connect(ch,&ChildThread::sig_SendToUI,this,&Widget::showInfo);//这个就是在UI线程了
ch->start();
}
void Widget::showInfo(Score s){
    string info = s.name+"id="+to_string(s.id);
      ui->lineEdit->setText(QString::fromStdString(info));
}

会报这样的错误
img
解决方法:需要注册
img

槽函数的参数和信号参数的关系

img

信号重名如何处理(信号重载)

img

img

建议使用QT4的写法
img

posted @   NoAcalculia  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示