Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2013, 02:09   #1
Klafen
 
Регистрация: 14.06.2013
Сообщений: 9
Вопрос Qt 5.1 Очистка формы

Суть программы в следующем:
Построить бинарное дерево, элементы дерева задаются рандомом.
Я делал так:
Первый элемент дерева толкал в лабел, созданный динамически, и размешал его по нужным координатам.
Когда генерируется следующий элемент, то если он больше предыдущего, то достаиваем его в правую ветвь, если меньше, что в левую, если ветвь занята, то сравниваем её с текущим значением в ветви и опять двигаем на уровень ниже, и так пока не дойдем до конца ветви.
Достройка осуществляется добавлением нового лебла на месте того, с которым сравнивали и смешением его координат на заданное число, в нужную сторону (вниз на уровень и либо влевоб либо в право)

получается примерно следующая структура (связи между уровнями также отображаются с помощью лаблов с символами / и \)

например последовательность символов 2 8 4 3 1 7 9 10 (повторения игнорируются)
Код:
            2
          /   \
        1      8
              /   \
             4     9
           /   \     \
         3      7    10
Вылезло 2 проблемы:
1. Как удалить эти динамически созданные лаблы при следующем запуске процедуры формирования и построения дерева? (новые лаблы размещаются прямо поверх старых).Есть ли какая-то функция для перерисовки, или перезагрузки формы из ui файла, созданного в дизайнере?
2. При другой последовательности значений (у нас же рандом), бывает так, что по одним и тем же координатам нужно поставить сразу 2 элемента, как этого избежать? Пример для наглядности:
5 2 8 4 3 1 7 9 10
Код:
            5
          /   \
        2      8
      /    \  /   \
     1     4 7     9
           /         \
         3            10
у 4-ки и 7-ки координаты совпадают, т.к. смещение по координатам для каждого нового лабла происходит на равные значения, как влево, так и вправо, ровно на половину от расстояния между дочерними элементами одной ветви (чтобы симметричное дерево было)
Klafen вне форума Ответить с цитированием
Старый 07.12.2013, 02:10   #2
Klafen
 
Регистрация: 14.06.2013
Сообщений: 9
По умолчанию

Блин все деревья съехали=( а я старался выравнивал=(
Klafen вне форума Ответить с цитированием
Старый 07.12.2013, 02:11   #3
Klafen
 
Регистрация: 14.06.2013
Сообщений: 9
По умолчанию

О теперь норм=)
Klafen вне форума Ответить с цитированием
Старый 07.12.2013, 14:49   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я бы на Вашем месте создал пустой проект (без привлечения дизайнера)

New Project -> Other Project -> Empty Qt Project

Создал бы таблицу QGridLayout из элементов QLabel.

При нажатии кнопки удалял бы текущий Layout со всем содержимым. Вот здесь код нашёл: http://stackoverflow.com/questions/7...ut-on-a-widget

Код:
void RemoveLayout (QLayout *layout)
{
    // completely delete layout and sublayouts
    QLayoutItem * item;
    QLayout * sublayout;
    QWidget * widget;
    while ((item = layout->takeAt(0))) {
        if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/}
        else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;}
        else {delete item;}
    }

    // then finally
    delete layout;
}
И формировал бы новый QGridLayout. Ваше дерево же можно с помощью таблицы QLabel сделать?

Вот так:

Код:
   |          2        |
   |    /    ||    \   |
   |    1    ||    8   |
Код:
   |               2                   |
   |      /       ||          \        |
   |      1       ||          8        |
   |              ||    /    ||    \   |
   |              ||    4    ||    9   |

Интересно стало... Пример написал

До нажатия на кнопку:


После нажатия на кнопку:


Вот код примера. Надеюсь это поможет Правда не знаю, может дерево искривится сильно, если будет большое..., а может нет

GenerationOfTree.pro
Код:

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

HEADERS += \
    dialog.h

SOURCES += \
    dialog.cpp \
    main.cpp
dialog.h
Код:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QGridLayout>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);

signals:

private slots:
    void on_bntCreateLabel_clicked();

private:
    QGridLayout *mainLayout;
};

#endif // DIALOG_H

Последний раз редактировалось 8Observer8; 07.12.2013 в 14:51.
8Observer8 вне форума Ответить с цитированием
Старый 07.12.2013, 14:50   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

dialog.cpp
Код:
#include "dialog.h"
#include <QLabel>
#include <QPushButton>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent)
{
    // Widgets
    QPushButton *bntCreateLabel = new QPushButton("Generate Tree");
    QLabel *lbl_1 = new QLabel("2");
    lbl_1->setAlignment(Qt::AlignCenter);

    QLabel *lbl_2 = new QLabel("/");
    lbl_2->setAlignment(Qt::AlignCenter);

    QLabel *lbl_3 = new QLabel("\\");
    lbl_3->setAlignment(Qt::AlignCenter);

    QLabel *lbl_4 = new QLabel("1");
    lbl_4->setAlignment(Qt::AlignCenter);

    QLabel *lbl_5 = new QLabel("8");
    lbl_5->setAlignment(Qt::AlignCenter);

    // Layouts
    mainLayout = new QGridLayout;
    mainLayout->addWidget(bntCreateLabel, 0, 0, 1, 2);
    mainLayout->addWidget(lbl_1, 1, 0, 1, 2);
    mainLayout->addWidget(lbl_2, 2, 0);
    mainLayout->addWidget(lbl_3, 2, 1);
    mainLayout->addWidget(lbl_4, 3, 0);
    mainLayout->addWidget(lbl_5, 3, 1);
    setLayout(mainLayout);

    // Connetions
    connect(bntCreateLabel, SIGNAL(clicked()), SLOT(on_bntCreateLabel_clicked()));
}

void RemoveLayout (QLayout *layout)
{
    // completely delete layout and sublayouts
    QLayoutItem * item;
    QLayout * sublayout;
    QWidget * widget;
    while ((item = layout->takeAt(0))) {
        if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/}
        else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;}
        else {delete item;}
    }

    // then finally
    delete layout;
}

void Dialog::on_bntCreateLabel_clicked()
{
    RemoveLayout(mainLayout);

    QPushButton *bntCreateLabel = new QPushButton("Generate Tree");
    QLabel *lbl_1 = new QLabel("2");
    lbl_1->setAlignment(Qt::AlignCenter);

    QLabel *lbl_2 = new QLabel("/");
    lbl_2->setAlignment(Qt::AlignCenter);

    QLabel *lbl_3 = new QLabel("\\");
    lbl_3->setAlignment(Qt::AlignCenter);

    QLabel *lbl_4 = new QLabel("1");
    lbl_4->setAlignment(Qt::AlignCenter);

    QLabel *lbl_5 = new QLabel("8");
    lbl_5->setAlignment(Qt::AlignCenter);

    QLabel *lbl_6 = new QLabel("");
    lbl_6->setAlignment(Qt::AlignCenter);

    QLabel *lbl_7 = new QLabel("/");
    lbl_7->setAlignment(Qt::AlignCenter);

    QLabel *lbl_8 = new QLabel("\\");
    lbl_8->setAlignment(Qt::AlignCenter);

    QLabel *lbl_9 = new QLabel("");
    lbl_9->setAlignment(Qt::AlignCenter);

    QLabel *lbl_10 = new QLabel("4");
    lbl_10->setAlignment(Qt::AlignCenter);

    QLabel *lbl_11 = new QLabel("9");
    lbl_11->setAlignment(Qt::AlignCenter);

    // Layouts
    mainLayout = new QGridLayout;
    mainLayout->addWidget(bntCreateLabel, 0, 0, 1, 3); // button
    mainLayout->addWidget(lbl_1, 1, 0, 1, 3); // "2"
    mainLayout->addWidget(lbl_2, 2, 0); // "/"
    mainLayout->addWidget(lbl_3, 2, 1, 1, 2); // "\"
    mainLayout->addWidget(lbl_4, 3, 0); // "1"
    mainLayout->addWidget(lbl_5, 3, 1, 1, 2); // "8"
    mainLayout->addWidget(lbl_6, 4, 0); // " "
    mainLayout->addWidget(lbl_7, 4, 1, 1, 2); // "/"
    mainLayout->addWidget(lbl_8, 4, 2, 1, 2); // "\"
    mainLayout->addWidget(lbl_9, 5, 0); // " "
    mainLayout->addWidget(lbl_10, 5, 1, 1, 2); // "4"
    mainLayout->addWidget(lbl_11, 5, 2, 1, 2); // "9"
    setLayout(mainLayout);

    // Connetions
    connect(bntCreateLabel, SIGNAL(clicked()), SLOT(on_bntCreateLabel_clicked()));

    update();
}
main.cpp
Код:
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Dialog w;
    w.show();

    return a.exec();
}
P.S. Кстати, скиньте код, как Вы дерево получаете.
8Observer8 вне форума Ответить с цитированием
Старый 07.12.2013, 15:00   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я думаю, можно и с проектом с дизайнером этот способ использовать. Хотя не знаю подойдёт ли он для большого дерева.
8Observer8 вне форума Ответить с цитированием
Старый 09.12.2013, 08:43   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Обязательно именно так выводить? Варианты
Код:
2
|
+-8
| |
| +-9
| | |
| | +-10
| |
| +-4
|   |
|   +-3
|   |
|   +-7
|
+-1
или рисовать графически - не подходят? Это по крайней мере решает проблему с помещением двух узлов в одно место (при рисовании графикой нужно будет расчитать все координаты, но зато потом рисовать все можно будет свободно).

Удаление уже выведенного - или хранить список лейблов в каком-нибудь векторе, или вообще засунуть весь текст в один многострочный лейбл и потом просто чистить текст.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очистка формы "текстовое поле" Стремящийся JavaScript, Ajax 8 12.05.2012 20:41
Удаление динамических объектов / полная очистка формы 095 Общие вопросы Delphi 3 23.04.2012 16:09
Пересоздание формы (очистка) mental Общие вопросы Delphi 2 24.06.2011 15:59
Очистка содержимого формы и замена новым. (((sheva))) Общие вопросы Delphi 2 12.05.2011 12:09
Очистка формы Радмир4855 Microsoft Office Excel 2 13.05.2010 16:08