BlinCT
BlinCT25 липня 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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 22:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi01 листопада 2024 р. 00:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 18:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 17:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 21:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi25 червня 2024 р. 01:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах