注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

G G I C C I

 
 
 

日志

 
 

我的Qt学习笔记 5 Qt 信号和槽 SIGNAL and SLOT  

2012-07-05 18:45:37|  分类: Qt |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Title :

  • SIGNAL and SLOT
  • Qt 信号和槽机制

Note :

A signal can be connected to many slots and signals. Many signals can be connected to one slot. [From Qt Doc]

  • 一个信号可以连接多个槽
  • 多个信号可以连接同一个槽
  • 一个信号可以连接另一个信号
   1: MyWidget::MyWidget(QWidget *parent)
   2:     : QWidget(parent)
   3: {
   4:     //初始化两个QPushButton
   5:     bt_red = new QPushButton(tr("Red"), this);
   6:     bt_green = new QPushButton(tr("Green"), this);
   7: 
   8:     //初始化两个QLabel
   9:     lbl_1 = new QLabel;
  10:     lbl_2 = new QLabel;
  11:     lbl_1->setMinimumSize(100, 100);
  12:     lbl_2->setMinimumSize(100, 100);
  13: 
  14:     //一个信号( bt_red 的 clicked )连接多个槽( setLabel1Red 和 setLabel2Red )
  15:     connect(bt_red, SIGNAL(clicked()), this, SLOT(setLabel1Red()));
  16:     connect(bt_red, SIGNAL(clicked()), this, SLOT(setLabel2Red()));
  17:     connect(bt_green, SIGNAL(clicked()), SLOT(setLabel2Green()));
  18:     connect(bt_green, SIGNAL(clicked()), SLOT(setLabel1Green()));
  19: 
  20:     //信号与信号连接,只要一按 bt_red,redButtonPressed 信号就会同 clicked 被发送
  21:     connect(bt_red, SIGNAL(clicked()), this, SIGNAL(redButtonPressed()));
  22:     //把 redButtonPressed 信号与 redButtonPressedSlot 槽相连
  23:     connect(this, SIGNAL(redButtonPressed()), this, SLOT(redButtonPressedSlot()));
  24: 
  25:     //界面布局
  26:     QVBoxLayout *vLayout_left = new QVBoxLayout;
  27:     QVBoxLayout *vLayout_right = new QVBoxLayout;
  28:     QHBoxLayout *hLayout_main = new QHBoxLayout;
  29: 
  30:     vLayout_left->addWidget(lbl_1);
  31:     vLayout_left->addWidget(lbl_2);
  32:     vLayout_right->addWidget(bt_red);
  33:     vLayout_right->addWidget(bt_green);
  34:     hLayout_main->addLayout(vLayout_left);
  35:     hLayout_main->addLayout(vLayout_right);
  36:     setLayout(hLayout_main);
  37:     setMinimumWidth(500);
  38:     setWindowTitle(tr("SIGNAL and SLOT show"));
  39: }
  40: 
  41: void MyWidget::redButtonPressedSlot()
  42: {
  43:     //弹出一个消息窗口以直接证明信号与槽连接成功了,间接证明上面的信号与信号之间是可以连接的
  44:     QMessageBox::information(this, tr("Ggicci"), tr("You pressed the red button!"), QMessageBox::Ok);
  45: }
效果:
单击 red 按钮后:
2012-07-05_1821
单击 green 按钮后:
2012-07-05_1821_001


If a signal is connected to several slots, the slots are activated in the same order as the order the connection was made, when the signal is emitted. [From Qt Doc]

  • 如果一个信号被连接至多个槽,那么这些槽的调用顺序与连接的形成顺序是一样的。

看上面的代码,btRed的clicked信号先与setLabel1Red槽连接,再与setLabel2Red槽连接;而btGreen顺序相反,单击上面的按钮后的调用顺序如下:

image

image

By default, a signal is emitted for every connection you make; two signals are emitted for duplicate connections. [From Qt Doc]

  • 默认情况下每一个连接都会收到一个信号,所以如果你把同一个信号与槽连接了多次(N),那么当信号发送后,这个槽也会被调用N次。所以这里千万要注意,我以前就遇到这么一个Bug过,所以写连接的代码的时候要注意哦,特别是有的时候在可能会出现重复调用的函数里面对某些信号和槽做连接,这样的话这个函数被调用多次就会造成连接的重复。要防止重复可以有一个方法:在 connect() 函数中传递 Qt::UniqueConnection 参数而不是默认的 Qt::AutoConnection,这样的话如果连接已经存在,那么这次连接会失败(返回false)。

You can break all of these connections with a single disconnect() call. [From Qt Doc]

  • 连接可以被移除,使用disconnect() 函数就可以了,当然直接delete掉对象的话,与该对象有关的信号和槽会被自动移除。

End :

Author : Ggicci

谢谢阅读,如有误希望指正!

  评论这张
 
阅读(458)| 评论(2)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017