从插槽Blackberry 10中获取TextField-> text()

时间:2015-03-17 05:27:57

标签: c++ blackberry qml blackberry-10

我是Blackberry 10开发的完全初学者。我正在开发一个应该从文本框中获取用户输入的应用程序,并搜索文本文件中是否出现该单词。我使用ActionItem的triggered()信号来调用搜索。但是,当我尝试从插槽中获取用户输入时,它总是返回一个空字符串''。我做错了什么。

提前谢谢。

以下是代码:

main.qml

TextField {
        objectName: "anagram"
        hintText: "Enter anagram to search"
        verticalAlignment: VerticalAlignment.Center
        horizontalAlignment: HorizontalAlignment.Center

        input {
            submitKey: SubmitKey.Done

        }            
}

application.cpp

ActionItem *main = root->findChild<ActionItem*>("search");
bool res1 = QObject::connect(main, SIGNAL(triggered()), this, SLOT(onSearch()));


void ApplicationUI::onSearch()
{
    qDebug() << "slot activated";
    QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this);
    AbstractPane *root = qml->createRootObject<AbstractPane>();
    Application::instance()->setScene(root);
    TextField* query = root->findChild<TextField*>("anagram");
    //THE STRING BELOW ALWAYS RETURNS ''
    QString search = query->text();
    ...

1 个答案:

答案 0 :(得分:1)

简介

当调用插槽onSearch时,您实际上正在创建一个额外的UI,与实际发出信号的UI无关。

由于anagram text 属性没有默认设置,因此您得出的结论是正确的;它将始终产生一个空字符串,因为该字段将始终是新创建的。


解决方案

您需要使用与当前用户界面相关联的root(用户输入数据),而不是创建新的。{/ p>

假设您已将root声明为 ApplicationUI 的数据成员,则以下内容将按照您的预期(并希望)执行。

void ApplicationUI::onSearch()
{
    qDebug() << "slot activated";
    TextField* query = root->findChild<TextField*>("anagram");
    QString search = query->text();
    // ... 
}

替代解决方案

您还可以通过调用root返回的指针scene()上的AbstractPane来访问当前加载的场景(相当于代码段中的Application::instance ()):< / p>

AbstractPane *   current_scene = Application::instance ()->scene ();
QString search = current_scene->findChild<TextField*> ("anagram")->text ();