[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。)。
- 函数声明是。旧版本。的Qt的。
2.查看内置信号和槽。
- 系统⾃信号和槽通常通过"Qt帮助⽂档。"来查询。
- 如果没有找到,可以继续去⽗类中查找。