crossplatform.ru

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


  Ответ в Удаление элемента в QGridLayout
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
vizir1989 Дата 14.5.2012, 11:03
  Я делал так, чтобы очистить полностью QGridLayout:
    while ((child = Layout_->takeAt(0)) != 0)
    {
        if (child->widget())
            delete child->widget();
        if (child->layout())
            delete child->layout();
        delete child;    
    }

Litkevich Yuriy Дата 30.6.2011, 6:15
 
Цитата(ruzik @ 30.6.2011, 1:47) *
если объект засунуть в другой layout или в другое место того же самого, то он удалиться из старого места автоматически
...
хотя если честно всегда думал что в таком случае в другой layout будет засовываться копия объекта
В Qt нет копирования наследников QObject, это не тривиальная задача.
ruzik Дата 29.6.2011, 22:47
  После долгих мучений проблема решена, я сделал это так:
если объект засунуть в другой layout или в другое место того же самого, то он удалиться из старого места автоматически, как ни странно решение оказалось довольно простым, хотя если честно всегда думал что в таком случае в другой layout будет засовываться копия объекта с указателем на него
Большое всем спасибо за помощь!
P.S. кстати deleteLater() то же работал но после 3-4 нажатий ничего не случалось, то есть объект добавлялся, а старый не удалялся, а после еще 2-3 кликов опять все работало
MoPDoBoPoT Дата 29.6.2011, 21:46
  В иходниках самих тролей, при удалении виджета, я наблюдал связку вызовов hide() и deleteLater()
silver47 Дата 29.6.2011, 13:06
  У меня есть решение, но оно "индусское". Подождем чего посоветуют более старшие товарищи :)
RazrFalcon Дата 29.6.2011, 12:52
 
Цитата(silver47 @ 29.6.2011, 6:53) *
Поигрался с удалением виджетов. Виджеты то удаляются все хорошо, но от них остается "след".

Во-во. У меня так же было.
silver47 Дата 29.6.2011, 12:29
  Мда. Тоже самое. При удалении элемента, он удаляется, но остается, по прежнему, виден.
ruzik Дата 29.6.2011, 11:49
  QGridLayout разбит как бы на 2 части:
верхняя, с цветами, там я и заменяю цвет и она работает нормально, без нижней части
а нижняя часть - это часть стрелки, стрелка указывает на исходный цвет среди оттенков из которых были получены оттенки, соответственно при изменении текущего цвета, стрелка вполне возможно будет указывать на другой цвет, соответственно нужно удалить все элементы нижней части и вставить стрелку
silver47 Дата 29.6.2011, 6:53
  Поигрался с удалением виджетов. Виджеты то удаляются все хорошо, но от них остается "след". QHBoxLayout размещает на себе 4 QLabel'а c текстом. и по нажатии кнопки, предыдущие удаляются, новые создаются. Если размещать на лэйауте нечто иное, а не QLabel, например кнопки, то все работает как часы.

2ruzik: А нельзя обойтись без удаления виджета? почему бы не заменить у него такое свойство как ЦВЕТ?
ruzik Дата 28.6.2011, 11:14
  Попробовал, работает не так
            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)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 16:05