Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2717578
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: C/C++

2010-11-01 19:06:14

QT中经常会用到blockSignals, 且是成对出现,实现时常在函数的开始阻塞信号,在函数的结尾释放信号。
若里面有大量需要阻塞的变量对象,这样写是件很麻烦的事,代码也比较多。
如果能实现象下面的方式实现,这样能简化很多,且不关心释放问题.
下面的例子是关于slider与spinbox联动问题,若改slider影响spinbox,反之如此。
实现效果可参考中的视频编辑效果
样例代码:
void ImEffectWidget::slotSlider(int pos)
{
 static int oldPos = 0;
 if (oldPos != pos)
 {
  QRect r;
  QObject *o = sender();
//
  ImSignalBlock block;
  block << m_ui.spinBoxTransparent << m_ui.spinBoxVerticalPos
     << m_ui.spinBoxHerizontalPos << m_ui.spinBoxSTTransparent
     << m_ui.spinBoxSTVPos;
  int tabType = m_treeItem->mdata("effect_catalog").toInt();
  if (tabType == TAB_CATALOG_WATERMARK ){
   r = m_treeItem->getEffectItem("effect_item_rect").toRect();
  }
 
  /* 3. for watermark  ***************************/
  else if (o->objectName() == "sliderTransparent"){
   m_ui.spinBoxTransparent->setValue(pos);  //与spinbox关联
   m_treeItem->setEffectItem("effect_item_transparent", pos);
  }else if (o->objectName() == "sliderVerticalPos"){
   r.moveLeft(pos);
   m_ui.spinBoxVerticalPos->setValue(pos);
  }else if (o->objectName() == "sliderHorizontalPos"){
   r.moveTop(pos);
   m_ui.spinBoxHerizontalPos->setValue(pos);
  }
  /* 5. for subtitle  ***************************/
  else if (o->objectName() == "sliderSTTransparent"){
   m_ui.spinBoxSTTransparent->setValue(pos);
   m_treeItem->setMediaData("effect_subtitle_transparent", pos);
  }else if (o->objectName() == "sliderSTVPos"){
   m_ui.spinBoxSTVPos->setValue(pos);
   m_treeItem->setMediaData("effect_subtitle_pos", pos);
  }
 
  if (tabType == TAB_CATALOG_WATERMARK ){
   m_treeItem->setEffectItem("effect_item_rect", r);
  }
  sendEffectEvent();   //向sdl发信号
  oldPos = pos;
 }
}

现在看看ImSignalBlock类是如何实现的:
ImSignalBlock.h:
#ifndef IMSIGNALBLOCK_H_
#define IMSIGNALBLOCK_H_
#include
class ImSignalBlock
{
public:
 ImSignalBlock();
 ~ImSignalBlock();
  ImSignalBlock &operator<< (QObject *o);
private:
 QList m_objs;
};
#endif
ImSignalBlock.cpp:
#include
#include "ImSignalBlock.h"
ImSignalBlock::ImSignalBlock()
{
}
ImSignalBlock::~ImSignalBlock()
{
 foreach (QObject* o, m_objs)
 {
  if (o) o->blockSignals(false);
 }
}
ImSignalBlock &ImSignalBlock::operator<< (QObject *o)
{
 if (o)
 {
  m_objs.append(o);
  qDebug() << o->objectName();
  o->blockSignals(true);
 }
 return *this;
}
利于ImSignalBlock可简化代码,以便今后维护. 有问题可到给我留言.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/notton/archive/2010/10/30/5975872.aspx
阅读(2430) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-02 16:58:10

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com