QT4 自定义槽和信号

QT4 自定义槽和信号本文所示代码在windows xp + MingW3.4.2+ eclipse3.4+CDT5.0版本中调试通过 QT系统为我们提供功能非常全面信号处理机制,它的内制信号和槽已经非常全面,因此大多数情况下,我们不需要自己设计信号和槽,但是有些时候,我们可能需要设计一些独特的信号和槽,来满足程序的需求。QT的核心机制信号和槽是独立于C++的,一般C++设计处理如按钮点击等方法,多采用回调函数,而回调函数设计上的复杂,虽然执行效率相对于QT信号与槽要高,但是其导制容易出错。况且在日常应用程序设计中来说,这种高效率相差不成比例,因此QT采用自己独门设计,来高效的编程。本文也同样倡导大家使用信号与槽。 如何才能设计自己的信号和槽呢,阅读完本节您将会轻松实现自己的需求。 在创建信号和槽之前首先大家需要建立三个文件:类申明文件(yourclass.h),类实现文件(youclass.cpp),程序主体文件(main.cpp)。 请看下面的例子,假设我们需要一个来处理文本框的内容的程序,程序主界面有两个按钮,当们点击按钮[Modify]时,文本框内容被改为“jingjing”。 1、自定义槽: 按钮点击信号clilcked()通过继承已经存在,因此我们暂时不需要定义这个信号。那么我们要改变文本框内容,就需要自己定义一个槽,来响应点击信号。 示例代码(类申明文件 yourclass.h): Copy code#ifndef YOURCLASS_H_ #define YOURCLASS_H_ #include //QT窗口应用程序需要包含的文件 #include //制作按钮时,需要包含 #include //制作文本框时,需要包含 class MyMainWindows:public QWidget //申明一个MyMainWindows类,这个类用于实现窗体 { Q_OBJECT //Q_OBJECT是在定制信号和槽和必须包含的一条宏语句 public: MyMainWindows(); //类构造函数(用于实现程序的主体部份) public slots: //所有的槽函数都必须申明public slots语句内 void SlotTest(); //这个槽函数用于显应点击按钮时改变文本框内容 private: QPushButton * pb; //申请一个按钮QPushButton QLineEdit * ledit; //申请一个文本框ledit }; #endif /* YOURClASS_H_ */ 在上面的示例代码中,我们申明了一窗口应用程序类文件,它的功能是申明程序所需要全部元素信息。在这个类中,我们申明了自己的槽SlotTest()函数,来响应按钮点击的信号。如下所示: Copy codepublic slots: //所有的槽函数都必须申明public slots语句内 void SlotTest(); //这个槽函数用于显应点击按钮时改变文本框内容 正如代码中注释说明,在自定义槽和信号是有两点是至关重要的: 第一点:所有的槽函数都需要包含在public slots语句下面。它的申明和类的公有函数方法pulic是类似的。如果你有多个槽函数,只要需要一一列出即可。 第二点;在类的文件开始部份应含Q_OBJECT宏语句,请记住它不需要标点符号,所以不要加[;]符号。所有的QT自定义槽和信号都需要有它的存在。 下面是制作第二个文件:类实现文件yourclass.cpp。在这个文件用于yourclass.h中申明的元素实现部份。 示例代码(类实现文件yourclass.cpp) Copy code#include "yourclass.h" //包含yourclass.h类申明文件 MyMainWindows::MyMainWindows() //实现构造函数 { setGeometry(90,90,300,200); //绘制主窗体,大小为300X200 pb = new QPushButton("Modify",this); //实现pb按钮,被设计其名字为Modify pb->setGeometry(10,10,100,20); //绘制pb按钮的位置(10,10)和大小(100,20) ledit = new QLineEdit("what's your name",this); //实现ledit文件框,其内容为what's your name ledit->setGeometry(10,30,200,150); //绘制ledit文件框位置(10,30)和大小(200,150) connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest())); //连接pb按钮的点击clicked()信号和自定义槽SlotTest() } void MyMainWindows::SlotTest() //自定义槽函数的实现方法,重置文本框的内容 { ledit->setText("jingjing"); //“jingjing”为点击按钮Modify后的内容 } 在yourclass.cpp中,我们实现了程序的全部功能,程序的执行还需要有一个入口。它的主体部分mian.cpp。 Copy code#include //所有QT应用程序都要包含QApplication头文件 #include "yourclass.h" //包含类定义文件yourclass.h int main(int argc,char * argv[]) { QApplication app(argc,argv); //申明一个QT应用程序对像app MyMainWindows w; //申明我们实现MyMainWindows窗体对像 w. w.show(); //显示这个w 窗体 return app.exec(); } 程序编译完成后执行当点击Modify按钮,文本内容what's your name 被修改为jingjing 2、自定义信号 在上例中,我们了解了怎样来实现自己的槽函数,在下文中我们将介绍怎么实现自己的信号。QT信号的申明与实现,相对QT槽函数来说,要更加容易一些。它相当于一系列函数原型。不需要有具体实现处理内容。在上文中,我们是通过点击clicked()这个信号,来连接槽函数SlotTest(),并达到修改文本框的内容。本例中,我们将在窗体添加一个文字标签label,然后在槽函数SlotTest()中测试label内容是否发生变化,如果发生了变化,就引发信号SigTest()。该信号连接到槽函数SlotTest2(),将文本框内容修改为"SigSig"。 下面为实现文件: 请打开上节中的yourclass.h文件,在代码加入一个槽函数SlotTest2(),和一个信号SigTest()。红色代码为新增加内容,如下所示: Copy code#ifndef YOURCLASS_H_ #define YOURCLASS_H_ #include //QT窗口应用程序需要包含的文件 #include //制作按钮时,需要包含 #include //制作文本框时,需要包含 #include //制作文本标签时,需要包含 class MyMainWindows:public QWidget //申明一个MyMainWindows类,这个类用于实现窗体 { Q_OBJECT //Q_OBJECT是在定制信号和槽和必须包含的一条宏语句 public: MyMainWindows(); //类构造函数(用于实现程序的主体部份) public slots: //所有的槽函数都必须申明public slots语句内 void SlotTest(); //这个槽函数用于显应点击按钮时改变文本框内容 void SlotTest2(); //新增加槽函数,用于将文本框内容改为SigSig private: QPushButton * pb; //申请一个按钮QPushButton QLineEdit * ledit; //申请一个文本框ledit QLabel * label; //申请一个文本标签label Signals: //所有信号都需要申明在signals语句内 void SigTest() //新增加信号SigTest()。 }; #endif /* YOURClASS_H_ */ 在这个例子中,我们加入了自定义的信号SigTest()。在QT中信号的申请方法是,在类中加入signals(信号)语句。然后在语句后面定义自己的信号函数就可以了。有趣的是信号的定义并不需要具体实现,它就像一系列函数原型一样。你只需要申请就可以了。本例中,我们申请了一个不带有任何参数的信号SigTest()。在下文中我们将用这个信号来实现文本框内容变化。 在窗体上要绘制文本标签,就必须加入头文件。其次我们在代码中新增加了一个槽SlotTest2()函数和一个信号SigTest()函数,并通过connect()函数连接。 代码如下所示(yourclass.cpp): Copy code#include "yourclass.h" MyMainWindows::MyMainWindows() { setGeometry(90,90,300,200); pb = new QPushButton("Modify",this); pb->setGeometry(10,10,100,20); ledit = new QLineEdit("what's your name",this); ledit->setGeometry(10,30,200,150); label = new QLabel("My MeMe",this); //实现一个文本标签label,并将其内容初使为:My MeMe label->setGeometry(115,10,100,20); connect(pb,SIGNAL(clicked()),this,SLOT(SlotTest())); connect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2())); //连接自定义信号SigTest ()和SlotTest2()槽函数 } void MyMainWindows::SlotTest() //信号1 { ledit->setText("jingjing"); label->setText("TTT"); //将文本标签label内容设置为TTT文本 if(label->text() != "My MeMe") { emit SigTest(); } } void MyMainWindows::SlotTest2() //信号2 { ledit->setText("SigSig"); //设置文本框内容为SigSig } 从上面代码中可以看出,首先我们在MyMainWindows()主窗体类构造函数中加入了 Copy codelabel = new QLabel("My MeMe",this); label->setGeometry(115,10,100,20); Label文本标签的初使内容为My MeMe。其位置为窗体的(115,10),大小为(100,20),我们在上一事例中讲过的槽函数SlotTest()中新加入了对文本标签的检测,来达到对我们自定义信号SigTest()触发。如下所示: Copy codevoid MyMainWindows::SlotTest() //信号1 { ledit->setText("jingjing"); label->setText("TTT"); //将文本标签label内容设置为TTT文本 if(label->text() != "My MeMe") { emit SigTest(); } } void MyMainWindows::SlotTest2() //信号2 { ledit->setText("SigSig"); //设置文本框内容为SigSig } 如代码所示当SlotTest()槽函数被调用时,首先将ledit文本框内容设为jingjing,并把label文本标签内容设为TTT,然后此时我们检测label的内容是不是还为它的初使内容My MeMe,如果不是,则引发我们自定义的SigTest()信号。请注意代码中emit(发射)关键字,做为QT信号与槽机制来说,emit的作用就是将信号发出来的意思。也就是说,当我们类申明文件中定义了一个信号时,如果要使用这个信号,只需在信号语句前面加上emit关键字就可以了。 而在SlotTest2()槽函数中,我们把文本框ledit的内容设为:SigSig。也就是当SlotTest2()槽函数被调用时就又会把ledit中内容修改为SigSig。在本事例中,我们用SigTest()信号来连接SlotTest2()这个槽,也就是说当SigTest()信号被触发时,就会将文本框的内容修改为:SigSig。代码如下: Copy codeconnect(this,SIGNAL(SigTest()),this,SLOT(SlotTest2())); 现在让我们把上例中的Main.cpp文件放到一起,进行编译 当第一次点击[Modify]按钮时,程序首先产生一个信号clicked(),而这个信号将导致SlotTest()槽被执行,文本框的内容首先被修改为jingjing,然后label文本标签的内容被修改为TTT,随后在SlotTest()语句发现label的内容不是My MeMe,因此向外发射信号SigTest()。而SigTest()信号与SlotTest2()槽连接,因此导致SlotTest2()槽函数被调用,它又将文本框内容修改为了SigSig。因此当我们点击Modify时,文本框内容最终会变为SigSig文本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值