c++ - 通过 id 访问 QML 槽中的嵌套对象(从 C++ 调用)

标签 c++ scope qml signals-slots qt-signals

我曾经有这样的窗口布局,其中有一个文本字段,更新了从 c++ 发出的数据:

Window{
   id: root
   function qmlSlot(a){
      _textField1.text=a;
   }
   TextField{
      id: _textField1
   }
}

绑定(bind)是这样的:

QQuickWindow *window=qobject_cast<QQuickWindow*>(topLevel);
QObject::connect(src,SIGNAL(someSignal(QVariant)),window,SLOT(qmlSlot(QVariant)));

现在我在主窗口中添加了更多的东西(选项卡),但它们不再直接工作了。

A:当我将 qmlSlot 留在 Window 范围内时,它看不到 _textField1:

Window{
   id: root
   function qmlSlot(a){
      _textField1.text=a;
   }
   TabView{
      Tab{
         TextField{
            id: _textField1
         }
      }
   }
}

这给了我:

qrc:/main.qml:32: ReferenceError: _textField1 is not defined

B:当我将插槽本身移动到 _textField1 的范围时,我不知道如何从 C++ 绑定(bind)到它:

Window{
   id: root
   TabView{
      Tab{
         function qmlSlot(a){
            _textField1.text=a;
         }
         TextField{
            id: _textField1
         }
      }
   }
}

导致:

QObject::connect: No such slot QQuickWindowQmlImpl_QML_21::qmlSlot(QVariant)

如何在访问嵌套项(在本例中为 _textField)时从 C++ 调用 qmlSlot?是否有可能使我在决定更改窗口布局时不必更改绑定(bind)代码?

最佳答案

你的问题是 Tab 实际上是一个 Loader ,因此这意味着您的 TextField 是按需在另一个上下文中创建的。当您的 Tab 未激活时,没有可访问的 TextField

您可以使用 tab.item 访问您的文本字段,但它仅在加载选项卡时有效。

但是你有一个更深层次的问题,从 C++ 访问 QML 对象是不好的做法,因为这意味着你的业务层必须知道你的 UI 层。如果您想重构您的 UI,那可不好。相反,您应该做的是从 QML 中的 C++ 中提取数据。更多解释在这里:Interacting with QML from C++ .

在你的例子中,我会创建一个带有属性或信号的 QObject 子类(它是你的对象的状态还是事件?)。

然后使用 setContextProperty 使您的对象实例之一可用于 QML 引擎。

在您的 QML 中,您只需执行(如果它是一个属性):

Window{
   id: root
   TabView{
       Tab{
           TextField{
               text: myCppObject.textProperty
            }
        }
    }
}

关于c++ - 通过 id 访问 QML 槽中的嵌套对象(从 C++ 调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51781510/

相关文章:

c++ - 学习 C++ 本身的资源,而不是编程基础知识?

c++ - 比较运算符

JavaScript 访问调用函数中声明的变量

ruby-on-rails-3 - 如何获取rails 3中所有数据库行的范围?

qt - 如何在 QML (Qt) 上将 SQLite BLOB 数据显示为图像?

c++ - 关于QuickFIX报文破解的问题

c++ - 现代 C++ : what is the best approach for function returning a status (ok/not ok) and an error (if status not ok)?

javascript - 无法在 $.post 回调中设置作用域变量

c++ - QML:如何从 C++ 代码正确地将属性传递给 PluginParameter 值?

javascript - 如何使用QML相机捕获用户定义尺寸的图像