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
    评论
QT 5.12版本中信号的使用方式有所改变。在以前的版本中,我们可以使用connect函数来连接信号,例如connect(sender, SIGNAL(signal()), receiver, SLOT(slot()))。但在QT 5.12版本中,SIGNAL和SLOT宏已经不再需要使用了。 在QT 5.12版本中,我们可以使用新的语法直接连接信号。例如,如果我们有一个按钮m_applyBtn,并且想在按钮按下时执行一个函数onApplyBtnPressedSlt,我们可以这样做: ```cpp connect(m_applyBtn, &QPushButton::pressed, this, &MyClass::onApplyBtnPressedSlt); ``` 这里,&QPushButton::pressed表示按钮按下的信号,this表示接收信号的对象(一般是当前类的实例),&MyClass::onApplyBtnPressedSlt表示要执行的函数。 同样地,如果我们有另一个按钮m_backBtn,并且想在按钮按下时执行另一个函数onBackBtnPressedSlt,我们可以使用以下代码进行连接: ```cpp connect(m_backBtn, &QPushButton::pressed, this, &MyClass::onBackBtnPressedSlt); ``` 这样,按钮的pressed信号就会触发相应的函数。 需要注意的是,在新的语法中,信号的参数类型必须一致。如果信号的参数不一致,可以使用QOverload和QMetaObject::Connection来解决这个问题。但这超出了本次讨论的范围。 总结起来,QT 5.12版本中,我们可以使用新的语法直接连接信号,不再需要使用SIGNAL和SLOT宏。使用新的语法可以提供更好的类型安全性和编译时错误检查。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [QT5.12中的信号问题](https://blog.csdn.net/bxlover007/article/details/116204430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [QT C++学习代码案例](https://download.csdn.net/download/m0_73878864/88259441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值