Russian Qt Forum
Ноябрь 15, 2024, 10:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими  (Прочитано 9757 раз)
thechicho
Гость
« : Май 25, 2013, 12:26 »

Задача. При нажатии на кнопку страны, выводить список регионов страны из бд. Список выводится в QGroupBox в виде QPushButton.
Надо, чтобы при выводе регионов страны, были только видны новые кнопки с регионами соответствующей страны.

    
Код:
    QGroupBox *groupBoxChoiceRegion = new QGroupBox(dialog);
    groupBoxChoiceRegion->setTitle("Выбор региона:");
    groupBoxChoiceRegion->setObjectName("groupBoxChoiceRegion");

    QGridLayout *gridLayoutChoiceRegion = new QGridLayout(groupBoxChoiceRegion);
    gridLayoutChoiceRegion->setObjectName("gridLayoutChoiceRegion");
    gridLayoutChoiceRegion->setSizeConstraint(QLayout::SetFixedSize);

сделал пока так, при нажатии на "страну" в слоте отрабатывает код:

    
Код:
    QGroupBox *groupBoxChoiceRegion = dialog->findChild<QGroupBox *>("groupBoxChoiceRegion");
    groupBoxChoiceRegion->show();

    QGridLayout *gridLayoutChoiceRegion = dialog->findChild<QGridLayout *>("gridLayoutChoiceRegion");

    QObjectList childrensGroupBoxChoiceRegion = groupBoxChoiceRegion->children();
    foreach (QObject *object, childrensGroupBoxChoiceRegion) {
        if (object->objectName() != "gridLayoutChoiceRegion") {
            QPushButton *pushButton = qobject_cast<QPushButton*>(object);
            pushButton->deleteLater();
        }
    }

    int columnCount = 5;
    for (int i = 0, row = 0, column = 0; i < cities.count(); i++) {
        City city = cities.at(i);
        QPushButton *pushButton = new QPushButton(city.region, groupBoxChoiceRegion);
        if (i%columnCount == 0 && i != 0) {
            row += 1;
            column += columnCount;
        }
        gridLayoutChoiceRegion->addWidget(pushButton, row, i - column);
    }

получаю список детей QGroupBox и удаляю кнопки pushButton->deleteLater();
затем создаются новые кнопки с новыми регионами определенной страны.

вроде работает, но мне не особо нравится решение.
есть ли другие варианты решения проблемы и как вообще правильно удалять видимые виджеты?
« Последнее редактирование: Май 25, 2013, 12:30 от thechicho » Записан
thechicho
Гость
« Ответ #1 : Май 25, 2013, 12:50 »

немного поменял код, чтобы при повторном нажатии на "страну" кнопки заново не формировались

Код:
    QObjectList childrensGroupBoxChoiceRegion = groupBoxChoiceRegion->children();
    qDebug() << endl << "childrensGroupBoxChoiceRegion" << childrensGroupBoxChoiceRegion;
    if (childrensGroupBoxChoiceRegion.count()-1 > 0) {
        QObject *object = childrensGroupBoxChoiceRegion.at(1);
        QPushButton *pushButton = qobject_cast<QPushButton*>(object);
        qDebug() << endl << "pushButton->text()" << pushButton->text();

        if (!cities.isEmpty()) {
            City city = cities.at(0);
            qDebug() << "city.region" << city.region;
            if (pushButton->text() != city.region) {
                foreach (QObject *object, childrensGroupBoxChoiceRegion) {
                    if (object->objectName() != "gridLayoutChoiceRegion") {
                        QPushButton *pushButton = qobject_cast<QPushButton*>(object);
                        pushButton->deleteLater();
                    }
                }
                qDebug() << endl << "childrensGroupBoxChoiceRegion deleteLater()" << childrensGroupBoxChoiceRegion;

                int columnCount = 5;
                for (int i = 0, row = 0, column = 0; i < cities.count(); i++) {
                    City city = cities.at(i);
                    QPushButton *pushButton = new QPushButton(city.region, groupBoxChoiceRegion);
                    //connect(pushButton, SIGNAL(clicked()), this, SLOT(selectRegion()));
                    //gridLayoutChoiceRegion->addWidget(pushButton);
                    if (i%columnCount == 0 && i != 0) {
                        row += 1;
                        column += columnCount;
                    }
                    gridLayoutChoiceRegion->addWidget(pushButton, row, i - column);
                }
                qDebug() << endl << "groupBoxChoiceRegion posle" << groupBoxChoiceRegion->children();
            }
        } else {
            foreach (QObject *object, childrensGroupBoxChoiceRegion) {
                if (object->objectName() != "gridLayoutChoiceRegion") {
                    QPushButton *pushButton = qobject_cast<QPushButton*>(object);
                    pushButton->deleteLater();
                }
            }
            qDebug() << endl << "childrensGroupBoxChoiceRegion deleteLater()" << childrensGroupBoxChoiceRegion;
        }
    } else {
        int columnCount = 5;
        for (int i = 0, row = 0, column = 0; i < cities.count(); i++) {
            City city = cities.at(i);
            QPushButton *pushButton = new QPushButton(city.region, groupBoxChoiceRegion);
            //connect(pushButton, SIGNAL(clicked()), this, SLOT(selectRegion()));
            //gridLayoutChoiceRegion->addWidget(pushButton);
            if (i%columnCount == 0 && i != 0) {
                row += 1;
                column += columnCount;
            }
            gridLayoutChoiceRegion->addWidget(pushButton, row, i - column);
        }
        qDebug() << endl << "groupBoxChoiceRegion posle" << groupBoxChoiceRegion->children();
    }

в принципе код делает то, чего я и хотел
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Май 29, 2013, 17:35 »

немного не понятно. есть ли смысл делать для каждой страны кнопку, или проще создать свою модель и загнать в QTableView/QListView? Не нужно так извращаться.
Записан
thechicho
Гость
« Ответ #3 : Май 29, 2013, 19:09 »

вопрос то был как правильно удалять видимые виджеты.
решение
Код:
    QPushButton *pushButton = qobject_cast<QPushButton*>(object);
pushButton->deleteLater();

модель нужна же для того, чтобы изменения в бд вносились автоматически при редактировании таблицы?

//QTableView/QListView? Не нужно так извращаться.
как бы вы сделали такое с помощью QTableView/QListView?
« Последнее редактирование: Май 29, 2013, 19:11 от thechicho » Записан
thechicho
Гость
« Ответ #4 : Май 29, 2013, 19:10 »

(Максимум вложений на одно сообщение: 4)
Записан
Странник
Гость
« Ответ #5 : Май 30, 2013, 08:18 »

почему не выводить список регионов списком (QListView) с возможностью поиска по этому самому списку? как вы думаете, пользователю легко и удобно ориентироваться в вашей простыне кнопок и искать нужный ему регион? это и к БД прикручивается удобней и естественней.
« Последнее редактирование: Май 30, 2013, 08:20 от Странник » Записан
thechicho
Гость
« Ответ #6 : Май 30, 2013, 08:27 »

да, легко и удобно.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Май 30, 2013, 10:33 »

да, легко и удобно.

facepalm
Записан
thechicho
Гость
« Ответ #8 : Май 30, 2013, 10:49 »

//facepalm
а конкретннее?

на последнем скрине видно к чему все это.
если вам удобнее ручной поиск по списку, то это ваши проблемы)
мне удобнее сделать несколько кликов.
Записан
Bepec
Гость
« Ответ #9 : Май 30, 2013, 10:53 »

Найти среди 50 кнопок нужную сложнее, чем среди 50 позиций списка. Это аксиома Веселый
Записан
thechicho
Гость
« Ответ #10 : Май 30, 2013, 11:04 »

вам на сайте тоже было бы удобнее ориентироваться, если бы все ссылки были в виде списка Улыбающийся
Записан
Странник
Гость
« Ответ #11 : Май 30, 2013, 11:15 »

вам на сайте тоже было бы удобнее ориентироваться, если бы все ссылки были в виде списка Улыбающийся
часто вы на сайте видели меню, в котором полсотни пунктов? Х )
Записан
Bepec
Гость
« Ответ #12 : Май 30, 2013, 11:30 »

Вы зайдите на любой сайт оптопродаж. Там список более 100 пунктов, НО... Но в нём я легко найду то что нужно.

PS и да, заметь - ссылки расположены в виде  списка. Часть вертикальный список, часть горизонтальный список.
Записан
thechicho
Гость
« Ответ #13 : Май 30, 2013, 11:32 »

 Улыбающийся я не вижу никакой проблемы с поиском нужной страны, региона, города, метро в своей реализации. все запросто выбирается в несколько кликов.
хотя, если хотите, можете нарисовать как бы это выглядело в виде списка в вашей реализации. возможно, кому-то это покажется интересным)
Записан
thechicho
Гость
« Ответ #14 : Май 30, 2013, 11:34 »

// Часть вертикальный список, часть горизонтальный список
у меня примерно так и сделано)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 23.