Как закрыть лист в qml?

Я хочу показать заставку, когда пользователь нажимает на значок приложения. Для этого я создал Лист и прикрепил его к странице. main.qml

import bb.cascades 1.0

Page {
    Container {
        Label {
            text: "Home page"
            verticalAlignment: VerticalAlignment.Center
            horizontalAlignment: HorizontalAlignment.Center
        }
    }
    attachedObjects: [
        Sheet {
            id: mySheet
            content: Page {
                Label {
                    text: "Splash Page / Sheet."
                }
            }
        }
    ]//end of attached objects
    onCreationCompleted: {

        //open the sheet
        mySheet.open();

        //After that doing some task here.
       ---------
       ---------
       ---------

       //Now I'm closing the Sheet. But the Sheet was not closed.
       //It is showing the Sheet/Splash Page only, not the Home Page
       mySheet.close();
    }
}//end of page

После завершения работы я хочу закрыть Лист. Поэтому я вызвал метод close(). Но лист не был закрыт.

Как закрыть лист в методе oncreationCompleted() или из любого метода С++?


person user2636874    schedule 06.08.2013    source источник
comment
Вы пытались разместить журнал до/после mySheet.close();, просто чтобы убедиться, что вы его достигли?   -  person Marc Plano-Lesay    schedule 06.08.2013
comment
да, я проверял это, и он также печатает сообщение журнала.   -  person user2636874    schedule 06.08.2013
comment
Сколько времени занимает ваша задача? Возможно, лист еще не полностью открыт (анимация может быть не закончена), когда вы пытаетесь его закрыть.   -  person Marc Plano-Lesay    schedule 06.08.2013
comment
Я новичок в каскадных структурах и С++. На данный момент я не выполняю никаких задач после открытия листа. Просто открывая лист и закрывая лист. Теперь я пытаюсь закрыть лист после его открытия. Я успешно открываю лист, но не могу его закрыть. Не могли бы вы предложить мне, как закрыть лист либо из qml, либо из функции C++.   -  person user2636874    schedule 06.08.2013
comment
Я думаю, это ваша проблема, тогда. Думаю, вам придется подождать opened() (developer.blackberry.com /cascades/reference/) сигнал, который будет испущен, прежде чем он сможет закрыть ваш Sheet.   -  person Marc Plano-Lesay    schedule 06.08.2013
comment
Итак, как я должен отслеживать, открыт ли лист или нет?   -  person user2636874    schedule 06.08.2013
comment
Эй, я успешно закрыл лист. Я переопределил метод onOpened(). В этом я вызвал метод sheet.close(). Спасибо за совет.   -  person user2636874    schedule 06.08.2013
comment
Верно. Затем вам нужно будет проверить здесь, завершена ли ваша задача, и когда ваша задача будет завершена, проверьте, открыт ли Sheet, чтобы охватить оба случая (задача завершается до открытия Sheet или после).   -  person Marc Plano-Lesay    schedule 06.08.2013


Ответы (1)


Вы пытаетесь закрыть Sheet до того, как его открытие будет завершено (анимация все еще работает), поэтому запрос на закрытие игнорируется им. Вы должны следить за окончанием анимации (сигнал opened()) чтобы узнать, открыт ли ваш Sheet. Я бы сделал что-то вроде этого:

import bb.cascades 1.0

Page {
    Container {
        Label {
            text: "Home page"
            verticalAlignment: VerticalAlignment.Center
            horizontalAlignment: HorizontalAlignment.Center
        }
    }
    attachedObjects: [
        Sheet {
            id: mySheet
            property finished bool: false
            content: Page {
                Label {
                    text: "Splash Page / Sheet."
                }
            }
            // We request a close if the task is finished once the opening is complete
            onOpened: {
                if (finished) {
                    close();
                }
            }
        }
    ]//end of attached objects
    onCreationCompleted: {

        //open the sheet
        mySheet.open();

        //After that doing some task here.
       ---------
       ---------
       ---------

       //Now I'm closing the Sheet. But the Sheet was not closed.
       //It is showing the Sheet/Splash Page only, not the Home Page
       mySheet.finished = true;
       // If the Sheet is opened, we close it
       if (mySheet.opened) {
           mySheet.close();
       }
    }
}//end of page
person Marc Plano-Lesay    schedule 06.08.2013
comment
Будьте осторожны, для некоторых ОС этот сигнал не отправляется. Мне пришлось использовать QTimer и проверить статус isOpened(), чтобы закрыть его вручную. - person Benoit; 06.08.2013
comment
Вместо того, чтобы закрывать лист непосредственно в методе onOpened(), я попытался, как вы упомянули в коде. Тогда лист не закрывается. - person user2636874; 07.08.2013
comment
Добавьте console.log(onOpened); чтобы убедиться, что этот слот называется - person Benoit; 07.08.2013