一、信号和槽
Qt的一 项重要的机制就是它的信号和槽,在图形用户界面编程中,经常需要将一个窗口部件的变化通知给另一个窗口部件,或者说系统对象进行通信.一般的图形用户编程 中采用回调函数进行对象间通信(如:gtk+),这样回调函数和处理函数捆绑在一起,但这样做没有信号和槽机制简便和灵活.
如Qt的窗口部件有多个预定义的信号,槽是一个可以被调用处理特定信号的函数.Qt的窗口部件有多个预定义的槽,当一个特定的时候发生的时候,一个信号被发射,对信号感兴趣的槽就会调用对应响应函数.
信号/槽机制在QObject类中实现,从QObject类或其一个子类继承的所有类可以包含信号和槽.当对象改变其状态的时候,信号被发送,对象不关心 有没有其他对象接收到这信号.槽是类的正常成员函数,可以将信号和槽通过connect函数任意相连.当一个信号被发射,它所连接的槽会被立即执行,如同 一个普通函数调用一样.
槽是普通成员函数,它和普通成员函数一样分为public、protected和private共3类。Public slots表示声明是任何信号都可以相连的槽;protected slots表示这个类的槽及其子类的信号才能连接;private slots表示这个类本声的信号可以连接这个类的槽。
二、 在Qt Designer中信号应用实例
下面我们用一个实例来了解信号的用法.
首先我们新建一个文件夹:
#mkdir /root/Desktop/qt/signal
我们打开Qt创建项目,项目路径为 /root/Desktop/qt/signal/signal.pro
从菜单栏的 File->New 打开新建对话框,选择第二个:Dialog,然后也同样保存到刚刚创建的文件夹下。
这时侯,你的 QT Designer 中就会出现一个 From1 来. 更改右下角那个窗口里的name 改为MainFrom.把caption的值改为signal".
然后我们从左面的Toolbox拖拽一个PushButton.并把name改为ExitButton,把text改为Exit.
下面是效果图:
到这里我们已经把页面设置完了,下面我们为ExitButton设置信号函数.
我们按一下 F3(或者有菜单栏选择 Edit->Connections ),然後在那个 “Exit” 按钮上点击一下。
这时侯我们就看到了View and Edit Connection 页面了. 在Signal中选择clicked,在slot中,先选择close()就好了,在 Reciever中选择MainFrom.这时侯选择OK.
我们就算是基本完成了。保存下。 如果想看看这个小程序长什麽样子.可以用 CTRL+T来看 PreView.
我们现在还不能编译这个程序,为什么呢?对了因为我们还缺少一个main.cpp。想一想上一章怎样创建的了。从菜单栏的File->New打开新建对话框,选择最后一个:C++ Main—File(main.cpp).
好了,现在来编译我们的程序。
先打开一个终端,然后切换到我们建立工程的目录。然后利用Qt的工具生成Makefile文件。# qmake
编译:# make
运行:# ./signal
点击Exit按扭,程序退出。
三、在Qt Designer中槽应用实例
下面我们要做一个加法器。打开Qt,新建名为slot的工程文件,然后再新建如下图所示的界面:
修改要显示结果的label的name为textLableresult.并把其text清空.把确定按扭的name改为AddButton.
好了,我们已经把页面设置好了.我们现在要做的就只有使用户按AddButton按扭时textLableresult能够显示lineEdit1和lineEdit2的和.所以我们必须对AddButton的clock信号设置一个槽.
首先按一下 F3(或者有菜单栏选择 Edit->Connections ),然后在AddButton按钮上点击一下这时侯我们就看到了"View and Edit Connection"的页面了。在Signal中选择clicked, 在Receiver中选择MainForm.在Slot中,都是QT为我们准备好的槽,我们需要建立自己的槽.
点击右边的“Edit Slots...”按钮,然后就可以看见" Edit Functions "窗口,该窗口也可以通过“主菜单 Edit->Slots” 打开。点击 "New Function" 按钮,将"newSlot()"改为 "add()" ,然后选择 OK。
这时我们已经建立了一个槽,我们再回到 "View and Edit Connection"对话框中,在 Slot 中我们现在看到了刚刚自己创建的槽"add()",我们选择它.这样就可以使AddButton的信号与add()槽关联起来了。
我们还需要向add()槽里写一些代码,使它能够完成加法功能.在主窗体"form_main"的空白处双击鼠标左键,弹出对话框"Creating ui.h file",我们选择"Yes",然后可以看到一个编辑窗口。如下图所示:
我们需要在 void MainForm::add()中添加如下的代码:
void MainForm::add() { QString str1,str2,strResult; double add1=0.0,add2=0.0,result0.0;
str1=lineEdit1->text(); str2=lineEdit2->text();
Bool ok1=FALSE,ok=FALSE; add1=str1.toDouble(&ok1); add2=str2.toDouble(&ok2);
if(ok1&&ok2) { result=add1+add2; strResult.sprintf("%f",result); textLabelResult->setText(strResult); } } |
到这里我们编辑的工作就都结束了,我们先保存。然后打开一个终端,改变当前目录为我们保存项目的目录,然后
生成Makefile文件:#qmake
编译:# make
运行:# ./ slot
下面是我运行的界面:
四、在终端窗口中Qt编程信号的应用实例
打开一个终端,用vi建立一个文件t2.c,键入如下程序:
#include <qapplication.h>
#include <qpushbutton.h>
int main( int argc, char **argv )
{
QApplication a( argc, argv ); //创建QApplication对象
生成工程文件:
qmake -project
生成makefile
qmake
编译mnake
下面是界面截图:
用户点击按扭,程序退出.