Programming/Qt

[Qt] 레이아웃에 있는 위젯 교체하기(replaceWidget)

_SYPark 2023. 12. 6. 11:28
728x90

Combobox에 따라 Layout에 있는 Label을 바꾸려고 합니다. Combobox에 index가 바뀌면 replaceWidget 함수를 호출하도록 작성했습니다.

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLabel* pLabel = new QLabel("test1");
    QLabel* pLabel2 = new QLabel("test2");

    labelList.append(pLabel);
    labelList.append(pLabel2);

    ui->comboBox->addItem(pLabel->text(), 0);
    ui->comboBox->addItem(pLabel2->text(),1);

    ui->verticalLayout->addWidget(pLabel);
    pCurrent = pLabel;
    connect(ui->comboBox, &QComboBox::currentIndexChanged, [&] (int index) {
        auto label = labelList.value(index);
        ui->verticalLayout->replaceWidget(pCurrent, label);
        pCurrent = label;
    });
}

그런데 실제로 Replace 해보면 이전의 Widget이 남아 있습니다.

이럴 경우에는 2가지 해결 방법이 있습니다. 이전의 widget을 delete 시키는 방법과 기존 parent를 없애는 방법입니다.

하지만 delete를 하는 방식의 큰 문제는 위와 같이 교체된 widget도 나중에 사용해야 하는 경우에는 맞지 않습니다. 이럴 때는 교체된 widget의 Parent를 0으로 넘겨주면 됩니다.

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLabel* pLabel = new QLabel("test1");
    QLabel* pLabel2 = new QLabel("test2");

    labelList.append(pLabel);
    labelList.append(pLabel2);

    ui->comboBox->addItem(pLabel->text(), 0);
    ui->comboBox->addItem(pLabel2->text(),1);

    ui->verticalLayout->addWidget(pLabel);
    pCurrent = pLabel;
    connect(ui->comboBox, &QComboBox::currentIndexChanged, [&] (int index) {
        auto label = labelList.value(index);
        ui->verticalLayout->replaceWidget(pCurrent, label);
        pCurrent->setParent(0);
        pCurrent = label;
    });
}

728x90