C++ 奇怪的行为

C++ 奇怪的行为,c++,qt,qt5,qpushbutton,qtabwidget,C++,Qt,Qt5,Qpushbutton,Qtabwidget,我有两个选项卡,其中放置了QTableWidget和cell widget。参见图 QTabWidget *tab = new QTabWidget(this); for (int i = 0; i < 2; ++i) { QTableWidget *t = new QTableWidget(1, 1); QPushButton *btn = new QPushButton("Click on me!"); t->setCellWidget(0, 0, b

我有两个选项卡,其中放置了QTableWidget和cell widget。参见图

QTabWidget *tab = new QTabWidget(this);
for (int i = 0; i < 2; ++i) {
    QTableWidget *t = new QTableWidget(1, 1);

    QPushButton *btn = new QPushButton("Click on me!");

    t->setCellWidget(0, 0, btn);
    connect(btn, &QPushButton::clicked, [=]() {
        btn->hide();
    });
    tab->addTab(t, QString::number(i + 1));
}
setCentralWidget(tab);

QTabWidget*tab=新的QTabWidget(此);
对于(int i=0;i<2;++i){
QTableWidget*t=新的QTableWidget(1,1);
QPushButton*btn=新的QPushButton(“点击我!”);
t->setCellWidget(0,0,btn);
连接(btn,&QPushButton::单击,[=](){
btn->hide();
});
tab->addTab(t,QString::number(i+1));
}
setCentralWidget(选项卡);

您指出的行为是可预测的,您必须首先知道,如果小部件可见,您的孩子也将可见

让我们分析一下QTabWidget的情况,这个小部件本质上是一个QTabBar+QStackedWidget,QStackedWidget管理小部件的可见性,而QStackedWidget内部有一个QStackedLayout,当它确定某个小部件要显示时,它会隐藏当前小部件并显示新的当前小部件。因此,每当您选择tabbar时,显示的小部件将调用该小部件的show方法(在您的例子中是QTableWidget),并且它将使您的孩子可见,即使他们是隐藏的

因此,如果您希望这样做,如果您有这样的需要,即假设应该发生一种解决方法,则需要在属性和showEvent方法中保存可见性的状态,以便在必要时应用更改