QML类似与JavaScript,可以用来编写Qt Quick组件和样式(简直就是html+css+js),不需要C++参与界面样式设置。在QT5中首次出现,是当前流行的QT GUI绘制方式。

1 QtQuick UI file

创建新文件,选择创建QtQuick UI文件,该文件值包含布局,不包含外面的窗体。在该文件设置好UI的样式和组件之后,可以作为一个完整的组件include到主窗体中:
image.png
主窗体的内容如下:

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. Window {
  4. visible: true
  5. width: 800
  6. height: 600
  7. title: qsTr("My Login From")
  8. LoginFrom{ /*loginFrom是一个单独的UI文件,这里被作为组件include进来*/
  9. anchors.fill: parent /*在主窗口中的边距锚点*/
  10. }
  11. }

LoginFrom UI文件后缀为ui.qml,表示这是一个QtQuick UI文件,里面的布局可以作为一个单独的组件被其他qml文件使用。LoginForm.ui.qml的内容截取如下:

  1. ectangle {
  2. id: window
  3. width: 800
  4. height: 600
  5. Image {
  6. id: background
  7. anchors.fill: parent
  8. source: "login_bg.png"
  9. }
  10. Text {
  11. id: dateTime
  12. color: "#ffffff"
  13. text: qsTr("Monday, 26-10-2015 3:14 PM")
  14. anchors.top: parent.top
  15. anchors.topMargin: 26
  16. anchors.left: parent.left
  17. anchors.leftMargin: 26
  18. font.pixelSize: 14
  19. }
  20. ...
  21. }

2 C++代码中控制样式

所有的QML对象类型都是源自QObject类型,因此,QML引擎可以使用Qt元对象系统动态的实例化QML对象,并获取所创建对象的属性与方法。也就是说一旦创建了QML对象,就可以使用C++获取它的属性、函数与信号处理。

假设存在一个名为MyItem.qml的文件,内容如下

  1. import QtQuick 2.12
  2. Item {
  3. width: 100; height: 100
  4. Image {
  5. id: background
  6. anchors.fill: parent
  7. source: "login_bg.png"
  8. }
  9. }

在C++中,QML文档可以使用 QQmlComponentQQuickView来加载。

  • 使用QQmlComponent 需要调用QQmlComponent::create()创建一个QObject 实例。并在使用完后delete。
  • 使用QQuickView会自动的创建一个QObject 实例,可以通过view.rootObject()来获取。

加载方法如下:

  1. // Using QQmlComponent
  2. QQmlEngine engine;
  3. QQmlComponent component(&engine, QUrl::fromLocalFile("MyItem.qml"));
  4. QObject* object = component.create();
  5. ...
  6. delete object;
  7. // Using QQuickView
  8. QQuickView view;
  9. view.setSource(QUrl::fromLocalFile("MyItem.qml"));
  10. view.show();
  11. QObject* object = view.rootObject();
  12. //获取QObect后,通过name获取qml对象,并设置属性
  13. QObject* img = object->findChild<QObject*>("background");
  14. if (img)
  15. img->setProperty("color", "red");