学习记录-使用QTabWidget在析构时需要注意的问题

为了实现一个自定义的tab界面,使用QTabWidget和自定义的Tab,逐一将自定义的tab添加到QTabWidget上,并连接了切换tab的信号到自定义的槽函数上。结果在控件析构时软件死机,调试跟踪到在delete控件时出现了segmentfault,经一步调试发现,是在删除自定义tab控件时,本来不应该发射currentIndexChanged信号的,但是却在槽函数里收到了多次信号。仔细分析后,发现在析构时,先逐一删除tab导致每次减少一个tab触发了信号。因此,需要在析构这个控件前,将信号和槽函数断开连接,至此,问题解决。

LiProTabWidget::LiProTabWidget(QWidget *parent) :
    QWidget(parent)
{
    tabWidget = new QTabWidget();
    tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
    tabWidget->setMinimumSize(QSize(400, 0));

    tab1 = new LiProConTable();
    tab1->setObjectName(QString::fromUtf8("tab1"));
    tabWidget->addTab(tab1,QString::fromUtf8("数据配置1"));

    tab2 = new LiProConTable();
    tab2->setObjectName(QString::fromUtf8("tab2"));
    tabWidget->addTab(tab2,QString::fromUtf8("数据配置2"));

    tab3 = new LiProConTable();
    tab3->setObjectName(QString::fromUtf8("tab3"));
    tabWidget->addTab(tab3,QString::fromUtf8("数据配置3"));

    tab4 = new LiProConTable();
    tab4->setObjectName(QString::fromUtf8("tab4"));
    tabWidget->addTab(tab4,QString::fromUtf8("数据配置4"));

    //tabWidget->setCurrentIndex(0);
    connect(tabWidget,SIGNAL(currentChanged(int)),this,SLOT(slotTabChanged(int)));

    connect(tab1,SIGNAL(sigDataBufChanged(int)),this,SLOT(slotDataBufChanged(int)));
    connect(tab2,SIGNAL(sigDataBufChanged(int)),this,SLOT(slotDataBufChanged(int)));
    connect(tab3,SIGNAL(sigDataBufChanged(int)),this,SLOT(slotDataBufChanged(int)));
    connect(tab4,SIGNAL(sigDataBufChanged(int)),this,SLOT(slotDataBufChanged(int)));

    grid = new QGridLayout(this);
    grid->addWidget(tabWidget);

    this->setLayout(grid);
}

LiProTabWidget::~LiProTabWidget()
{
    disconnect(tabWidget,SIGNAL(currentChanged(int)),this,SLOT(slotTabChanged(int)));
    delete tab1;
    delete tab2;
    delete tab3;
    delete tab4;
    delete tabWidget;
}





  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值