与UI分离的QT/QML业务逻辑

与UI分离的QT/QML业务逻辑,qt,qml,qt-signals,Qt,Qml,Qt Signals,我试图将业务逻辑放在Main.qml中,将UI放在MainForm.UI.qml中,但我无法通过小部件id将两者连接起来 MainForm.ui.qml: import QtQuick 2.8 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.3 Page { id: page header: TabBar { ... } StackLayout { id: stack Pane {

我试图将业务逻辑放在
Main.qml
中,将UI放在
MainForm.UI.qml
中,但我无法通过小部件id将两者连接起来

MainForm.ui.qml:

import QtQuick 2.8
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

Page {
   id: page
   header: TabBar { ... }
   StackLayout {
      id: stack
      Pane {
         Flow {
            TextField {
               id: theText
            }
            property alias sendBtn: sendBtn
            Button {
               id: sendBtn
            }
         }
      }
   }
}
Main.qml:

import QtQuick 2.8
import QtQuick.Window 2.2

Window {
   visible: true
   width: 640
   height: 480
   title: qsTr("Hello World")
   MainForm {
      anchors.fill: parent
      sendBtn {
         onClicked: backend.sendTextToServer( theText.text )
      }
   }
}
Qt创建者说:
无效的属性名“sendBtn”(M16)

运行失败,出现以下消息:

QQmlApplicationEngine failed to load component
qrc:/Main.qml:12 Cannot assign to non-existent property "sendBtn"

当您将
属性别名sendBtn:sendBtn
放在窗格内时,会将其解释为窗格属性,因此您无法以这种方式访问它,将其放在页面上下文中是正确的

import QtQuick 2.8
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

Page {
   id: page
   property alias sendBtn: sendBtn
   property alias theText: theText
   header: TabBar { ... }
   StackLayout {
      id: stack
      Pane {
         Flow {
            TextField {
               id: theText
            }

            Button {
               id: sendBtn
            }
         }
      }
   }
}