BlinCT
BlinCT25. Juli 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

0

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 15:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 14:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 18:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr9. Februar 2024 02:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 10:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 22:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 16:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 11:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken