25 июля 2019 г. 13:07

Реализация алгоритма для поиска обьекта

Qt

Всем привет.
Я не силен в алгаритмах, но вот тут возникла проблемка, надо код который работает но с ошибками (да еще и с go to) переделать на нормальный человеческий вид.
Его принцип такой что надо ходить в цикле по обьектам пока не найдем тот который нужно. Движение в направлениях только вверх и вниз.
Ниже привожу кусок кода что является тем который работает но требует как в песне перемен.

QQuickItem * Stack::find(StackItem item, Stack::Direction direction)
{
    QQuickItem *res = nullptr;
    QQuickItem *itemPage = item.page;
    QQuickItem *itemFocus = item.focus;
    QList<QQuickItem *> list; // siblings
    QQuickItem *itemPrev;
    QQuickItem *itemNext; // parent, next    int i;



int i = -1;

    if(itemFocus)
        itemPrev = qobject_cast<QQuickItem *>(itemFocus->parent());
    else
        itemPrev = itemPage;

    if(!itemPrev)
        return nullptr;
    list = childrenOf(itemPrev);

    if(itemFocus)
        i = list.indexOf(itemFocus);


try_another:
    if(direction == Direction::Up && list.length() > i+1)
        i++;
    else if(direction == Direction::Down && i > 0)
        i--;
    else
    {
        itemNext = itemPrev;
        itemPrev = qobject_cast<QQuickItem *>(qobject_cast<QQuickItem *>(itemPrev)->parent());

        if(itemPrev)
        {
            if(itemNext == itemPage)
                return nullptr;

            list = childrenOf(itemPrev);
            i = list.indexOf(itemNext);

            goto try_another;
        }
        else
            return nullptr;
    }

deeper:
    if(i < 0 || i > (list.length()-1))
    {
        qDebug() << "fuck invalid index, parent" << itemPrev << i;
        return nullptr;
    }

    itemNext = list[i];

    if(itemNext->isVisible() && itemNext->isEnabled())
    {
        if(isEnabledOn(itemNext))
        {
            res = itemNext;
            goto result;
        }
        else
        {
            if(childrenOf(itemNext).count())
            {
                if(direction == Direction::Down)
                    i = 0;
                else
                    i = childrenOf(itemNext).count()-1;

                itemPrev = itemNext;
                list = childrenOf(itemPrev);

                goto deeper;
            }
            goto try_another;
        }
    }
    else
        goto try_another;
result:
    return res;
}

А вот так выглядит часть начатой реализации в которой как раз есть нужные циклы за счет которых будет происходить поиск. То есть то что выше в коде надо в правильном порядке чтоли перетащить сюда.

QQuickItem *res = nullptr;
    QQuickItem *itemPage = item.page;
    QQuickItem *itemFocus = item.focus;
    QList<QQuickItem *> list; // siblings
    QQuickItem *itemPrev;
    QQuickItem *itemNext; // parent, next    int i;


    int i = -1;

    if(itemFocus)
        itemPrev = itemFocus->parentItem();
    else
        itemPrev = itemPage;

    if(!itemPrev)
        return nullptr;
    list = childrenOf(itemPrev);

    if(itemFocus)
        i = list.indexOf(itemFocus);

    list = childrenOf(itemFocus->parentItem());

    bool found = false;

    while (!found) // TODO: if not found
    {
        if(direction == Direction::Down)
        {
            // TODO: если индекс карента не последний
            while () // TODO: if last
            {
                // visible and enabled
            }
        }
        else if(direction == Direction::Up)
        {
            while () // TODO: if first
            {
                // visible and enabled
            }
        }
    }

    return res;

Так же я думаю важным отличием от кода с go to и на что надо переписать так это несколько переменных что будут помогать в поиске. first, last, direction, childre(yes, no)
И прикрепляю файлик с самим алгаритмом. В нем расмотренны все варианты. И само представленеи обьектов по которым происходит поиск.
Дерево
Алгоритм

Надеюсь кто то сможет с этим помочь.
Спасибо.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

AS
13 декабря 2019 г. 6:05
Aruzhan Seraliyeva

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
AS
13 декабря 2019 г. 5:47
Aruzhan Seraliyeva

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
Т
11 декабря 2019 г. 16:56
Тома

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
9 декабря 2019 г. 3:41
Евгений Легоцкой

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
НБ
9 декабря 2019 г. 3:36
Николай Батманов

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
9 декабря 2019 г. 3:14
Евгений Легоцкой

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
НБ
9 декабря 2019 г. 3:05
Николай Батманов

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
8 декабря 2019 г. 7:23
Евгений Легоцкой

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Сейчас обсуждают на форуме
t
13 декабря 2019 г. 17:17
tantrido

Всё работает, при чём тут колхоз?! ;) https://doc.qt.io/qt-5/qtqml-cppintegration-data.html Если что-то не работает - вопрос к собственным рукам и знаниям. Вопрос не корректен - мож…
13 декабря 2019 г. 10:16
Руслан Волшебник

Да, я посмотрел, вы абсолютно правы. Единственное, если я правильно понял, если срабатывает условие if (aggregates["max_id"] - aggregates["min_id"]) + 1 == aggregates["count"]: return sel…
t
13 декабря 2019 г. 9:53
tantrido

Ответ >>
13 декабря 2019 г. 8:39
Александр Панюшкин

Вроде да. Только там начинаются вопросы с тем, чтобы виджет бы в фокусе, чтобы до виджета это событие долетало.
ДК
13 декабря 2019 г. 7:48
Джон Кофи

Привет. Есть класс "ждун", который используется на разных виджетах: class WaiterDialog;#define WAITER_DIALOG Singleton<WaiterDialog>::instance()class WaiterDialog : public QObject, …
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB