今天来实现这样一个效果:进入注册页面时,文本输入框自动获取焦点并弹出输入法键盘。顺便吐槽一下,这个功能本身来说是很容易实现的,但是由于BB10资料太少,官方文档也没啥描述,折腾了不少时间才搞定,现在把它分享出来。其实主要是调用TextField的requestFocus()
函数就可以了,不过需要注意的是:需要在UI初始化完成后延时一些时间调用才行,不然是没有任何效果的。
1. 这里使用QTimer来实现定时器,首先创建一个BB10 Cascades空项目BB10UI,在BB10UI.cpp的构造函数中注册QTimer,以便在qml中使用该对象,看源码:

BB10UI::BB10UI(bb::cascades::Application *app)
: QObject(app)
{
    qmlRegisterType<QTimer>("bb.alexzhou", 1, 0, "QTimer");
    // create scene document from main.qml asset
    // set parent to created document to ensure it exists for the whole application lifetime
    QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);

    // create root object for the UI
    AbstractPane *root = qml->createRootObject<AbstractPane>();
    // set created root object as a scene

    app->setScene(root);
}

注意:在加载main.qml前注册QTimer,否则会提示 module “bb.alexzhou” is not installed

2. 现在需要完成main.qml中的代码,先看源码:

import bb.cascades 1.0
import bb.alexzhou 1.0

// creates one page with a label

Page {
    function onTimeOut() {
        console.debug("onTimeout")
        textField.requestFocus()
    }
    Container {
        layout: StackLayout {
        }
        leftPadding: 30
        rightPadding: 30
        Label {
            text: qsTr("Hello World")
            textStyle.base: SystemDefaults.TextStyles.BigText
            horizontalAlignment: HorizontalAlignment.Center
        }
        TextField {
            id: textField
            inputMode: TextFieldInputMode.PhoneNumber
        }
    }
    attachedObjects: [
        QTimer {
            id: myTimer
            interval: 20
            // only once
            singleShot: true
        }
    ]

    //UI is initialized
    onCreationCompleted: {
        myTimer.timeout.connect(onTimeOut)
        myTimer.start()
    }
}

把QTimer作为整个UIObject的附加对象,在需要的时候进行调用。当UI初始化完成后启动定时器,定时器在指定时间后执行跟timeout绑定的函数onTimeOut,而textField.requestFocus()就写在onTimeOut函数中,这样就可以实现想要的效果了(如果把textField.requestFocus()写到onCreationCompleted中是没有任何效果的),如图:

BlackBerry10 学习Signals和Slots

在Cascades框架中,使用Signals(信号)和slots(信号槽)机制来实现对象间通讯,如类A中封装了登录的相关操作,有一个signal为loginResult(bool result)函数,你...

阅读全文

BlackBerry10 Cascades应用生命周期

Cascades框架可以让我们在BlackBerry应用平台上创建UI组件变得更容易和更快速,它基于QT4.8,QT4.8是用c++开发的应用框架。 所有的Cascades应用都有类似的生...

阅读全文

BlackBerry10 让Cascades应用运行到手机上

上一篇博客我们实现了一个简单的Cascades Demo,并成功运行到模拟器中,但是在模拟器上运行还是有点不爽,今天要把他跑在手机上。BB10程序安装到真机调试还是...

阅读全文

欢迎留言