Как заставить виджет изменить размер вместе с его родительским TabWidget - с кодом - PullRequest
0 голосов
/ 21 апреля 2020

Я посмотрел в каждой теме, и ни один из них не работает. некоторые из них обсуждают это с помощью Qt Designer (что я уже знаю, как делать, но это бесполезно, потому что вкладки добавляются динамически). некоторые из них обсуждают, как сделать это с помощью кода, но все еще ничего не работает.

Важный код находится внутри appendTab ():

TabWidgetCSD::TabWidgetCSD(QWidget *parent)
    : QTabWidget(parent)
{
    TabBarCSD* bar = new TabBarCSD();
    setTabBar(bar);

    // create absolute button to the right. it will change the position everytime something happens
    // and it will  will take the last index
    QIcon icon(svgToColorIcon(":/images/plus.svg"));
    openTabBtn = new QPushButton(icon, "", this);
    openTabBtn->setFlat(true);
    openTabBtn->setFixedSize(QSize(29, 29));
    openTabBtn->setIconSize(QSize(25, 25));
    connect(openTabBtn, &QPushButton::clicked, this, [=, this](){
        appendTab();
    });
    appendTab();
}


void TabWidgetCSD::appendTab()
{
    // create page and get it's index
    auto l = new QVBoxLayout();
    auto mainMenuForm = new MainMenuForm;
    l->addWidget(mainMenuForm);
    setLayout(l);
    auto tabIdx = addTab(mainMenuForm, "");


    QIcon icon(svgToColorIcon(":/images/times.svg"));
    QLabel* label = new QLabel;
    label->setText("Main Window");
    label->setAlignment(Qt::AlignCenter);
    label->setFixedWidth(175);
    auto btn = new QPushButton(icon, "");
    btn->setFlat(true);
    btn->connect(btn, &QPushButton::clicked, this, [=, this]() {
        removeTab(tabIdx);
    });
    auto hbox = new QHBoxLayout();
    hbox->setAlignment(Qt::AlignCenter);
    hbox->addWidget(label);
    hbox->addWidget(btn);
    auto wrapper = new QWidget();
    wrapper->setLayout(hbox);
    wrapper->setFixedSize(220, 30);

    tabBar()->setTabButton(tabIdx, QTabBar::LeftSide, wrapper);
}

1 Ответ

1 голос
/ 21 апреля 2020

Ваша проблема здесь:

    auto l = new QVBoxLayout();
    auto mainMenuForm = new MainMenuForm;
    l->addWidget(mainMenuForm);
    setLayout(l);
    auto tabIdx = addTab(mainMenuForm, "");

Я не знаю, хотите ли вы установить макет l на mainMenuForm, но я совершенно уверен, что вы не хотите устанавливать это при вызове TabWidgetCSD (который я предполагаю QTabWidget) для каждой добавленной вкладки. Возможно все, что вам нужно, это

    auto tabIdx = addTab(new MainMenuForm, "");

(и если вам действительно нужно добавить макет на MainMenuForm, вы добавите его в MainMenuForm c 'tor) .

...