QT Ctreater 三种建立信号和槽的方法(待完善)

以 两个控件label和button为例,当单击button时,在label上显示“hello world”。

项目建好后,控件安放好。

1. 自己定义槽函数和映射

        1)在头文件mainwindow.h中类MainWindow的定义中声明槽函数:

              class MainWindow : public QMainWindow

              {

                     Q_OBJECT

                     public:

                                 explicit   MainWindow(QWidget *parent = 0);

                                ~MainWindow();

                     private slots:

                                 void on_pubshButton_clicked();

                    ....

               };

      2) 定义槽函数体在mainwindow.cpp文件中:

            void MainWindow::on_pushButton_clicked()

            {

                  ui->label->setText("Hello world");

            }

      3)建立映射,在类MainWindow的构造函数中添加如下语句,以便将信号和槽函数进行连接:(我在实验时,并没有进行该步但是能实现功能,加上这步骤后,编译出错)

         MianWindow::MainWindow(QWidget *parent):   QMainWindow(parent),ui(new ui::MainWindow)

       {

          connect(ui->pushbutton,SIGNAL(clicked()),this, SLOT(on_pushButton_clicked());

          ui->setupUi(tis);

        }


2. 右击"OK"按钮,选择“转到槽”选项,选择信号“clicked()”, 单击”确定“按钮。系统自动生成槽函数的声明和定义,并建立内部映射(在构造函数中看不到映射代码?),在槽函数体内编写功能即可。


3. 右击界面选择”改变信号/槽“选项, 单机”+“添加新的槽函数, 如图所示:单击”确定“完成槽函数的添加。在窗体编辑区的下方有信号和槽的映射窗口,单击左上角的加号,添加映射,编辑映射关系。重复1.中的1)和2)完成槽函数的声明及定义。

图1 抓到槽


图2   改变信号/槽

图3  信号和草编辑器-----------在这里进行信号和槽函数的关联,  在”发送者“   ”信号”    “接受者”   “ 槽”  中可以选择 关联的东西。


附:信号和槽的映射(转)

http://mobile.51cto.com/symbian-267807_1.htm

四、信号与槽的关联

通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

 
 
  1. bool QObject::connect ( const QObject * sender, const char * signal,  
  2. const QObject * receiver, const char * member ) [static] 

这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。

例如,下面定义了两个对象:标签对象label和滚动条对象scroll,并将valueChanged()信号与标签对象的setNum()相关联,另外信号还携带了一个整形参数,这样标签总是显示滚动条所处位置的值。

 
 
  1. QLabel *label = new QLabel;  
  2. QScrollBar *scroll = new QScrollBar;  
  3. QObject::connect( scroll, SIGNAL(valueChanged(int)),  
  4. label, SLOT(setNum(int)) ); 

一个信号甚至能够与另一个信号相关联,看下面的例子:

 
 
  1. class MyWidget : public QWidget  
  2. {  
  3. public:  
  4. MyWidget();  
  5. ...  
  6. signals:  
  7. void aSignal();  
  8. ...  
  9. private:  
  10. ...  
  11. QPushButton *aButton;  
  12. };  
  13. MyWidget::MyWidget()  
  14. {  
  15. aButton = new QPushButton( this );  
  16. connect( aButton, SIGNAL(clicked()), SIGNAL(aSignal()) );  

在上面的构造函数中,MyWidget创建了一个私有的按钮aButton,按钮的单击事件产生的信号clicked()与另外一个信号aSignal ()进行了关联。这样一来,当信号clicked()被发射时,信号aSignal()也接着被发射。当然,你也可以直接将单击事件与某个私有的槽函数相关联,然后在槽中发射aSignal()信号,这样的话似乎有点多余。

当信号与槽没有必要继续保持关联时,我们可以使用disconnect函数来断开连接。其定义如下:

 
 
  1. bool QObject::disconnect ( const QObject * sender, const char * signal,  
  2. const Object * receiver, const char * member ) [static] 

这个函数断开发射者中的信号与接收者中的槽函数之间的关联。

有三种情况必须使用disconnect()函数:

断开与某个对象相关联的任何对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或者多个信号,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就可以利用这个方法,非常之简洁。

 
 
  1. disconnect( myObject, 0, 0, 0 )  

或者

 
 
  1. myObject->disconnect() 

断开与某个特定信号的任何关联。

 
 
  1. disconnect( myObject, SIGNAL(mySignal()), 0, 0 )  

或者

 
 
  1. myObject->disconnect( SIGNAL(mySignal()) ) 

断开两个对象之间的关联。

 
 
  1. disconnect( myObject, 0, myReceiver, 0 )  

或者

 
 
  1. myObject->disconnect( myReceiver ) 

在disconnect函数中0可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者sender不能为0,其它三个参数的值可以等于0。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值