Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: thechicho от Май 25, 2013, 12:26



Название: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: 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();
затем создаются новые кнопки с новыми регионами определенной страны.

вроде работает, но мне не особо нравится решение.
есть ли другие варианты решения проблемы и как вообще правильно удалять видимые виджеты?


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 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();
    }

в принципе код делает то, чего я и хотел


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Fregloin от Май 29, 2013, 17:35
немного не понятно. есть ли смысл делать для каждой страны кнопку, или проще создать свою модель и загнать в QTableView/QListView? Не нужно так извращаться.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 29, 2013, 19:09
вопрос то был как правильно удалять видимые виджеты.
решение
Код:
    QPushButton *pushButton = qobject_cast<QPushButton*>(object);
pushButton->deleteLater();

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

//QTableView/QListView? Не нужно так извращаться.
как бы вы сделали такое с помощью QTableView/QListView?


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 29, 2013, 19:10
(Максимум вложений на одно сообщение: 4)


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Странник от Май 30, 2013, 08:18
почему не выводить список регионов списком (QListView) с возможностью поиска по этому самому списку? как вы думаете, пользователю легко и удобно ориентироваться в вашей простыне кнопок и искать нужный ему регион? это и к БД прикручивается удобней и естественней.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 08:27
да, легко и удобно.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Авварон от Май 30, 2013, 10:33
да, легко и удобно.

facepalm


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 10:49
//facepalm
а конкретннее?

на последнем скрине видно к чему все это.
если вам удобнее ручной поиск по списку, то это ваши проблемы)
мне удобнее сделать несколько кликов.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Bepec от Май 30, 2013, 10:53
Найти среди 50 кнопок нужную сложнее, чем среди 50 позиций списка. Это аксиома :D


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 11:04
вам на сайте тоже было бы удобнее ориентироваться, если бы все ссылки были в виде списка :)


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Странник от Май 30, 2013, 11:15
вам на сайте тоже было бы удобнее ориентироваться, если бы все ссылки были в виде списка :)
часто вы на сайте видели меню, в котором полсотни пунктов? Х )


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Bepec от Май 30, 2013, 11:30
Вы зайдите на любой сайт оптопродаж. Там список более 100 пунктов, НО... Но в нём я легко найду то что нужно.

PS и да, заметь - ссылки расположены в виде  списка. Часть вертикальный список, часть горизонтальный список.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 11:32
 :) я не вижу никакой проблемы с поиском нужной страны, региона, города, метро в своей реализации. все запросто выбирается в несколько кликов.
хотя, если хотите, можете нарисовать как бы это выглядело в виде списка в вашей реализации. возможно, кому-то это покажется интересным)


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 11:34
// Часть вертикальный список, часть горизонтальный список
у меня примерно так и сделано)


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Bepec от Май 30, 2013, 12:08
У вас квадратно гнездовое насаждение :D


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: kambala от Май 30, 2013, 12:17
предложи бета-тестерам два варианта и спроси какой им больше нравится. то, что на картинке щас — выглядит печально (кнопки даже не в алфавитном порядке).


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Странник от Май 30, 2013, 12:23
предложи бета-тестерам два варианта и спроси какой им больше нравится. то, что на картинке щас — выглядит печально (кнопки даже не в алфавитном порядке).
в алфавитном по столбцам, но это мало что меняет. интерфейс для мышкоморов, что сказать.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 12:30
ценители прекрасного :D
была задача, задача решена. решение меня устраивает.
нарисуйте свой вариант, возможно если передо мной встанет такая же задача в будущем, я использую ваш вариант.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: Странник от Май 30, 2013, 12:32
ценители прекрасного :D
была задача, задача решена. решение меня устраивает.
нарисуйте свой вариант, возможно если передо мной встанет такая же задача в будущем, я использую ваш вариант.
просто интересен ваш способ решения задач, вдруг действительно жемчужина и в жизни пригодится. допустим, я знаю, что мне нужна станция метро Баррикадная, город Москва, Российская Федерация, Европа, Евразия, планета Земля, Солнечная система, галактика Млечный путь. мне обязательно проходить все дерево с начала до конца вместо того, чтобы сразу найти эту несчастную Баррикадную? от такой жизни сам на баррикады пойдешь..


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 12:59
эта задача - одна кнопка в проекте, при нажатию на которую открывается такой диалог. эта опция может быть вообще не использована, либо будет использоваться редко. вы видите проблему там, где ее нет.


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: GreatSnake от Май 30, 2013, 20:38
вы видите проблему там, где ее нет.
Есть правило - коли взялся за GUI - делай всё продуманно и юзабельно независимо от частоты использования.
Когда московские станции раскиданы на 4 экрана да ещё в названии каждой в начале стоит м., то складывается впечатление, что автор просто ненавидит будущих пользователей своей поделки :(


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: thechicho от Май 30, 2013, 20:45
скажу вам по секрету, эти станции вряд ли когда-либо будут выбраны. о чем можно было догадаться из контекста последнего моего сообщения.
я уже сказал, нарисуйте ваши варианты и я с удовольствием ознакомлюсь с ними и возможно использую, если опять встанет такая задача. я просто не вижу смысла в ваших сообщениях. мне то какое дело, что вам не нравится :)


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: GreatSnake от Май 30, 2013, 20:51
я уже сказал, нарисуйте ваши варианты и я с удовольствием ознакомлюсь с ними и возможно использую, если опять встанет такая задача.
даже не смешно


Название: Re: Удаление динамически создаваемых виджетов (QPushButton) при замене их другими
Отправлено: xokc от Май 31, 2013, 08:43
то складывается впечатление, что автор просто ненавидит будущих пользователей своей поделки :(
Подозреваю, что это чувство будет взаимным.