关于qt的信号槽机制的理解 分类: QT学习记录 2011-09-23 11:22 1872人阅读 评论(1) 收藏

 

QT的信号和槽机制是QT的一大特色。解决了同步触发问题,即提供了一种不同部件之间通讯机制,发送部件只知道发送什么信号,而接受部件只知道接受什么信号,实现了完美的封装。

下面说一说这种机制,个人理解,可能很肤浅。做一下记录,以整理思路。

QT提供了完美的机制,即你可以之间定义信号和槽,自己管理同步,即你可以选择什么时候发送什么信号。这就好办了,你一个程序之间的各个部件通讯问题就迎刃而解了。

class MainWindow : public QMainWindow

{

    Q_OBJECT

public:

    explicit MainWindow(QWidget *parent = 0);

    void initconnect(void);

    ~MainWindow();

private:

    Ui::MainWindow *ui;

    QTimer *timer;

    Win_QextSerialPort *myCom;

   signals:

        void valuechanged(void);

private slots:

       void on_open_clicked(void);

};
上面是一个类的定义,是我从QT  creator 上copy过来的。

使用信号和槽的前提是继承了Qobject类或者子类,然后还要使用Q_OBJECT这个宏。信号和槽不是标准的c++程序,用了信号和槽的程序要经过元编译器把信号和槽编译成标准c++程序,然后再由c++编译器编译的。

这个信号和槽的定义就很明确了,他们在QT中就像普通的函数一样去定义。

有没有区别,当然有了,其中信号函数只定义就行了,不用去具体实现,因为他的作用就是发送一个信号,没有实际操作(发信号这些机制被QT都封装好了)。槽函数要自己去实现,槽函数就是接受到自己想要的东西时要执行的动作。

信号和槽函数可以有参数,但必须一致,因为他们是要通过connect连接起来的。传参也是他们干的。哎对了,还没说他们怎么联系。是通过

connect(this,SIGNAL(valuechanged(void)),this,SLOT(on_open_clicked(void)));

这个语句要写到类的函数里面,看自己需求,当然可以放到构造函数里了。这样这两个东西就联系起来了。它共有4个参数,很简单。发送对象的指针,发送的信号,接受对象的指针,接受信号后干的活。当然这个例子都是用的this指针,表示都是本对象。

好了,现在什么都准备好了,谁发信号,谁接受信号,接受玩后干什么都准备好了,就剩下一个问题了,什么实际发信号。

好了,QT信号和槽机制提供了发信号的代码 emit valuechanged()只要执行这个代码,对应的槽就立即执行。好了,现在什么都清楚了。呵呵

还有,一些事情使我们迷茫,有时候用一个元件时,比如pushbutton 就可以使用他已经有的信号,比如clicked 。代表你用户一用鼠标按这个按钮,他就发送这个信号。这个吧,先说一下信号、槽和事件的区别。前面也已经说了,信号和槽是解决同一进程里的同步触发问题,也即解决了不同部件之间的内部通讯问题。而事件是解决的异步触发问题,比如你点击鼠标是不确定的事件,这些是QT的事件管理机制,关于这个机制,不想详细说明,因为今天就是让我们大家明白信号、槽和事件的区别。

Mai函数里的

return app.exec();

其实就是等待响应事件。

还说上面点击鼠标的问题,你点击鼠标是一个事件,这个事件触发了一个clicked信号,这个信号影响了对应的槽。

好了,现在大家估计明白了,如果你想自己实现自己的异步触发机制,就只能自己定义事件了,放心qt提供了完美的机制来让你定义事件。

最后再说一遍,在QT中,信号、槽提供的是同步触发机制,事件提供异步触发机制。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2011-09-23 11:22  张连聘  阅读(147)  评论(0编辑  收藏  举报

导航