从插槽黑莓 10 获取 TextField->text()

Get TextField->text() from slot Blackberry 10

本文关键字:gt text TextField- 插槽 获取      更新时间:2023-10-16

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

提前谢谢你。

这是代码:

主.qml

TextField {
        objectName: "anagram"
        hintText: "Enter anagram to search"
        verticalAlignment: VerticalAlignment.Center
        horizontalAlignment: HorizontalAlignment.Center
        input {
            submitKey: SubmitKey.Done
        }            
}

应用.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();
    ...

简介

调用槽onSearch时,您实际上是在创建一个与实际发出信号的 UI 无关的附加 UI。

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

<小时 />

溶液

你将需要使用与当前 UI(用户已向其输入数据)关联的root,而不是创建新 UI。

假设您已将root声明为 ApplicationUI 的数据成员,下面的操作将执行您所期望(和想要)的操作。

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

替代解决方案

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

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