最近开始学习Qt,Qt 是一个跨平台的C++应用程序框架,支持Windows、Linux、Mac OS X、Android、iOS、Windows Phone、嵌入式系统等。也就是说,Qt 可以同时支持桌面应用程序开发、嵌入式开发和移动开发,覆盖了现有的所有主流平台。你只需要编写一次代码,发布到不同平台前重新编译即可。

Qt 不仅仅是一个GUI库,它除了可以创建漂亮的界面,还有很多其他组件,例如,你不再需要研究STL,不再需要C++的<string>头文件,不再需要去找解析XML、连接数据库、Socket 的各种第三方库,这些 Qt 都已经内置了。

Qt 是应用程序开发的一站式解决方案!

Qt 虽然庞大,封装较深,但它的速度并不慢,虽不及MFC,但比Java、C#要快。Qt 程序最终会编译成本地代码,而不是依托虚拟机。


一. 信号与槽

       就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,QT中用信号与槽来代替函数指针,使程序更安全简洁。信号和槽机制是 QT 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。


        信号:当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。


        槽:用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。


        信号与槽的连接:

所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。




    1. <span style="font-size:18px;">connect(sender, SIGNAL(signal), receiver, SLOT(slot));</span>


            其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。


            二. 特点:

            (1) 一个信号可以连接多个槽:

    不确定的顺序一个接一个的调用各个槽。

    多个信号可以连接同一个槽:

                     即无论是哪一个信号被发射,都会调用这个槽。

    信号直接可以相互连接:

                     发射第一个信号时,也会发射第二个信号。

            (4)连接可以被移除:

                     这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连接。语法如下:



    1. <span style="font-size:18px;">disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));</span>

                   

                三. 需要注意的问题:

    信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在

    定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子

    中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。

           (2)如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机

    的。

           (3)宏定义不能用在 signal 和 slot 的参数中。

           (4)信号和槽的参数个数与类型必须一致。


              四. 例题代码:

    在mianwindow.h中 添加槽函数


    1. <span style="font-size:18px;">private:  
    2.     Ui::MainWindow *ui;  
    3.   
    4. private slots:  
    5. void on_todayButton_clicked();  
    6. void Myday();  //自己添加槽函数  
    7. };</span>



             (2)在mainwindow.cpp中实现槽函数Myday()




    1. <span style="font-size:18px;">void MainWindow::Myday()   实现 Myday 函数  
    2. {  
    3.     ui->calendarWidget->showNextMonth();  
    4. }</span>


             (3)mainwindow.cppconnect



    1. <span style="font-size:18px;">MainWindow::MainWindow(QWidget *parent) :  
    2.     QMainWindow(parent),  
    3. new Ui::MainWindow)  
    4. {  
    5. this);   //添加代码 红色  
    6. this,SLOT(gototoday()));  
    7. }</span>


         (4)qmake