在QML编程中,我们知道通过注册C++文件来向qml发送信号进行交互,其实Qml也可以通过注册QML文件,使用qml文件中的信号进行多页面信息交互,下面是简单的示例:
//main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
import QmlEvents 1.0
Window {
id: mainWindow
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Loader {
id: loadWindow
anchors.top: parent.top
anchors.topMargin: 100
anchors.right: parent.right
anchors.rightMargin: 50
onLoaded: {
console.log("SubWinidow.qml============onLoaded============")
}
}
Rectangle {
width: 400
height: 50
anchors.top: parent.top
anchors.topMargin: 20
anchors.left: parent.left
anchors.leftMargin: 50
Row {
spacing: 5
anchors.fill: parent
Button {
text: qsTr("Show SubWindow")
onClicked: {
console.log("=============================load SubWindow====")
var subParams = {
"strText": qsTr("SubWindow"),
"strColor": "red"
}
loadWindow.setSource("qrc:/SubWindow.qml", subParams)
loadWindow.item.show()
}
}
Button {
text: qsTr("发Json数据")
onClicked: {
console.log("==========================发Json数据===")
var jsonParam = {
"title": "标题",
"length": 12
}
QmlEvents.sendTitleParam(jsonParam)
}
}
Button {
text: qsTr("发String")
onClicked: {
console.log("=============================发String")
var strTxt = qsTr("普通字符串")
QmlEvents.showName(strTxt)
}
}
}
}
//显示文字
Text {
id: strText
text: qsTr("text")
anchors.centerIn: parent
color: "green"
font.pixelSize: 16
}
Connections{
target: QmlEvents
onSendTitleParam: {
console.log("main.qml=====onSendTitleParam======================:" + JSON.stringify(jsonParam))
}
onShowName: {
console.log("main.qml=====onShowName======================:" + strName)
}
}
}
//SubWindow.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QmlEvents 1.0
Window {
visible: true
id: windowView
width: 200
height: 200
//modality: Qt.WindowModal
//flags: Qt.FramelessWindowHint
color: "blue"
property string strText: ""
property string strColor: ""
Rectangle {
anchors.centerIn: parent
Text {
id: name
anchors.fill: parent
text: strText
color: strColor
}
}
MouseArea{//关闭按钮
id: closeBtn
z: 1
width: 16
height: 16
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
anchors.right: parent.right
anchors.rightMargin: 10
anchors.top: parent.top
anchors.topMargin: 6
Text {
font.pixelSize: 18
font.bold: true
color: parent.containsMouse ? "red" : "#000000"
text: qsTr("×")
}
onClicked: {
windowView.close();
}
}
Connections{
target: QmlEvents
onSendTitleParam: {
console.log("SubWindow.qml=====onSendTitleParam======================:" + JSON.stringify(jsonParam))
}
onShowName: {
console.log("SubWindow.qml======onShowName======================:" + strName)
}
}
}
//QmlEvent.qml
pragma Singleton
import QtQuick 2.12
QtObject {
//发送标题参数可以是json格式
signal sendTitleParam(var jsonParam)
//显示名字
signal showName(var strName)
}
//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
Q_INIT_RESOURCE(qml);
qmlRegisterSingletonType(QUrl("qrc:/QmlEvent.qml"), "QmlEvents", 1, 0, "QmlEvents"); //qml文件单列注册,然后其他qml文件使用注册过的qml单列
QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}