前言
这是我的第一篇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(); } } }
|
通过这种方式创建的新窗口独立原来的窗口,当主窗口关闭时如果新窗口没有关闭,那么不会结束程序,需要继续关闭新窗口才行。