《Windows编程》微型技术报告二

针对信号和槽的专题研究

引言:信号(signal槽(slot用于对象间的通讯。信号/槽机制是Qt的一个重要特征。 在图形用户界面编程中,常需要将一个窗口部件的变化通知给另一个窗口部件,或者说希望对象间进行通讯。一般的图形用户界面编程中采用回调函数进行对象间通信,这样回调和处理函数捆绑在一起,没有signalslot机制的简便和灵活

内容介绍:Qt的窗口部件有很多预定义的信号,slot是一个可以被调用处理特定信号的函数。Qt的窗口部件又很多预定义的槽,当一个特定事件发生的时候,一个信号被发射,对信号感兴趣的slot就会调用对应响应函数。信号/槽机制在QObject类中实现,从QObject类或者它的一个子类(比如QWidget类)继承的所有类可以包含信号和槽。当对象改变它们的状态的时候,信号被发送,对象不关心有没有其它对象接收到它所发射的信号。槽是类的正常成员函数。可以将信号和槽通过connect函数任意相连。当一个信号被发射它所连接的槽会被立即执行,就像一个普通函数调用一样。

一个带有信号和槽的Qt类Foo声明如下:

class Foo : public QObject

 {

        Q_OBJECT //包含信号和/或者槽的类必须声明Q_OBJECT

    public:

        Foo();

        int value() const { return val; }

    public slots:

        void setValue( int ); //槽的声明

    signals:

        void valueChanged( int ); //信号声明

    private:

        int val;

};

void Foo::setValue( int v )

{

        if ( v != val ) {

            val = v;

            emit valueChanged(v); //发送信号

        }

}

 

下面把两个对象连接在一起:

Foo a, b;

   connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));//信号与槽连接

   b.setValue( 11 ); // a == undefined  b == 11

   a.setValue( 79 ); // a == 79         b == 79

    b.value();


调用a.setValue(79)会使a发射一个valueChanged() 信号,b将会在它的setValue()槽中接收这个信号,也就是b.setValue(79) 被调用。接下来b会发射同样的valueChanged()信号,但是因为没有槽被连接到b的valueChanged()信号,所以没有发生任何事(信号消失了)。

signalsslotsemit不是C++的标准关键字,需要预处理程序改变或者移去了signalsslotsemit 这些关键字,然后再使用标准的C++编译器。对包含有信号和槽的类定义运行MOCMeta Object Compiler)。生成一个可以和其它对象文件编译和连接成引用程序的C++源文件。

槽是普通成员函数,它和普通成员函数一样分为publicprotectedprivate三类,public slots表示声明的是任何信号都可以相连的槽。protected slots表示这个类的槽和它的子类的信号才能连接。private slots表示这个类本身的信号可以连接这个类的槽。

猜你喜欢

转载自www.cnblogs.com/gaoxiaoqiya666/p/9222333.html