qml如何调试 (qml界面的样式设计)

qml定义槽方法,qml布局的比例设置

什么是组件

一个组件是一个可以重复使用的元素,QML提供几种不同的方法来创建组件。我今天将讲解其中的一种,即一个文件就是一个基础组件。一个以文件为基础的组件在文件中创建了一个QML元素,并且将文件以元素类型来命令(例如Button.qml)。你可以任何其它的QtQuick模块中使用元素一样来使用这个组件。

制作一个简单的按钮组件

在下面的例子中,我将创建一个包含文本和鼠标区域的矩形框。它就类似于一个简单的按钮。

Button.qml

import QtQuick 2.0

Rectangle {
    id: root
    property alias text: label.text
    signal clicked

    width: 116; height: 26
    color: "lightsteelblue"
    border.color: "slategray"

    Text {
        id: label
        anchors.centerIn: parent
        text: "Start"
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            root.clicked()
        }
    }
}

上面我们新建了一个Button.qml,我们使用QML的alias(别名)功能,它可以将内部嵌套的QML元素的属性导出到外面使用,但只有根级目录的属性才能够被其它文件的组件访问。我使用text属性来设置文本,然后通过鼠标区域实现我们自己的点击操作。

然后我们就可以在其它的文件中使用我们上面自定义的Button元素啦。使用示例:

main.qml

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    Button {
        id: button1
        x: 12; y: 12
        text: "test1"
        onClicked: {
            status.text = "This is test1!"
        }
    }

    Button {
        id: button2
        x: 162; y: 12
        text: "test2"
        onClicked: {
            status.text = "This is test2!"
        }
    }

    Button {
        id: button3
        x: 312; y: 12
        text: "test3"
        onClicked: {
            status.text = "This is test3!"
        }
    }

    Text {
        id: status
        x: 12; y: 76
        width: 116; height: 26
        text: "waiting..."
        horizontalAlignment: Text.AlignHCenter
    }
}

项目结果如下图所示:

qml定义槽方法,qml布局的比例设置

运行效果:

qml定义槽方法,qml布局的比例设置

自定义调色板

以Windows画图里面的调试板为例,其实就可以看成是由很多个小的按钮组成的,然后每个按钮有不同的背景色,点击某个按钮后,响应并调用一个函数,进行该按钮所代表的颜色的设置。

那么我们先来实现一个颜色按钮,基本和上面的自定义按钮差不多,

colorButton.qml

import QtQuick 2.0

Item {
    id: root
    property alias cellColor: rectangle.color
    signal clicked(color cellColor)

    width: 40; height: 25

    Rectangle {
        id: rectangle
        border.color: "white"
        anchors.fill: parent
    }

    MouseArea {
        anchors.fill: parent
        onClicked: root.clicked(root.cellColor)
    }
}

然后在 main.qml 使用这个自定义颜色按钮,然后使用了一个6行6列的栅格布局来布局这些按钮,就类似于Qt GUI中的QGridLayout。

main.qml

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    color: "lightGray"

    Text {
        id: testText
        text: "This is a test text!"
        y: 30
        anchors.horizontalCenter: parent
        font.pointSize: 24;
        font.bold: true
    }

    Grid {
        id: colorPalette
        x: 10; y: 100
        rows: 6; columns: 6; spacing: 3

        ColorButton { cellColor: "#FF0000"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF0033"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF0066"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF0099"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF00CC"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF00FF"; onClicked: testText.color = cellColor }

        ColorButton { cellColor: "#FF3300"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF3333"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF3366"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF3399"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF33CC"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF33FF"; onClicked: testText.color = cellColor }

        ColorButton { cellColor: "#FF6600"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF6633"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF6666"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF6699"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF66CC"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF66FF"; onClicked: testText.color = cellColor }

        ColorButton { cellColor: "#FF9900"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF9933"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF9966"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF9999"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF99CC"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FF99FF"; onClicked: testText.color = cellColor }

        ColorButton { cellColor: "#FFCC00"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFCC33"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFCC66"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFCC99"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFCCCC"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFCCFF"; onClicked: testText.color = cellColor }

        ColorButton { cellColor: "#FFFF00"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFFF33"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFFF66"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFFF99"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFFF99"; onClicked: testText.color = cellColor }
        ColorButton { cellColor: "#FFFFFF"; onClicked: testText.color = cellColor }
    }
}

运行效果如下:

qml定义槽方法,qml布局的比例设置