[Qt][信号与槽][上]详细说明

发布时间:2025-06-24 17:08:51  作者:北方职教升学中心  阅读量:454


目录。

  • 0.Q_OBJECT宏。
  • 1.信号和槽概述。
    • 1.信号。
    • 2.槽。
    • 3.说明。
  • 2.使用信号和槽。
    • 1.连接信号和槽。
    • 2.查看内置信号和槽。

0.Q_OBJECT宏。

  • 如果QT允许某个类别使用信号槽,必须在类的开头,写下。Q_OBJECT。宏。

1.信号和槽概述。

1.信号。

  • 在QT中,⽤⼾与控件的每次交互过程称为⼀个事件。
    • 例如。:"⽤⼾点击按钮"是⼀事件,"⽤⼾关闭窗⼝"也是⼀个事件。
  • 每一件事都会发生⼀个信号。
    • 例如。:⽤⼾点击按钮发送"点击按钮"信号,⽤⼾关闭窗⼝会发出"窗⼝被关闭"的信号。
  • 信号的本质。
    • 信号是由于⽤⼾对窗⼝或控件进⾏有些操作,导致窗⼝或控件产⽣特定事件,此时QT对应的窗户⼝类会发出信号,以此对⽤⼾对操作做出反应。
    • 所以,信号的本质是事件。
  • QT中的信号以什么形式呈现?⽤?
    • 对哪个窗⼝进⾏操作,哪个窗⼝就可以。捕捉。这些被触发的事件。
    • 对于使⽤,触发了⼀QT框架发出的特定信号可以通过事件获得。
    • 信号的呈现形式是函数。
      • 也就是说,某个事件的生产⽣完成,将调整QT框架⽤相应的信号函数,通知使⽤者。
  • 在Qt中。信号的发出者是一个实例类对象。

2.槽。

  • QT中的**。所有控件都有接收信号的能力⼒。,⼀一个控件还可以接收多个不同的信号。

  • 收到的每个信号,所有控制器都会做出相应的响应动作。

    • 按钮所在的窗户⼝接收到"点击按钮"信号后,会做出"关闭⾃⼰"响应动作。
    • 输⼊框⾃⼰接收到"输⼊点击框架"信号后,会做出"显⽰闪烁的光标,等待⽤⼾输⼊数据"响应动作。
  • 在QT中,对信号的响应动作称为槽。

  • 信号和槽是QT特有的信息传输机制,它可以独自一人⽴控件是相关的。

    • 例如。:“按钮"和"窗⼝” 本⾝是两个独⽴控件,点击"按钮"不会对"窗⼝"造成任何影响。通过信号和槽机制󿀌可以将"按钮"和"窗⼝"相关性,实现"点击按钮会使窗户⼝关闭"的效果。
      请添加图片描述
  • 槽的本质。

    • 槽(Slot)是对信号响应的函数。
    • 槽就是⼀函数,与⼀般的C++成员函数是⼀样的。
      • 可以定义在类的任何位置(。public, protected, private。)。
      • 可以有任何参数。
      • 可重载。
      • 也可直接调整⽤(但不能有默认参数)。
    • 槽函数与⼀一般函数不同的是。可以与槽函数相匹配⼀信号关联󿀌当信号发射时,#xff0c;关联槽函数被⾃动执⾏。

3.说明。

  • 信号和槽机制的底层是通过函数之间的相互调整⽤实现的。
    • 每个信号都可以⽤函数来表⽰,称为信号函数。
    • 每个槽也可以⽤函数表⽰,称为槽函数。
    • 例如。
      • "按下按钮"这个信号是可以的⽤。clicked()。表⽰,"窗⼝关闭"这个槽可以⽤。close()。表⽰,
      • 假如使⽤实现信号和槽机制:"点击按钮关闭窗户⼝"功能,其实就是。clicked()。调⽤。close()。的效果。
  • 信号函数和槽函数通常位于某一类。,与普通成员函数相⽐,它们的特别之处在于。
    • 信号函数⽤。signals。关键字修改。
    • 槽函数⽤。public slots, protected slots, private slots。修饰。
    • signals。和。slots。C+是QT;+扩展的关键字,专⻔⽤指示信号函数和槽函数。
  • 信号函数只需要声明,不需要定义(实现),⽽槽函数需要定义(实现)。
    • QT信号函数的定义是QT⾃在编译程序之前移动⽣,编写Qt应⽤程序员⽆需关注。
    • 这种⾃动⽣成代码的机制称为。元编程(MetaProgramming)。

2.使用信号和槽。

1.连接信号和槽。

  • QObject。类提供了⼀个。静态成员函数。connect()。,专⻔⽤来。关联指定的信号函数和槽函数。
  • 函数原型。
    connect。(。const。QObject。*。sender。,const。char。*。signal。,const。QObject。*。receiver。,const。char。*。method。,Qt。::。ConnectionType type。 =Qt。::。AutoConnection。)。
  • 参数。
    • sender。:发送信号的人 -> 哪个空间发出当前信号?
    • signal。:发送的信号(。信号函数。)。
      • 要求和。sender。必须匹配。
      • 即。:如果。sender。是。QPushButton*。,那么。signal。必须是。QPushButton。内置信号(父类信号),不能是其它类型的信号。
    • receiver。:信号接收者 --> 负责处理哪个对象。
    • method。:接收信号。槽函数。--> 如何处理这个对象?
    • type。:⽤于指定关联⽅类型,默认的关联⽅式为。Qt::AutoConnection。通常不需要⼿动设定。
  • 问题:为什么。signal。和。method。类型是。char*。
    • 函数声明󿀌是。旧版本。的Qt的。connect。函数声明。
      • 此时使用要搭配。SIGNAL。和。SLOT。宏。使用。
      • 例如。connect(button, SIGNAL(&QPushButton::clicked), this, SLOT(&Widget::close));
    • Qt5开始�简化了上述写作方法。,不再需要。SIGNAL。和。SLOT。宏。提供了。connect。重载版本。,在这个版本中,signal。和。method。成了。泛型参数。,允许引入任何类型的指针。
      template。<typename。Func1。,typename。Func2。>static。inline。QMetaObject。::。Connection。connect。(。const。typename。QtPrivate。::。FunctionPointer。<Func1。>::。Object。 *。sender。,Func1 signal。,const。typename。QtPrivate。::。ContextTypeForFunctor。<Func2。>::。ContextType。 *。context。,Func2。 &&slot。,Qt。::。ConnectionType type。 =Qt。::。AutoConnection。)。

2.查看内置信号和槽。

  • 系统⾃信号和槽通常通过"Qt帮助⽂档。"来查询。
  • 如果没有找到,可以继续去⽗类中查找。