• 8086阅读
  • 4回复

setCurrentPage()能触发“两次”currentChanged? [复制链接]

上一主题 下一主题
离线rockyluo
 

只看楼主 倒序阅读 楼主  发表于: 2009-02-11
一个QTabWidget,上面有几个tab
现在将其通过  currentChanged(QWidget*)  信号连接到一个槽

    connect( tabwidget , SIGNAL( currentChanged(QWidget*) )  , this ,  SLOT(  tabwidget_Slot(QWidget*) )  );

其中:
void tabwidget_Slot(QWidget *w)
{
    printf("Tabwidget!!!\n");
}

实验显示:
1.如果直接用鼠标去单击某个tab,屏幕打印结果如下:
    Tabwidget!!!
2.如果在程序中调用setCurrentPage(int),屏幕打印结果如下:
    Tabwidget!!!
    Tabwidget!!!
  (打印了两次!)
这是怎么造成的?查了下底层库,似乎也没发现emit currentChanged(QWidget*)两次的!
[ 此贴被rockyluo在2009-02-13 16:22重新编辑 ]
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线rockyluo

只看该作者 1楼 发表于: 2009-02-12
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线mrj123

只看该作者 2楼 发表于: 2009-02-12
Re:
当然会。因为SetCurrentWidget的时候有信号发出
离线rockyluo

只看该作者 3楼 发表于: 2009-02-13
Re:难道 QTabWidget  的  setCurrentPage()
没错  SetCurrentPage的时候肯定有信号发出
库里头源代码为:
void QTabWidget::setCurrentPage( int id )
{
          d->tabs->setCurrentTab( id );
          showTab( id );
}
而:
void QTabWidget::showTab( int i )
{
    if ( d->stack->widget( i ) ) {
        d->stack->raiseWidget( i );
        emit selected( d->tabs->tab( i )->label );
        emit currentChanged( d->stack->widget( i ) );            // 此处只emit了一次currentChanged
    }
}

关键我那上面调用setCurrentPage(int)后为什么会出现emit两次currentChanged的效果?
                                                                                                              我们要团结一心,秉承Linux的开源精神,共享Qt问题的解决方法!
离线tinglan

只看该作者 4楼 发表于: 2009-02-13
触发一次currentChanged(QWidget*)信号打印一个Tabwidget!!!
程序运行时,
tabwidget默认的是setCurrentPage(0),也算是触发了一次信号。
你可以试一试,触发两次setCurrentPage()将会打印三次
Tabwidget!!!
快速回复
限100 字节
 
上一个 下一个