Search code examples
blackberry-10blackberry-cascades

How to push QML page on button click in C++ code


I am developing one BB 10 app in which I have coded first page (with NavigationPane) in C++. Now I want to push another qml page in NavigationPane on button click. I have tried following code with no luck

QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
if (!qml->hasErrors()) {
    Page *page = qml->createRootObject<Page>();

    mRoot->push(page);

}

How can I achieve this?


Solution

  • Here is how can you push page using NavigationPane in C++:

    Source file:

    #include <bb/cascades/Application>
    #include <bb/cascades/Button>
    #include <bb/cascades/Label>
    #include <bb/cascades/ActionItem>
    #include <bb/cascades/Container>
    #include <bb/cascades/DockLayout>
    #include <bb/cascades/TitleBar>
    #include <bb/cascades/NavigationPaneProperties>
    #include "Sandoxproject.hpp"
    
    using namespace bb::cascades;
    
    SandboxApp::SandboxApp(bb::cascades::Application *app)
    : QObject(app)
    {
        _navPane.reset(NavigationPane::create());
        Page* firstPage = createFirstPage();
        _navPane ->push(firstPage);
        _secondPage.reset(createSecondPage());
        app->setScene(_navPane.data());
    }
    
    bb::cascades::Page* SandboxApp::createFirstPage() {
        Page* page = new Page();
        Container* content = new Container();
        TitleBar* titleBar = TitleBar::create().visibility(ChromeVisibility::Visible).title("First Page");
        page->setTitleBar(titleBar);
        content->setLayout(DockLayout::create());
        Button* button = Button::create().text("Go to another page").horizontal(HorizontalAlignment::Center).vertical(VerticalAlignment::Center);
        connect(button, SIGNAL(clicked()), this, SLOT(pushPage()));
        content->add(button);
        page->setContent(content);
        return page;
    }
    
    bb::cascades::Page* SandboxApp::createSecondPage() {
        Page* page = new Page();
        TitleBar* titleBar = TitleBar::create().visibility(ChromeVisibility::Visible).title("Second Page");
        page->setTitleBar(titleBar);
        ActionItem* backAction = ActionItem::create();
        connect(backAction, SIGNAL(triggered()), _navPane.data(), SLOT(pop()));
        page->setPaneProperties(NavigationPaneProperties::create().backButton(backAction));
        Container* content = new Container();
        content->setLayout(DockLayout::create());
        content->add(Label::create().text("This is the second page").horizontal(HorizontalAlignment::Center).vertical(VerticalAlignment::Center));
        page->setContent(content);
        return page;
    }
    
    void SandboxApp::pushPage() {
        qDebug("pushing another page...");
        _navPane->push(_secondPage.data());
    }
    

    Header file:

    #ifndef Sandoxproject_HPP_
    #define Sandoxproject_HPP_
    
    #include <bb/cascades/NavigationPane>
    #include <bb/cascades/Page>
    #include <QObject>
    
    namespace bb { namespace cascades { class Application; }}
    
    class SandboxApp : public QObject
    {
        Q_OBJECT
    public:
        SandboxApp(bb::cascades::Application *app);
        virtual ~SandboxApp() {}
    
    private slots:
         void pushPage();
    
    private:
        bb::cascades::Page* createFirstPage();
        bb::cascades::Page* createSecondPage();
    
        QScopedPointer<bb::cascades::NavigationPane> _navPane;
        QScopedPointer<bb::cascades::Page> _secondPage;
    
        Q_DISABLE_COPY(SandboxApp);
    };
    
    
    #endif /* Sandoxproject_HPP_ */