crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Удаление элемента в QGridLayout
ruzik
  опции профиля:
сообщение 26.6.2011, 23:16
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


Здравствуйте, у меня есть QGridLayout, я хочу что бы при определенных обстоятельствах вся строка этого слоя стиралась и туда вставлялась одна кнопка, все вроде работает, кроме стирания, хотя по смыслу должно, документация по этому поводу вроде молчит
            for(int b=0;b<10;b++)
                gridLayout->addWidget(new QWidget,1,b);
            QPushButton * pb = new QPushButton;
            gridLayout->addWidget(pb, 1, a+5);

Заранее спасибо за помощь!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.6.2011, 6:02
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ruzik @ 27.6.2011, 2:16) *
этого слоя
что за слой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 27.6.2011, 9:52
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


QGridLayout - это слой-таблица и хочу что бы в одной строке, а именно первой все элементы стерлись(заменить на QWidget), а потом в один из этих элементов заменить на кнопку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.6.2011, 18:02
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ruzik @ 27.6.2011, 12:52) *
QGridLayout - это слой-таблица
откуда взялось слово слой? Найди в любом словаре перевод слова Layout
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 27.6.2011, 20:06
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


Наверно, просто привык так.
Так все-таки как это сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.6.2011, 6:07
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Если ты правильно переводишь - ты меньше путаешься.
Layout - компоновщик.

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

Т.е. можно поступить так, как описано тут

так же пригодятся:
QWidget * QLayoutItem::widget () [virtual]
void QLayout::removeWidget ( QWidget * widget )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 28.6.2011, 11:14
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


Попробовал, работает не так
            QLayoutItem *child;
            while ((child = gridLayout->takeAt(10)) != 0) {
                    delete child;
            }

У меня gidLayout в котором 2 строки и 10 столбцов и мне надо очищать всю вторую строку, но получается, как на картинках
Может будет понятнее если я приведу весь нужный код, он добавляет в gridLayout виджеты с цветами = оттенками текущего, кончено код достаточно громосткий и надеюсь что получиться разобраться в проблеме не разбираясь в самом коде
void RShadesColorView::setColorsInView(QString colorName)
{
    RizekColorManager * rcm;
    rcm = qobject_cast<RizekColorManager*>(parent()->parent()->parent()->parent()->parent());
    QColor c(colorName);
    int r = c.red();
    int g = c.green();
    int b = c.blue();
    //Измежание "вылетов" за границы
    if (r>=246)
        r = 245;
    if (r<=9)
        r=10;
    if (g>=246)
        g = 245;
    if (g<=9)
        g=10;
    if (b>=246)
        b = 245;
    if (b<=9)
        b=10;
    //Сам алгоритм
    for (int a=-5;a<5;a++)
    {
        RColorItemWidget * w = new RColorItemWidget;
        w->setVisible(false);
        QPalette * p = new QPalette;
        p->setColor(QPalette::Background, QColor::fromRgb(r+2*a,g+2*a,b+2*a));
        w->setFixedHeight(17);
        w->setFixedWidth(17);
        w->setAutoFillBackground(true);
        w->setPalette(*p);
        w->setToolTip(QColor::fromRgb(r+2*a,g+2*a,b+2*a).name());
        w->setColorName(QColor::fromRgb(r+2*a,g+2*a,b+2*a).name());
        connect(w, SIGNAL(clicked(QString)), rcm, SLOT(setRgbHslHsvCmykByColorName(QString)));
        gridLayout->addWidget(w,0,a+5);
        if (c.toRgb() == QColor::fromRgb(r+2*a,g+2*a,b+2*a))
        {
            QLayoutItem *child;
            while ((child = gridLayout->takeAt(10)) != 0)
                    delete child;
            QPushButton * pb = new QPushButton;
            pb->setFixedHeight(17);
            pb->setFixedWidth(17);
            pb->setProperty("isColorPointer", true);
            gridLayout->addWidget(pb, 1, a+5);
        }
        w->show();
    }
}

RColorItemWidget это наследник обычного виджета(QWidget)

Сообщение отредактировал ruzik - 28.6.2011, 11:16
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 29.6.2011, 6:53
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Поигрался с удалением виджетов. Виджеты то удаляются все хорошо, но от них остается "след". QHBoxLayout размещает на себе 4 QLabel'а c текстом. и по нажатии кнопки, предыдущие удаляются, новые создаются. Если размещать на лэйауте нечто иное, а не QLabel, например кнопки, то все работает как часы.

2ruzik: А нельзя обойтись без удаления виджета? почему бы не заменить у него такое свойство как ЦВЕТ?

Сообщение отредактировал silver47 - 29.6.2011, 7:01
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ruzik
  опции профиля:
сообщение 29.6.2011, 11:49
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 254
Регистрация: 23.2.2011
Из: Саратов
Пользователь №: 2436

Спасибо сказали: 2 раз(а)




Репутация:   0  


QGridLayout разбит как бы на 2 части:
верхняя, с цветами, там я и заменяю цвет и она работает нормально, без нижней части
а нижняя часть - это часть стрелки, стрелка указывает на исходный цвет среди оттенков из которых были получены оттенки, соответственно при изменении текущего цвета, стрелка вполне возможно будет указывать на другой цвет, соответственно нужно удалить все элементы нижней части и вставить стрелку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 29.6.2011, 12:29
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


Мда. Тоже самое. При удалении элемента, он удаляется, но остается, по прежнему, виден.

Сообщение отредактировал silver47 - 29.6.2011, 12:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.7.2020, 15:11