接触Qt断断续续有些时间了,总看了一堆的文章说信号槽的概念,心里就想骂人,做为一个初学者,最重要的就是怎么写代码,写代码写多了,再去看理论,有时水到渠成的就明白那些理论了。但所有讲信号槽的都把一堆信号槽的好处说一通,把MFC的消息机制贬一通。具体代码应该怎么实现信号槽轻飘飘的就忽略过去了。

       直接开始吧!

       信号槽是为了实现两个对象之间的通信机制,说白了就是比如一个按钮对象点击了一下想告诉主界面并让主界面回应这个按钮的点击动作,怎么办呢?

       第一步代码建立连接:

       

      注:这是用代码建立信号槽连接,还有一种方法在后续里面补充。

      第二步代码实现槽函数:(注:这一步可有可无哦,为什么?继续往下看。)

      public slots:

          ...................

     以上就是最简单的信号槽实现,下面继续细说!

     1、兹要是从QObject继承的类都可以有信号槽

     2、第一步的连接函数一般放在构造函数里,这一点不是必需的

     3、SIGNAL是个宏,括号里的信号不同的对象有不同,可在Qt 助手里查找,如想查找QPushButton类的对象有哪些信号,可打开Qt助手,

           

   4、现在说说第二步为什么可以没有,如果接收信号的槽是对象预定义的,那么就没有第二步的代码,直接将槽函数名写的 SLOT的括号里即可

   5、建立信号槽可以用connect()函数,也可以在Qt设计师环境里用拖拽实现,如下

        注:因为我是用VS里安装Qt插件的方式开发,所以打开Qt设计师的方法是双击 ***.ui 文件的方式。

       5.1 菜单 Edit -> 编辑信号/槽

        

       5.2 进入 信号槽编辑模式 后,用鼠标左键按住发射信号的对象,如QPushButton/QWidget 等,然后拖拽鼠标移动到接收信号的对象

             

            5.3 松开鼠标会弹出一个窗口,在这个弹出的窗口里选择信号和槽,即可

                  

    6. 最近看《Qt 5.9 C++ 开发指南》这本书,新了解到的建立信号槽的一种方法,这是针对Qt控件(如 QPushButton, QLabel等)响应槽函数的方式,补充如下:

       6.1 在Qt 设计师里给控件命名,如下图

              

       6.2 在头文件里写槽函数,注意槽函数的命名格式:

             private slots:

                     void on_btnTest2_clicked();

                            on_控件名字_信号名称

       6.3 在源文件里写槽函数的实现

               void 类名::on_btnTest2_clicked()

              {

               }

       注:这种实现信号槽的方式,并没有显示的看到连接代码,但是如果看下 SetupUI 函数的实现源码,可以看到 connectSlotsByName 函数,其实这个函数会自动的按一定命名的槽函数连接到信号上。

   总结:信号槽的实现方式我也就知道这两种,相对于MFC过渡的人来说,connect()就象MFC的 BEGIN_MESSAGE_MAP宏里写的代码,槽函数就象MFC里的响应函数,信号就类似MFC的消息。至于信号槽的原理我觉得

              可以在学会实现信号槽代码后,抽空慢慢体会。先有实践,再理解原理。

posted on 2020-04-01 12:27  Recreate  阅读(1122)  评论(0编辑  收藏  举报