第一章 :自定义信号
自定义信号、信号emit、信号参数
跨ui发送信号
-
首先添加新文件创建一个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
}
跨线程发送信号
- 先添加c++的类
- 添加宏,重写run函数
- 这里根据上课的视频创建一个结构体传递信息,可以不参考
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));
}
会报这样的错误
解决方法:需要注册
槽函数的参数和信号参数的关系
信号重名如何处理(信号重载)
建议使用QT4的写法