QML не может скрыть прямоугольник

#c #qml

#c #qml

Вопрос:

У меня есть окно, содержащее то, что я назвал Страницей — прямоугольник размером с главное окно:

 LoginWindow {
    id: loginWindow
}

SelectionWindow {
    id: selectionWindow
}

ServiceWindow {
    id: serviceWindow
}

ConfirmWindow {
    id: confirmWindow
}

IssueWindow {
    id: issueWindow
}
 

Каждое *Window здесь представляет собой элемент, наследуемый от Page.

Теперь я могу переходить между различными элементами страницы, настраивая их видимость. Одновременно может быть видна только одна страница. Последняя страница — IssueWindow, и оттуда я хочу вернуться к LoginWindow и выйти из системы пользователя.

Из C я выдаю сигнал Issue Finished, и в MainWindow у меня есть этот код:

     onIssueFinished: {
        // This line won't hide the Page
        issueWindow.visible = false;

        loginHandle.logout();
    }
 

Как отмечено в комментарии, элемент Страницы просто не будет скрываться, в то время как другие элементы изменят свою видимость. Я использую GammaRay, чтобы увидеть изменения, и все работает, просто скрытие issueWindow этого не делает. Кроме того, при печати issueWindow.visible для консоли это значение равно false.

Комментарии:

1. Почему бы вам не использовать a Loader ?

2. @user2436719: загрузчик уничтожит экземпляры. Однако может оказаться необходимым сохранить экземпляры из-за отсутствия представления без состояния или наличия сложных представлений, для восстановления которых потребуется много времени. Если у вас достаточно памяти под рукой, это дает более реактивное ощущение, если вам не нужно ждать, чтобы повторно настроить страницу каждый раз, когда вы переключаетесь.

Ответ №1:

Используйте непрозрачность вместо видимости и привяжите один метод к изменению непрозрачности, который обрабатывает включенное и отключенное состояние, например.

 onIssueFinished: {
        // This line won't hide the Page
        issueWindow.opacity = 0.0;

        loginHandle.logout();
    }

IssueWindow {
    id: issueWindow

    onOpacityChanged: {
        enabled = ( opacity === 1.0)
    }
}
 

Вам необходимо реализовать изменение непрозрачности во всех окнах.
И установите непрозрачность для всех остальных окон.

Или вы можете использовать stack view или swipe view .

Комментарии:

1. Спасибо за ответ, хотя это не решило проблему. В чем преимущество использования непрозрачности по сравнению с видимым?

Ответ №2:

Выяснилось, что проблема заключалась в неправильном порядке переключения видимости и запуска сигналов и реагирования на них.

Ответ №3:

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

 visible: (selected == thisPageIdentifier)
 

При этом вы убедитесь, что видна только страница с соответствующим идентификатором страницы, и вам не нужно использовать несколько сигналов для отображения и скрытия.
Когда новая страница станет видимой, просто установите selected для свойства соответствующий идентификатор (int или string или что-либо еще), и другие страницы станут невидимыми.
Это должно повысить масштабируемость, поскольку у вас нет новых сигналов для обработки на всех других страницах, если вы решите добавить новую страницу один раз. Вам нужно только убедиться, что идентификатор уникален.

Ваш пример кода адаптирован к этому:

 Item {
    property int selection: 0
    LoginWindow {
        id: loginWindow
        visible: (selection === 0)
    }

    SelectionWindow {
        id: selectionWindow
        visible: (selection === 1)
    }

    ServiceWindow {
        id: serviceWindow
        visible: (selection === 2)
    }

    ConfirmWindow {
        id: confirmWindow
        visible: (selection === 3)
    }

    IssueWindow {
        id: issueWindow
        visible: (selection === 4)
    }
}