`
qimo601
  • 浏览: 3454283 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

QT4 自定义槽和信号

阅读更多

转载:http://www.qtcn.org/bbs/simple/?t13645.html

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):

 

  1. #ifndef YOURCLASS_H_
        #define YOURCLASS_H_
        #include <QWidget>                        //QT窗口应用程序需要包含的文件
        #include <QPushButton>                    //制作按钮时,需要包含
        #include <QLineEdit>                      //制作文本框时,需要包含
        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()函数,来响应按钮点击的信号。如下所示:

  1. public slots:                              //所有的槽函数都必须申明public slots语句内
              void SlotTest();                    //这个槽函数用于显应点击按钮时改变文本框内容


    正如代码中注释说明,在自定义槽和信号是有两点是至关重要的:
    第一点:所有的槽函数都需要包含在public slots语句下面。它的申明和类的公有函数方法pulic是类似的。如果你有多个槽函数,只要需要一一列出即可。
    第二点;在类的文件开始部份应含Q_OBJECT宏语句,请记住它不需要标点符号,所以不要加[;]符号。所有的QT自定义槽和信号都需要有它的存在。
    下面是制作第二个文件:类实现文件yourclass.cpp。在这个文件用于yourclass.h中申明的元素实现部份。
    示例代码(类实现文件yourclass.cpp)

  1. #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。

  1. #include <QApplication>              //所有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()。红色代码为新增加内容,如下所示:

  1. #ifndef YOURCLASS_H_
        #define YOURCLASS_H_
        #include <QWidget>                        //QT窗口应用程序需要包含的文件
        #include <QPushButton>                    //制作按钮时,需要包含
        #include <QLineEdit>                      //制作文本框时,需要包含
        #include <QLabel>                        //制作文本标签时,需要包含
        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()。在下文中我们将用这个信号来实现文本框内容变化。
    在窗体上要绘制文本标签,就必须加入<QLabel>头文件。其次我们在代码中新增加了一个槽SlotTest2()函数和一个信号SigTest()函数,并通过connect()函数连接。
    代码如下所示(yourclass.cpp):

  1. #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()主窗体类构造函数中加入了
      

  1. label = new QLabel("My MeMe",this);              
           label->setGeometry(115,10,100,20);


    Label文本标签的初使内容为My MeMe。其位置为窗体的(115,10),大小为(100,20),我们在上一事例中讲过的槽函数SlotTest()中新加入了对文本标签的检测,来达到对我们自定义信号SigTest()触发。如下所示:

  1. 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
    }


    如代码所示当SlotTest()槽函数被调用时,首先将ledit文本框内容设为jingjing,并把label文本标签内容设为TTT,然后此时我们检测label的内容是不是还为它的初使内容My MeMe,如果不是,则引发我们自定义的SigTest()信号。请注意代码中emit(发射)关键字,做为QT信号与槽机制来说,emit的作用就是将信号发出来的意思。也就是说,当我们类申明文件中定义了一个信号时,如果要使用这个信号,只需在信号语句前面加上emit关键字就可以了。
    而在SlotTest2()槽函数中,我们把文本框ledit的内容设为:SigSig。也就是当SlotTest2()槽函数被调用时就又会把ledit中内容修改为SigSig。在本事例中,我们用SigTest()信号来连接SlotTest2()这个槽,也就是说当SigTest()信号被触发时,就会将文本框的内容修改为:SigSig。代码如下:

  1. connect(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文本。

分享到:
评论

相关推荐

    QT自定义信号和槽

    QT QT自定义信号和槽 QT自定义 信号和槽 QT信号。讲解怎么在 QT中自己定义消息和槽,QT编程可以看看

    GUI开发示例代码---QTdesigner实现自定义槽函数

    在本示例中,我们将深入探讨如何利用QTDesigner来实现自定义槽函数,并结合Python进行GUI程序的开发。 首先,QTDesigner生成的是.ui文件,这是一个XML格式的文件,记录了GUI界面的所有布局和控件信息。要将.ui文件...

    QT信号槽传递自定义结构体示例

    标题"QT信号槽传递自定义结构体示例"中提到的关键点在于,我们将利用QT的信号槽机制传递一个自定义的数据结构,即`ArbStruct`。这个结构体可以包含任何我们需要的数据成员,比如整型、字符串、浮点数等,以满足特定...

    QT自定义信号与槽示例

    综上所述,"QT自定义信号与槽示例"是一个关于如何在QT项目中创建和使用自定义信号与槽的实践教程。通过学习这个示例,开发者可以更深入地理解QT中的事件驱动编程模式,提高代码的可维护性和可扩展性。

    Qt 源代码 - 06_信号和槽(二)自定义信号和槽的实例

    // 自定义槽 }; ``` 在上述例子中,`customSignal(int)`是自定义的信号,当需要向外界发送一个整数值时可以发射这个信号;`handleCustomSignal(int)`则是对应的槽,用于处理接收到的信号。 接下来,我们需要知道...

    以自定义数据作为信号槽的参数

    4. **`Q_DECLARE_METATYPE`宏**:为了使自定义类型能用于信号和槽,需要使用`Q_DECLARE_METATYPE`宏声明你的类型。这会使QT的元对象系统认识你的类型,比如`QMetaObject`,并允许它们在信号和槽中使用。 5. **`...

    QT添加自定义控件

    - **信号与槽**: 这是QT的核心机制之一,用于组件间通信。 #### 三、创建自定义控件 1. **设计自定义控件**: - **步骤1**: 打开QT Creator,新建一个Qt Widgets Application项目。项目名称可根据实际需求设定,...

    Linux QtDesigner自定义Button控件

    本教程将详细介绍如何在Qt4中使用Qt Designer实现自定义Button控件的过程。 首先,要创建自定义的Button控件,你需要了解Qt的插件系统。Qt Designer通过插件机制加载自定义控件,使得它们可以在设计界面中显示和...

    Qt之自定义检索框

    在IT领域,特别是软件开发中,用户界面的设计与交互性是至关重要的。Qt是一个流行的跨平台应用程序...通过合理使用Qt提供的类和信号槽机制,我们可以构建出功能强大且易于使用的搜索界面,为用户提供流畅的搜索体验。

    QT5自定义中英文虚拟键盘

    总的来说,QT5自定义中英文虚拟键盘涉及到的知识点包括:QT5图形视图框架、事件处理、信号与槽机制、内存管理、字符串处理、二进制文件解析、搜索算法以及跨平台应用开发。通过这个项目,开发者不仅可以深入理解QT5...

    Qt自定义按钮弹窗控件。

    "Qt自定义按钮弹窗控件"指的是通过Qt的类库和信号与槽机制,设计一个具有特定功能的按钮,当用户点击该按钮时,会弹出一个具有自定义样式的窗口。这个窗口可能包含圆角和阴影效果,以提供更美观、友好的视觉体验。...

    Qt 自定义 Calendar 日历控件

    3. **信号与槽机制**: 在Qt中,信号和槽是实现对象间通信的关键机制。在自定义日历控件时,我们可以定义信号来表示日期的选择、切换等事件,并使用槽来响应这些事件,执行相应的操作。 4. **样式表(QSS)**: Qt...

    Qt实现的自定义tip

    通过阅读和学习这些代码,我们可以深入理解Qt自定义控件的原理,以及如何利用Qt的事件机制和绘图功能实现特定的UI效果。同时,这也是一个很好的实践案例,展示了如何在实际项目中扩展和定制Qt的基本功能。 总之,Qt...

    QT自定义dialog提示窗

    本项目“QT自定义dialog提示窗”着重于通过纯代码方式创建对话框,无需使用UI文件。下面将详细阐述相关知识点。 1. **自定义对话框的创建**: 在QT中,可以继承`QDialog`类来创建自定义对话框。`QDialog`是QT中的...

    QT自定义tableModel和使用sqltablemodel

    3. 模型更改通知:`beginInsertRows()`, `endInsertRows()`, `beginRemoveRows()`, `endRemoveRows()`, `beginResetModel()`, `endResetModel()`,这些信号和槽用于通知视图模型数据的变化。 接下来,我们转向...

    QT自定义对话框及采用信号槽机制与主窗口交互的应用程序示例

    在一个应用程序设计中,为了实现一些特定的功能,...samp6_2CustomDialogsSignal.rar应用程序实现方式就是利用Qt的信号与槽机制,设计相应的信号和槽,将信号与槽关联起来,在进行某个操作时发射信号,槽函数自动响应。

    自定义QT消息订阅发布

    总结,自定义的Qt消息订阅发布机制利用了Qt的信号和槽机制,通过创建消息中心类,实现了发布者和订阅者的解耦。订阅者只需要关心自己感兴趣的信号,并通过消息中心接收和处理消息,而无需关心消息来源。这种设计模式...

    嵌入式与物联网开发 QT 自定义信号槽.mp4

    嵌入式与物联网开发 QT 自定义信号槽.mp4

    【Qt】自定义QSlider

    在实际应用中,你可以将这个自定义的MySlider类集成到你的Qt界面中,通过连接信号和槽来响应滑块值的变化。例如,你可以这样使用: ```cpp #include "my_slider.h" // ... MySlider *slider = new MySlider(this)...

    Qt自定义控件库.rar

    Qt自定义控件库是一个集合了多种自定义控件资源的压缩包,主要针对Qt开发平台,用于丰富和扩展Qt应用程序的用户界面。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动设备以及嵌入式系统的...

Global site tag (gtag.js) - Google Analytics