QML两种启动方式及打开新窗口

前言

这是我的第一篇QML的笔记,记录一个最大的坑,每次修改了qml文件之后,重新清理一下,再编译,不然新的效果无法实现,误以为代码问题。qml程序启动有两种方式

1、QQmlApplicationEngine

1
2
3
4
5
6
7
8
9
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();

这种启动方式是必须qml顶层元素为window或者ApplicationWindow

2、QQuickView

1
2
3
4
5
6
7
8
9
10
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

QQuickView viwer;
viwer.setSource(QUrl("qrc:/RListView.qml"));
viwer.setVisible(true);
QQuickItem *rootItem = viwer.rootObject();

return app.exec();

这种启动方式,qml顶层可以是Item、Rectangle等,不需要是window。

启动一个新窗口

要打开一个新的QML窗口,那么新的窗口顶层元素必须是Window或者ApplicationWindow等,代码示例如下。

当前窗口main.qml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
window
{
id: inletSettingPanel
title: "主窗口"
minimumWidth: 270
minimumHeight: 660

Button
{
x: parent.x
y: parent.y
width: 30
height: 15
activeFocusOnTab: false
text: "打开新窗口"

//可在此类中设置需要显示的窗口的大小等属性
needShowWindow
{
id: needShowWindowPanel
}

onClicked:
{
needShowWindowPanel.show();
}
}
}

新窗口 needShowWindow.qml

1
2
3
4
5
Window {
id: inletSettingPanel
title: "新窗口"
minimumWidth: 270; minimumHeight: 660
}

当新窗口的背景设置为透明之后,拖动窗口时会在主窗口重合的地方显示重影,当设置新的窗口为FramelessWindowHint时这个问题就解决了。但是这种写法有一个弊端,那就是新的窗口的父窗口是原来的主窗口,当主窗口关闭的时候就会一起关闭新窗口。要是想创建一个独立的窗口就需要下面的方法。

方法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
window
{
id: inletSettingPanel
title: "主窗口"
minimumWidth: 270
minimumHeight: 660
property variant newWindow: needShowWindow
{
id: needShowWindowPanel
}
Button
{
x: parent.x
y: parent.y
width: 30
height: 15
activeFocusOnTab: false
text: "打开新窗口"

onClicked:
{
newWindow.show();
}
}
}

方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
window
{
id: inletSettingPanel
title: "主窗口"
minimumWidth: 270
minimumHeight: 660
property variant newWindow: Qt.createComponent("needShowWindow.qml").createObject()
Button
{
x: parent.x
y: parent.y
width: 30
height: 15
activeFocusOnTab: false
text: "打开新窗口"
onClicked:
{
newWindow.show();
}
}
}

通过这种方式创建的新窗口独立原来的窗口,当主窗口关闭时如果新窗口没有关闭,那么不会结束程序,需要继续关闭新窗口才行。


QML两种启动方式及打开新窗口
http://yoursite.com/2019/04/24/QML两种启动方式及打开新窗口/
作者
还在输入
发布于
2019年4月24日
许可协议