1.3 初步了解信号和槽

在Qt中,如何响应动作。这会用到Qt的信号和槽机制。

我的理解:它和Win32程序的消息响应机制差不多吧。

信号,简单理解就是:当我们点击一个按钮时,这个按钮自身就会产生一个叫作"单击"的信息,这个信息说明了刚刚我们点击了这一个按钮。产生的这个信息就相当于自己发射了一个信号,表明一个用户动作已经发生了或者是一个状态已经改变了。这就是信号(signal)。

槽,可以理解为:当这个按钮发射了这个信号之后,假如有一个"监听员"发现了这个信号,它会马上做出响应,做相应的动作。这个动作一般就是指执行一个或多个函数。这些就是槽(slot)。

要使得槽能够响应指定的信号,就需要把信号和指定的槽连接起来。连接之后,只要出现了这个信号,槽就会自动执行。

接下来看一下以下代码:

第7行:创建一个QPushButton对象,头文件<QPushButton>

用到的函数:QPushButton::QPushButton ( const QString & text, QWidget * parent = 0 )

函数的说明:构造一个文本为text的按钮,parent是它的父窗口,默认为0。

第9行:将信号(clicked())和槽(quit())连接。

用到的函数:bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )

函数的说明:创建一个指定类型(type)的连接,指定发送方对象和方法,和接收方对象和方法。如果连接成功,返回true,否则将返回false。

参数中,type已经有默认值,现在来说不需要自己指定。

sender是发射信号的对象,signal是这个对象发射的具体的信号,需要使用SIGNAL()宏。

receiver是接收信号的对象,method是槽,也就是响应的函数,需要使用SLOT()宏。

SIGNAL()和SLOT()是Qt中定义的宏,这两个宏会把它们的参数转换成相应的字符串。

两个宏的参数都是不带参数名的函数名(参数名是指函数参数中的变量名,不是指参数类型,这其实也可以说成这两个宏的参数就是一个比较类似函数指针的类型的东西吧?只不过没有返回值和返回值后面跟着的(*)这个东西而已)。

sender与receiver对象各自拥自己的发射信号和槽,例如例子中QPushButton有clicked()信号和QApplication有quit()槽。

QPushButton的信号是通过继承而来的,它继承自QAbstractButton类,这个类本身拥有以下信号:

分别有1个信号继承自QWidget、QObject。主要的还是上面4个信号。

看看就好~嘿嘿,自己也可以尝试。

QApplication的有以下槽:

在例子中,使用了一个quit(),这个槽是QApplication继承自QCoreApplication类得到的。

在QCoreApplication中,定义了quit()这个槽。

例子中,clicked()信号表明当用户单击了按钮button时会发射的信号,然后执行app对象中的槽quit(),从而退出这个程序。

就暂时到这里吧,到这里,也算是初步了解了什么是信号和槽。这个是Qt编程的基础。

另外,Qt帮助文档也是一个不错的东西。

如果是使用Qt Creator,想要知道某一个Qt类的详细信息的话,单击一下类名,按F1就可以转到帮助文档了。

在我看来,信号和槽进制比较好理解,简单地想成是一个发送方和接收方就行了,当点击按钮时,发送方发送一个clicked()的消息给接收方,接收方接收消息之后开始做自己的动作。

当然了,毕竟只是自己的总结笔记,有些地方是自己理解来写的,如果理解是错误的请见谅~

时间: 2024-10-27 03:30:33

1.3 初步了解信号和槽的相关文章

【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽

Qt是一个跨平台的c++图形用户界面用用程序框架. Qt安装说明: windows下环境变量path需要加入以下路径,以便QT写的程序可以离开QT开发环境独立运行 C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\;C:\Qt\Qt5.2.0\Tools\mingw48_32\bin; linux下需要设置.bash_profile文件 PATH中加入/opt/Qt5.2.0/5.2.0/gcc/bin 用root用户登录系统,进入/usr/lib目录后执行 ln libGL

第78课 多线程中的信号与槽(上)

1. QThread类中的信号和槽 (1)QThread类拥有发射信号和定义槽函数的能力 (2)QThread中的关键信号 ①void started():线程开始运行时发射该信号 ②void finished():线程完成运行时发射该信号 ③void terminated():线程被异常终止时发射该信号 2. 与线程相关的概念 (1)线程栈 ①进程中存在栈空间的概念(区别于栈数据结构) ②栈空间专用于函数调用(保存函数参数.局部变量等) ③线程拥有独立的栈空间(可调用其它函数) ④只要函数体中

QT学习小结之信号与槽

信号与槽函数是我们学习QT必备的基础知识,今天跟大家分享我学习QT的一些总结吧. 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯. 槽函数和普通的C++成员函数没有很大的区别.它们也可以使virtual的:可以被重写:可以使public.protected或者private的:可以由其它的C++函数调用:参数可以是任何类型的.如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用. 信号与槽函数的连接我们可以用connect

QT 的信号与槽

转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上.QT 支持下列平台:MS/WINDOWS-95.98.NT 和 2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IBM AIX.SGI IRIX:EMBEDDED- 支持 framebuffer

QT5中的信号与槽与C++ 11的function的配合

最近将公司的界面开发库从WX转换到了QT,有了信号和槽,原本我们在使用WX的时候,为了使用信号,我们是使用BOOST的signal2库,到了QT有了信号槽,这个就没什么必要了 但是前段时间使用QT发现QT的信号和槽没有placeholder,也就是占位符,于是信号和槽声明只能严格地一样,比如 void slot(int val); void signal( int val); 但是在signals2,我们可用利用placeholder,及时函数声明不一样,也可用进行connect void sl

Qt的信号与槽机制

1.信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解. 2.信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方. 3.信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码. 4.在我们所熟知的很多GUI工具包中,窗口小部件(widget

在Qt Creator 和在 vs2012 里添加信号和槽

Qt  的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了. 如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函数(在qt里称做槽slot)相连接 可以把信号理解为c#里的事件 在vs2012里和在Qt Creator里添加信号和槽不一样,这里把两种环境下怎么添加详细说明一下 1.在vs2012里添加信号和槽 新建一个qt的项目QtDemo 在qtdeom.h里添加槽 private slots: void Btn_O

Qt信号与槽自动关联机制

参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exception/article/details/50953005 信号与槽可以通过使用手写代码显式的实现关联 ,也可以运用 QMetaObject 类规定的槽 函数命名范式来实现自动关联. 显示关联 class MyWidget : public QWidget { Q_OBJECT public: M

【Qt】2.2 继续了解信号和槽

槽和普通成员函数一样,可以是虚函数.被重载,可以是公有.私有.保护的.它可以被其它C++成员函数调用. 槽连接了信号,当发射这个信号时,槽会被自动调用. 连接函数: bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) sende