QTabWidget странное поведение - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть две вкладки, где размещены QTableWidget с виджетом ячейки.См. Изображение.

Problem

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);

1 Ответ

0 голосов
/ 30 ноября 2018

Поведение, которое вы указываете, предсказуемо, вы должны сначала знать, что если виджет станет видимым, ваши дети также будут видны.

Давайте проанализируем случай QTabWidget, этот виджет по сути является QTabBar + QStackedWidget,QStackedWidget управляет видимостью виджетов, и последний внутренне имеет QStackedLayout, который, когда он устанавливает, что определенный виджет должен отображаться, скрывает текущий виджет и показывает новый текущий виджет.Поэтому каждый раз, когда вы выбираете панель вкладок, отображаемый виджет будет вызывать метод show этого виджета (в вашем случае QTableWidget), и он сделает ваших детей видимыми, даже если они скрыты.

Так что если вы хотите, чтобы этоесли у вас есть потребность, которая работает так, как вы предполагаете, что обходной путь должен произойти, это сохранить состояние видимости в свойстве и в методе showEvent, чтобы применить изменения, если это необходимо.

...