如何解决为什么动态组件创建中的属性绑定不起作用?
信号 'clearPinFromDevManager(const QString& pinn)' 将从 cpp 文件中重复发出。在ClearPinFromDevManager:{} 上捕获的信号,所以cpp 和main.qml 文件中的所有内容都正常,但“recvClearPin”未绑定到动态创建的PasswordWindow.qml 组件。
Main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import Terminal 1.0
import QtQuick.Controls 2.12
applicationwindow {
id: rootId
visible: true
objectName: "window"
width: Screen.width
height: Screen.height
flags: Qt.FramelessWindowHint
property var component
property var object
property string recvClearPin:""
Rectangle {
id:rootRectId
width: rootId.width
height: rootId.height - headerId.height
color: "#000033"
}
Terminal {
id: terminalId
onSignalToInitTerminal:{
console.log("show Password window.")
component= Qt.createComponent("Ui/PasswordWindow.qml");
object=component.createObject(rootRectId,{clearPin: recvClearPin});
}
//signal will emit repeatedly
onClearPinFromDevManager:{
console.log("signal emited here and pinn is:",pinn)
recvClearPin=pinn
}
}
}
密码窗口.qml
import QtQuick 2.12
import QtQuick.Controls 2.12
import "../DeFinitions.js" as DeFinitions
Item {
id:passwordWindowId
width: parent.width
property string password: ""
property alias clearPin: textEditId.text
Text {
id: passwordWindowTextId
font.family: DeFinitions.LABEL_FONT_FAMILY; font.pointSize: DeFinitions.LABEL_POINT_SIZE
text: qsTr("لطفا رمز خود را وارد نمایید")
color: DeFinitions.LABEL_COLOR
y: DeFinitions.PAGE_TITLE_Y_POS
x: DeFinitions.PAGE_TITLE_X_POS
}
Rectangle {
id: textEditRectId
x: passwordWindowTextId.x +10
y: passwordWindowTextId.y + height
width: DeFinitions.TEXT_EDIT_WIDTH
height: DeFinitions.TEXT_EDIT_HEIGHT
border.width: 1
border.color: "#000000"
radius: 10
color: DeFinitions.GENERAL_COLOR
TextEdit {
id: textEditId
width: parent.width
height: parent.height
text: ""
font.family: DeFinitions.GENERAL_FONT_FAMILY; font.pointSize: DeFinitions.GENERAL_POINT_SIZE
color: "blue"
focus: true
verticalAlignment: TextEdit.AlignVCenter
horizontalAlignment: TextEdit.AlignHCenter
onTextChanged: {
console.log("texttttttttttttttttt:",text);
}
}
}
}
解决方法
请提供信号 clearPinFromDevManager(const QString& pinn) 连接的更多信息。
对于动态对象,您应该使用 QML 中的连接语法和 cpp-objects。
您需要在 QML 中注册包含 clearPinFromDevManager(const QString& pinn) 的类,然后将其连接到动态创建的对象,或在 onComleted-handler 中,如下所示:
-
在 CPP/H 中声明您的课程:
class CrearPinObject : public QObject { Q_OBJECT signals: void clearPinFromDevManager(const QString& pinn); }
-
注册 QML 引擎 main.cpp(或类似):
... QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("CrearPinObjectView",new CrearPinObject); ...
-
使用 QML 连接语法(PasswordWindow.qml)连接信号:
Item { Component.onCompleted: { // CrearPinObjectView-object forward automatically CrearPinObjectView.clearPinFromDevManager.connect(clearPinFromDevManager); } function clearPinFromDevManager(pinn) { console.log(pinn); } }
希望有所帮助!
,您没有绑定此行中的 clearPin
:object=component.createObject(rootRectId,{clearPin: recvClearPin});
。相反,您使用名为“clearPin”的项目创建一个 Json 对象,该项目的当前值为“recvClearPin”。如果您需要绑定,请使用 Qt.binding
:
object=component.createObject(rootRectId,{clearPin: Qt.binding(function() { return recvClearPing} )});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。