QT学习之信号和槽

信号和槽

目录

信号和槽

一.标准信号槽函数(顺序为:发送者→信号→接收者→反应)

二.一些信号函数

三.自定义槽函数

四.自定义信号槽重载

五.信号和槽的连接

1.一个信号和多个槽连接,槽函数按连接顺序执行。

2.多个信号与一个槽连接。

3.一个信号与另一个信号相连。

4.信号和槽断开连接。


一.标准信号槽函数(顺序为:发送者→信号→接收者→反应)

二.一些信号函数

**toggled()**是指如单选按钮的互相转换,适合状态监控。帮助手册中的QAbstractButton里。

canceld()

pressAndHold()

三.自定义槽函数

  • example:(老师→饿了→学生→学生请吃饭)

    梳理一下:

    1. “饿了“属于老师的行为,所以应该定义在老师类的signals里;
    2. “学生请吃饭”是学生对老师发出信号时做出的反应,所以应该定义在学生类的public slots(公开槽函数)里;
    3. 然后”老师→饿了“这个信号触发需要一个触发信号函数,这个触发信号函数根据需要定义在不同的类里;
    4. 最后连接信号槽。

    根据步骤进行实现:

    • 1.定义信号

      class Teacher
      {
      public:
          Teacher();
      signals:
          void hungry();
      };
      void Student::treat()
      {
             qDebug() << "Student treat teacher";
      }
      
    • 2.定义槽函数

      class Student
      {
      public:
          Student();
      public slots:
          void treat();  
      };
      
    • 3.定义触发信号函数

      void MyWidget::ClassIsOver()
      {
          //发送信号
          emit teacher->hungry();
      }
      
    • 4.连接信号槽

          teacher = new Teacher(this);
          student = new Student(this);
          connect(teacher,&Teacher::hungury,student,&Student::treat);
      

四.自定义信号槽重载

void hungry(QString name);  自定义信号
void treat(QString name );    自定义槽
1.但是由于有两个重名的自定义信号和自定义的槽,直接连接会报错,所以需要利用**函数指针**来指向函数地址, 然后在做连接
void (Teacher:: * teacherSingal)(QString) = &Teacher:: hangry;
void (Student:: * studentSlot)(QString) = &Student::treat;
connect(teacher,teacherSingal,student,studentSlot);
2.也可以使用static_cast静态转换挑选我们要的函数
connect(
teacher,
static_cast<void(Teacher:: *)(QString)>(&Teacher:: hangry),
student,
static_cast<void(Student:: *)(QString)>(& Student::treat));

五.信号和槽的连接

1.一个信号和多个槽连接,槽函数按连接顺序执行。
测试如下:

connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked1()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked2()));
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked3()));

结果如下:

OnPushButtonClicked1 
OnPushButtonClicked2 
OnPushButtonClicked3 

 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked2()));
 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked1()));
 connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(OnPushButtonClicked3()));

结果如下:

OnPushButtonClicked2 
OnPushButtonClicked1 
OnPushButtonClicked3 
2.多个信号与一个槽连接。

只要触发其中任意一个信号,槽函数就会被调用。如一个页面中有多个按钮可以关闭页面。

3.一个信号与另一个信号相连。

一个信号发出触发到另一个信号的发出。

4.信号和槽断开连接。

用disconnect断开连接,用法与connect一致。但通常不适用,因为当一个对象delete后,Qt会自动取消所有连接到对象上的槽。

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值