Russian Qt Forum

Qt => Общие вопросы => Тема начата: niag от Август 15, 2011, 12:27



Название: cкрыть и показать лэйауты
Отправлено: niag от Август 15, 2011, 12:27
всем привет!

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

Код
C++ (Qt)
void theClass::hideLayout(QLayout *layout) {
   QLayoutItem *wItem;
   while ((wItem = layout->takeAt(0)) != 0) {
       if (!wItem->layout()) {
           wItem->widget()->hide();
       }
   }
}

Код
C++ (Qt)
void theClass::showLayout(QLayout *layout) {
   QLayoutItem *wItem;
   wItem = layout->takeAt(0);
   while ((wItem) != 0) {
       if (!wItem->layout()) {
           wItem->widget()->show();
       }
   }
}

причем при вызове layout->count() в функции showLayout() возвращается 0, что я нашел очень странным.
что я делаю не так?


Название: Re: cкрыть и показать лэйауты
Отправлено: GreatSnake от Август 15, 2011, 12:42
А не проще ли будет создать виджет, поместить на него лейаут и уже потом показывать/прятать только этот виджет?


Название: Re: cкрыть и показать лэйауты
Отправлено: Пантер от Август 15, 2011, 12:43
Цитировать
QLayoutItem * QLayout::takeAt ( int index ) [pure virtual]
Must be implemented in subclasses to remove the layout item at index from the layout, and return the item.
Ты же удаляешь виджет из лайота.


Название: Re: cкрыть и показать лэйауты
Отправлено: niag от Август 15, 2011, 12:56
мда, действительно... как-то совсем глупо вышло. в любом случае, спасибо

Цитировать
создать виджет, поместить на него лейаут
чего-чего простите? первый раз о таком слышу (видимо из-за того, что нуб :D)


Название: Re: cкрыть и показать лэйауты
Отправлено: Рома от Август 15, 2011, 22:19
Вот. Я несколько дней назад уже выставлял этот код, но думаю, что тебе он может очень помочь (здесь не нужно создавать две разные кнопки, и поочередно делать их невидимыми, только вместо второго лэйоута используется QgroupBox)
Код:
#include "qmywidg.h"
#include <QPushButton>
#include <QLineEdit>
#include <QTextEdit>
#include <QLCDNumber>
#include <QLayout>
#include <QGroupBox>

QMyWidg::QMyWidg(QWidget *parent)
    : QWidget(parent)
{
    QVBoxLayout *main_layout = new QVBoxLayout;
    QPushButton *btn = new QPushButton("Click");
    btn->setCheckable(true);
    main_layout->addWidget(btn);
    QVBoxLayout *second_layout = new QVBoxLayout;
    QLineEdit *le = new QLineEdit("Text");
    QLCDNumber *lcdn = new QLCDNumber;
    QTextEdit *te = new QTextEdit;
    second_layout->addWidget(le);
    second_layout->addWidget(lcdn);
    second_layout->addWidget(te);
    QGroupBox *gbox = new QGroupBox;
    gbox->setLayout(second_layout);
    main_layout->addWidget(gbox);
    setLayout(main_layout);
    connect(btn,SIGNAL(toggled(bool)),gbox,SLOT(setVisible(bool)));
}

QMyWidg::~QMyWidg()
{

}